问题背景:

有时会考虑一件事情,如果在Oracle环境下出现了锁阻塞的情况,如何定位到SQL源头(通过session、lock、transaction等视图仅能定位到会话)?或许有人会想有没有可能通过AWR相关的数据库性能历史视图找到有用的信息呢?答案是否定的,因为AWR仓库中的历史性能数据都是收集的有性能问题的会话、语句、活动,而最初加锁的那个update语句执行速度非常快,往往根本达不到AWR收集的阀值,不被Oracle注意到。而Oracle注意到的都是被“它”给阻塞的那些会话。

是不是没方法,找到那个始作俑者?有的,只不过比较麻烦,有一个地方是始终会忠实记录DML活动-----日志(打开Oracle的补充日志)

补充日志

补充日志不是独立的日志,而是对重做日志变更矢量的补充。LogMiner、闪回事务、闪回事务查询等功能需要开启补充日志才能正常工作。

      在启动数据库补充日志的时候,会使得所有缓存的游标变得无效,突如其来的大量硬解析将对数据库的性能带来影响。启动数据库补充日志将等待当前所有的事务结束,使得该操作之后记录的所有Redo数据都有补充日志的属性,如果数据库有长事务或事务过于频繁将导致该操作出现Hang住的情况,由此可见启动数据库的补充日志应尽量避开数据库高峰期。

补充日志分为:数据库级补充日志、 表级补充日志

若结果返回YES或IMPLICIT则说明已开启最小补全日志,当使用ALL,PRIMARY,UNIQUE或FOREIGN补全日志时最小补全日志默认开启(即检查结果为IMPLICIT)。

标识关键字段补充日志:分为 主键、外键、唯一索引、全体字段 补充日志 4种

其他补充日志都是基于数据库级最小补充日志之上的,启用数据库级的其他日志(主键、外键、唯一索引、ALL)会自动开启最小补充日志;

如果希望启用表级的其他类型补充日志,需要先手工开启数据库级的最小补充日志。

启用最小补充日志命令: 
       ALTER DATABASE ADD Supplemental Log Data;
关闭最小补充日志命令: 
       ALTER DATABASE DROP Supplemental Log Data;

启用其他类型的日志:

alter database add supplemental log data (Primary key) columns;

alter database add supplemental log data (unique) columns;

alter database add supplemental  log data (foreign key) columns;

alter database add supplemental log data (all) columns;

表级补充日志:
        分为: 主键、唯一索引、外键、全体字段、用户自定义字段 5种。
        前 4 种 同数据库级 标识关键字段补充日志效果用法一样。只不过是在特定表上启用补充日志
        1、 alter table tb_name add supplemental log data (primary key) columns;
        2、 alter table tb_name add supplemental log data (unique) columns;
        3、 alter table tb_name add supplemental log data (foreign key) columns;
        4、 alter table tb_name add supplemental log data (all) columns;
        5、 alter table tb_name add supplemental log group group_name  (col01, col02, col05, col09) always;

--自定义字段表级补充日志 用户可以任意指定哪些字段的旧值需要被补充日志记录。 
        有条件记录式:记载是指 无论 update 那个字段 这组中的其他字段都的记录其旧值 
        无条件记录式:记载是指 有无条件记录式记载 命令末尾 加  always 关键字,然后无论 update 该行那个字段,都记录该组中的字段的旧值。
        表级补充日志的情况 通过  dba_log_groups 和  dba_log_group_columns 视图查询获得

通过补充日志定位阻塞源头:

1、启用补充日志
   select log_mode, open_mode, flashback_on, supplemental_log_data_min from v$database;    
   alter database add supplemental log data;

2、将redo日志文件添加到logmnr分析日志列表
   exec sys.dbms_logmnr.add_logfile(logfilename=>'redo日志1', options=>sys.dbms_logmnr.new);
   exec sys.dbms_logmnr.add_logfile(logfilename=>'redo日志2', options=>sys.dbms_logmnr.addfile);
   exec sys.dbms_logmnr.add_logfile(logfilename=>'redo日志n', options=>sys.dbms_logmnr.addfile);

3、重现问题后,启动并分析redo日志
   exec sys.dbms_logmnr.start_logmnr(options => sys.dbms_logmnr.dict_from_online_catalog);

4、查看分析结果
   spool c:\log.txt

-- 根据阻塞源头及被阻塞会话的sid,注意观察对应的XID和table_name
   select t.SCN, t.SESSION#, t.SERIAL#, t.XID, t.table_name, t.SQL_REDO, t.SQL_UNDO from v$logmnr_contents t where  t.SESSION#  IN (xxx)

spool off

5、停止logmnr
   exec sys.dbms_logmnr.end_logmnr;

