前天在Oracle生产环境中,自己的存储过程运行时间超过1小时,怀疑是其他job运行时间过长推迟了自己job运行时间,遂重新跑job,发现同测试环境的确不同,运行了25分钟。

之后准备在测试环境中制造同数量级的数据进行分析,写了大概如下的存储过程,

  1. create or replace PROCEDURE PERFORMANCE_TEST AS
  2.  
  3. v_date date;
  4. v_start_date date;
  5. v_end_date date;
  6. v_start_date_str varchar2(10) := '2017-01-31';
  7. v_end_date_str varchar2(10) := '2017-07-31';
  8. v_date_str varchar2(10);
  9.  
  10. BEGIN
  11. v_start_date := to_date(v_start_date_str, 'yyyy-mm-dd');
  12. v_end_date := to_date(v_end_date_str, 'yyyy-mm-dd');
  13. v_date := v_start_date;
  14. while v_date < v_end_date loop
  15. v_date_str := to_char(v_date, 'yyyy-mm-dd');
  16. insert into datacore.df_customer_static_report
  17. (
  18. data_date,
  19. cty_code,
  20. party_id,
  21. party_name,
  22. ho_domicile_cty,
  23. rm_code,
  24. rm_name,
  25. business_division
  26. )(
  27. select
  28. v_date_str,
  29. cty_code,
  30. party_id,
  31. party_name,
  32. ho_domicile_cty,
  33. rm_code,
  34. rm_name,
  35. business_division
  36. from datacore.df_customer_static_report
  37. where data_date = v_end_date_str
  38. );
  39. commit;
  40. end loop;
  41.  
  42. END PERFORMANCE_TEST;

犯了个致命错误,丢了v_date := v_date + 1; 存储过程陷入无限循环!在过了1个多小时后,意识到不对劲,遂查询了数据量,发现2017-01-31的数据量竟然达到了千万级。。。赶紧停止运行找原因,才发现无限循环插入数据。

剩下就是怎么删掉这些数据,毕竟千万级的数据占据存储空间太大了。简单的删除肯定不起作用,遂尝试分批删除,先试着删除1w条,结果运行很长时间后还是没有结束。这个时候,感觉之前那个无限循环应该还没有结束,在后台还在运行。因为其他事情捣乱,没来得及修正这个问题。第二天来,再次查询,发现数据量达到了快5千万条,欲哭无泪啊!赶紧删数据,分批次,1百万条的删,(这次加上累加条件了)

  1. create or replace PROCEDURE DELETE_TEMP AS
  2.  
  3. v_number number := 1;
  4. v_number_end number := 50;
  5.  
  6. BEGIN
  7.  
  8. while v_number <= v_number_end loop
  9. delete from datacore.df_customer_static_report nologging
  10. where data_date = '2017-01-31'
  11. and rownum < 1000000;
  12. commit;
  13. v_number := v_number + 1;
  14. dbms_output.put_line(v_number || ' end');
  15. end loop;
  16.  
  17. END DELETE_TEMP;

本想用TRUNCATE把所有数据都删掉,但是我这里只需要删掉表中‘2017-01-31’的数据,而且只是把千万条降低到万条。查了delete语句的优化,发现加上nologging会更快些(数据不做恢复)。

运行了大概1个小时后,感觉差不多了,遂手动终止了delete的运行。再次查询,‘2017-01-31’的数据降到9千多条。窃喜~

不过又想起昨天想到的“是否无限循环还在后台运行”?过了10几分钟后查询,发现数据又多了,欲哭无泪。。

怎么让这个讨厌的无限循环终止呢?因为使用的账号没有dba权限,所以想通过更改表的结构,让包含无限循环的存储过程异常终止。但估计不可行,因为数据库表一直被占用了。抱着试一试的想法,执行以下sql,

  1. alter table datacore.df_customer_static_report
  2. drop column rds_spread_code

报错“资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效;resource busy and acquire with NOWAIT specified”。

搜索后,果真有解决方案 - here,但还是需要dba权限(厚脸皮要吧)。

1. 用dba权限的用户查看数据库都有哪些锁

  1. SELECT T2.USERNAME,T2.SID,T2.SERIAL#,T2.LOGON_TIME
  2. FROM V$LOCKED_OBJECT T1,V$SESSION T2
  3. WHERE T1.SESSION_ID=T2.SID ORDER BY T2.LOGON_TIME;

2. 根据sid查看具体的sql语句,如果sql不重要,可以kill

  1. SELECT SQL_TEXT FROM V$SESSION A,V$SQLTEXT_WITH_NEWLINES B
  2. WHERE DECODE(A.SQL_HASH_VALUE, 0, PREV_HASH_VALUE, SQL_HASH_VALUE)=B.HASH_VALUE
  3. AND A.SID=&SID ORDER BY PIECE;

3. kill该事务

  1. ALTER SYSTEM KILL SESSION '590,20839';

4. 再次查看数据库锁,发现锁消失。再次查询表数据,不再增加。

教训:以后写存储过程中的循环,千万注意条件的累加!

--------------------------------------------------------------------------------------------------------------------------------

-- index(索引)
select * from all_indexes;
select * from user_indexes;

