生产库中出现了大量的锁表,需要得到当时程式执行的SQL以及其带入的值
1.查看SQL
SELECT SQL_ID FROM V$SESSION WHERE SID=(SELECT FINAL_BLOCKING_SESSION FROM V$SESSION WHERE BLOCKING_SESSION IS NOT NULL);
查出来后,在通过V$SQL查找,此时发现程式使用了绑定变量,此方法不可行。
2.通过10046进行追踪
可以通过10046追踪某个会话,但是因为有好多程式,并不知道哪一个会锁表,因此无法确定追踪哪一个
3.通过LOGMNR得到
因为锁表的会话并没有提交,所以我们需要验证一下LOGMNR是否可以抓到未提交的SQL
--1.执行一条更新语句
UPDATE TT SET NAME='MONKEY' WHERE ID=1;
--2.不提交
--3.归档当前的REDO
alter system archive log current;
--4.LOGMNR
EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('/xxxx/xxxx/archivelog/1_1078_1047477936.dbf');
EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS=>16);
SELECT * FROM V$LOGMNR_CONTENTS WHERE lower(TABLE_NAME)='tt'
根据这个原理,我们可以对锁表的会话的变量值进行抓取。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章