疑惑:在v$logmnr_contents中,SQL_REDO有DELETE语句,但是SQL_UNDO为null是什么情况?
其实这种情况是因为SQL插入失败,数据库内部回滚了这条记录。这是比较特殊的一种情况,如果以前没有注意过这些细节信息,还真有点懵。这里模拟构造了一个案例,演示一下这种情况:
SQL> INSERT INTO SCOTT.EMP
2 VALUES(7934,'MILLER','CLERK','7782' , SYSDATE, 1200, NULL,10);
INSERT INTO SCOTT.EMP
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.PK_EMP) violated
然后我们使用LogMiner去挖掘redo log,就会发现redo log里面生成了两条记录,一条INSERT、一条DELETE记录。
SQL> execute dbms_logmnr.add_logfile('/u01/oradata/gsp/redo03.log', dbms_logmnr.new);
PL/SQL procedure successfully completed.
SQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
PL/SQL procedure successfully completed.
SQL> create table scott.log_miner_output
2 as
3 select * from v$logmnr_contents where table_name='EMP' ;
Table created.
SQL> execute dbms_logmnr.end_logmnr();
PL/SQL procedure successfully completed.

所以对于这种情况: ROLLBACK字段值为1表示回滚, OPERATION为DELETE, SQL_REDO为DELETE语句, SQL_UNDO为NULL值。有时候,我们可能这样去挖掘分析(加上查询条件OPERATION='DELETE'),对于这种情况,可能会以为是一个DELETE语句,实质上是一个INSERT语句回滚出现的。
create table scott.log_miner_output
as
select * from v$logmnr_contents where table_name='EMP' and OPERATION='DELETE';
在AWR报告中,如果你看到一些指标(例如user rollbacks,transaction rollbacks,Rollback per transaction %)的值较大,而你又无法定位原因时,那么你也可以用Logminer来帮你分析定位原因。这个也算是Logminer的一个特殊用途
文章转载自DBA闲思杂想录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