select * from all_ind_columns;
select * from user_ind_columns;

select t.*,i.index_type
from user_ind_columns t,user_indexes i
where t.index_name = i.index_name
and t.table_name = i.table_name and t.table_name = 'DM_RR_GQ_FIN_FEDS';

select t.*,i.index_type
from all_ind_columns t,all_indexes i
where t.index_name = i.index_name
and t.table_name = i.table_name
and owner = 'FISP'
and t.table_name = 'FIS_OUT_FLEXI';

-- tables(表)
select * from user_tab_columns;
select * from all_tab_columns;

select * from user_col_comments;
select * from all_col_comments;

select * from user_tables;
select * from all_tables;

记一次Oracle数据故障排除过程的更多相关文章

  1. 记一次wiki数据爬取过程

    最近有个爬取各国领导人信息的奇怪需求,要求百度和维基两种版本的数据,最要命的还要保持数据的结构不变.正好印象中隐约记得维基有专门的领导人列表页,不考虑爬取下来的格式不变的话应该很好爬的样子. 首先思路 ...

  2. 对NetBackup 问题进行故障排除的步骤

    错误消息通常是指出哪里出现故障的手段.如果在界面上没有看到错误消息,但仍怀疑有问题,请检查报告和日志. NetBackup提供了各种报告和日志记录工具, 这些工具可提供错误消息,直接为您指出解决方案. ...

  3. spark 性能优化 数据倾斜 故障排除

    版本:V2.0 第一章       Spark 性能调优 1.1      常规性能调优 1.1.1   常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围 ...

  4. Atitit.故障排除系列---php 计划网站数据库错误排除过程

    Atitit.故障排除系列---php 计划网站数据库错误排除过程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能 ...

  5. Confluence 6 数据中心的 SAML 单点登录最佳实践和故障排除

    最佳实践 SAML 授权仅仅在有限的时间进行校验.你需要确定运行你的应用的计算机时间与 IdP 的时间是同步的. 如果你应用中的用户和用户组是通过用户目录进行配置的,你通常希望用户来源目录和你的 Id ...

  6. 记一次oracle 11g数据导入

    1.ORACLE数据库数据导入到测试库环境 172.15.1.51 root  kic@test 172.15.1.52 root 一般先将数据导入52的环境(配置比较低),再将数据导入51的环境(本 ...

  7. 理解 OpenStack + Ceph (7): Ceph 的基本操作和常见故障排除方法

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  8. ORA-4031 错误故障排除与诊断[视频] (Doc ID 2016002.1)

    Copyright (c) 2019, Oracle. All rights reserved. Oracle Confidential.     ORA-4031 错误故障排除与诊断[视频] (Do ...

  9. 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除

    目录 学习笔记:CentOS7学习之十八:Linux系统启动原理及故障排除 18.1 centos6系统启动过程及相关配置文件 18.1.1 centos6系统启动过程 18.1.2 centos6启 ...

随机推荐

  1. BZOJ 3384 上帝与集合的正确用法

    上帝与集合的正确用法 [问题描述] [输入格式] 第一行一个T,接下来T行,每行一个正整数p,代表你需要取模的值. [输出格式] T行,每行一个正整数,为答案对p取模后的值. [样例输入] 3236 ...

  2. Nhibernate基本的增删改查实践

    1.链接配置 <?xml version="1.0" encoding="utf-8" ?> <hibernate-configuration ...

  3. 老郭带你学数据结构(C语言系列)2-线性表之动态顺序表

    一.基本概念: 线性表:由n个类型相同的数据元素组成的有限序列,记为(a1,a2,--an). 线性表的特征:其中的元素存在这序偶关系,元素之间存在着严格的次序关系. 顺序存储表:线性表中的元素依次存 ...

  4. LeetCode OJ-- Longest Substring Without Repeating Characters ***@

    https://oj.leetcode.com/problems/longest-substring-without-repeating-characters/ 给一个string,找出其中不含有重复 ...

  5. OpenSSL使用1(用OpenSSL生成自签名证书在IIS上搭建Https站点)(用于iOS的https访问)

    前提: 先安装openssl,安装有两种方式,第一种直接下载安装包,装上就可运行:第二种可以自己下载源码,自己编译.这里推荐第一种. 安装包:http://slproweb.com/products/ ...

  6. hdu1003(C++)解法1

    #include<iostream>using namespace std;int Maxsum(int*a, int n);int main(){ int T,n,i,j,count=0 ...

  7. 卷积 convolution

    这东西大学学过,然后我忘记了,后来就只记得这个名字了. https://zh.wikipedia.org/wiki/%E5%8D%B7%E7%A7%AF http://www.guokr.com/po ...

  8. matlab修改文件名和删除某类文件

    matlab修改多级文件夹路径下的文件名: % %%%%%%%%%%%%%%批量修改文件名一级文件夹 \路径下直接为文件 % close all;clear all;clc; % path='G:\1 ...

  9. CSS实现鼠标放图片上显示白色边框+文字描写叙述

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. centos下lvs配置

    一.lvs-nat模式 网络配置: lvs-server eth0 :host-only adapter 192.168.56.101 lvs-server eth1 :Internal 192.16 ...