疑惑:在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',如下所示),沒有加上ROLLBACK字段,這樣在不了解、熟悉的情況下,可能會以為它是一個客戶端發出的一個DELETE語句,實質上是一個INSERT語句回滾操作。
CREATE TABLE SCOTT.LOG_MINER_OUTPUT
AS
SELECT SQL_REDO,SQL_UNDO, USERNAME,SESSION_INFO FROM V$LOGMNR_CONTENTS WHERE TABLE_NAME='EMP' AND OPERATION='DELETE';
在AWR報告中,如果你看到一些指標(例如user rollbacks,transaction rollbacks,Rollback per transaction%)的值較大,而你又無法定位原因時,那么你可以用Logminer來幫你分析定位原因(root cause)。這個也算是Logminer的一個特殊用途!!