6、取消补充日志
   alter database drop supplemental log data (primary key) columns;
   alter database drop supplemental log data (unique) columns;
   alter database drop supplemental log data;

通过Oracle补充日志,找到锁阻塞源头的SQL的更多相关文章

  1. oracle 归档模式、补充日志

    1.归档模式: Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组.当一个联机重做 ...

  2. MySQL5.6锁阻塞分析

    日常维护中,经常会碰到线程被阻塞,导致数据库响应非常慢,下面就看看如何获取是哪个线程导致了阻塞的. blog地址:http://blog.csdn.net/hw_libo/article/detail ...

  3. oracle 11g 数据库恢复技术 ---03 补充日志

    三 补充日志(supplemental logging) 补充日志是对重做记录中变更矢量的补充信息,增加了变更矢量记载的记录量.Oracle某些功能要求启用补充日志才能正常或更好的工作,比如logmi ...

  4. 数据库开启最小补充日志hang住

    一.场景说明: 客户环境需要部署OGG,同事在数据库中执行添加最小补充日志,会话Hang住 二.环境测试 本次测试环境进行模拟,添加最小补充日志的操作,怎么会被Hang住呢? 2.1 模拟会话hang ...

  5. 为什么数据库有时候不能定位阻塞(Blocker)源头的SQL语句

    在SQL Server数据库或OACLE数据库当中,通常一个会话持有某个资源的锁,而另一个会话在请求这个资源,就会出现阻塞(blocking).这是DBA经常会遇到的情况.当出现SQL语句的阻塞时,很 ...

  6. Oracle事务之一:锁和隔离

    Oracle事务之一:锁和隔离 一. 事务概述 事务管理是数据库处理的核心.数据库既要保证用户能并发地执行事务,还要保证数据库的一致性. 当第一条可执行的SQL开始执行,就隐形地开始了一个事务,直到遇 ...

  7. oracle之事务和锁

    Oracle的事务和锁(PPT-I-283-293) 10.1 什么是事务 必须具备以下四个属性,简称ACID 属性:原子性(Atomicity):  事务是一个完整的操作.事务的各步操作是不可分的( ...

  8. Oracle 监听器日志文件过大导致监听异常

    Oracle 监听器日志文件过大导致监听异常 db版本:11.2.0.1 os版本:windows2008 现象: 应用异常,无法连接数据库.登陆数据库服务器,查看监听已经断掉.尝试重启监听,重启失败 ...

  9. Linux/Unix shell 监控Oracle告警日志(monitor alter log file)

    使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...

随机推荐

  1. [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )

    [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 ) billcheung 发表于 2011-10-23 00:07:49 https://www.itsk.com ...

  2. attr和prop

    <div class="content-item active"> <table class="table"> <thead> ...

  3. 【python】selenium+python自动化测试环境搭建

    参考资料: http://www.cnblogs.com/fnng/archive/2013/05/29/3106515.html http://www.easonhan.info/python/20 ...

  4. (Python)导出指定文件夹中as文件的完全限定类名

    AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...

  5. 算法课堂笔记13—Online Algorithm

    今天的算法课是学习离线算法,在计算机科学中,一个在线算法是指它可以以序列化的方式一个个的处理输入,也就是说在开始时并不需要已经知道所有的输入.相对的,对于一个离线算法,在开始时就需要知道问题的所有输入 ...

  6. IT公司100题-32-交换元素,使数组差最小

    问题描述: 有两个整数序列a, b,大小都为n, 序列元素的值任意整数,无序. 要求:通过交换a, b 中的元素,使得sum(a)-sum(b),差最小. 例如: var a=[80, 40, 60, ...

  7. 在standalone模式下运行yarn 0.9.0对HDFS上的数据进行计算

    1.通读http://spark.incubator.apache.org/docs/latest/spark-standalone.html 2.在每台机器上将spark安装到/opt/spark ...

  8. CsvReader,CsvWriter的使用以及解决中文乱码

    public void Csv(){ try { String[] stringList; String sourceFilePath = "D:\\111\\前海自身.csv"; ...

  9. linux信号处理时机

    信号号称所谓软中断,事实上,还是没有真正的硬件中断那样能随时改变cpu的执行流 硬件中断之所以能一发生就得到处理是因为处理器在每个指令周期的结尾都会去检查中断,这种粒度是很细的 但是信号的实现只是在进 ...

  10. 甘特图和PERT图

    gantt图又叫甘特图.进度是按时间顺序计划活动的一个列表,我们称之为Gantt图,它有以下几个关键的成分:1.横跨图顶部排列的是日历表.2.最左边的一列包含了每项任务的标识号(ID).3.左边第二列 ...