Oracle10G LOGMNR捕獲不到記錄(一)
很早以前就碰到這個問題,一直以為是由於沒有設定FORCE_LOGGING的問題,今天才發現不是這個問題。
問題起源是在10g的版本上使用LOGMNR找不到剛剛執行的DML操作:
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 245 INACTIVE
2 246 INACTIVE
3 247 CURRENT
SQL> SELECT GROUP#, MEMBER FROM V$LOGFILE;
GROUP# MEMBER
---------- --------------------------------------------------
3 E:\ORACLE\ORADATA\YTK102\REDO03.LOG
2 E:\ORACLE\ORADATA\YTK102\REDO02.LOG
1 E:\ORACLE\ORADATA\YTK102\REDO01.LOG
SQL> DROP TABLE T PURGE;
表已刪除。
SQL> CREATE TABLE T (ID NUMBER);
表已建立。
SQL> INSERT INTO T VALUES (1);
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK102\REDO03.LOG', SYS.DBMS_LOGMNR.NEW)
PL/SQL 過程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL 過程已成功完成。
SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = USER AND TABLE_NAME = 'T';
SQL_REDO
------------------------------------------------------------------
CREATE TABLE T (ID NUMBER);
SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR
PL/SQL 過程已成功完成。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
本來一直是認為是沒有設定FORCE_LOGGING,導致部分記錄沒有在REDO檔案中被記錄,結果查詢V$DATABASE確發現當前正是FORCE LOGGING狀態:
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
FOR
---
YES
同樣的問題從沒有在9i上發生過,說明應該是Oracle10g的某些改變導致了問題的產生。
查詢了metalink,Oracle在文件Doc ID: Note:291574.1中對這個問題進行了詳細說明,如果希望LOGMNR可以得到記錄,應該設定SUPPLEMENTAL LOG DATA PRIMARY KEY和UNIQUE INDEX,這樣Oracle才能確保LOGMNR可以獲取SQL語句:
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
NO NO
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
資料庫已更改。
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;
SUP SUP
--- ---
YES YES
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 248 CURRENT
2 246 INACTIVE
3 247 INACTIVE
SQL> DROP TABLE T PURGE;
表已刪除。
SQL> CREATE TABLE T (ID NUMBER);
表已建立。
SQL> INSERT INTO T VALUES (1);
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
SQL> EXEC SYS.DBMS_LOGMNR.ADD_LOGFILE('E:\ORACLE\ORADATA\YTK102\REDO01.LOG', SYS.DBMS_LOGMNR.NEW)
PL/SQL 過程已成功完成。
SQL> EXEC SYS.DBMS_LOGMNR.START_LOGMNR(OPTIONS => SYS.DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG)
PL/SQL 過程已成功完成。
SQL> SELECT SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = USER AND TABLE_NAME = 'T';
SQL_REDO
----------------------------------------------------------------------------------
DROP TABLE T PURGE;
CREATE TABLE T (ID NUMBER);
insert into "YANGTK"."T"("ID") values ('1');
SQL> EXEC SYS.DBMS_LOGMNR.END_LOGMNR
PL/SQL 過程已成功完成。
可以看到,在10g中預設情況下LOGMNR已經不是一個可靠的資料獲取的方式,希望透過這種方式獲取丟失資料,則需要提前設定SUPPLEMENTAL LOG DATA。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1064085/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle10G LOGMNR捕獲不到記錄Oracle
- Oracle10G LOGMNR捕獲不到記錄(二)Oracle
- 記錄Javascript 異常捕獲JavaScript
- 記錄使用 guzzlehttp 異常捕獲踩坑記錄HTTP
- 捕獲不到異常嘗試除以0
- oracle10g logmnr的使用Oracle
- 如何捕獲和記錄SQL Server中發生的死鎖SQLServer
- STREAMS筆記(10) 同步捕獲筆記
- 【筆記】forall 異常捕獲筆記
- Capture One mac教程:如何匯入捕獲一個目錄APTMac
- JavaScript事件捕獲冒泡與捕獲JavaScript事件
- 捕獲NSLog日誌小記
- #每日一記#通過 GIF 理解 addEventListener、捕獲和冒泡dev
- 小程式雲開發獲取不到資料庫的記錄資料庫
- jQuery捕獲jQuery
- 【正規表示式系列】一些概念(字元組、捕獲組、非捕獲組)字元
- C# winform NLog AOP 記錄全域性未捕獲的異常到日誌C#ORM
- JavaScript 事件捕獲JavaScript事件
- 錯誤捕獲
- php 正規表示式捕獲組與非捕獲組PHP
- Oracle10g RAC設定記錄Oracle
- Oracle10g新特性——記錄DML錯誤日誌(一)Oracle
- 捕獲 React 異常React
- 捕獲cookie的值Cookie
- iOS異常捕獲iOS
- Swift速成:捕獲列表Swift
- 管理捕獲程式——流
- 【Mysql】捕獲線上sqlMySql
- spring-boot 統一異常捕獲Springboot
- 【目標區域捕獲-2】目標區域捕獲簡介
- WIP_PERIOD_BALANCE 中找不到記錄
- javascript捕獲組如何使用JavaScript
- python異常捕獲Python
- 事件冒泡 和 事件捕獲事件
- C++ lambda 捕獲列表C++
- 一次獲取客戶端 IP 記錄客戶端
- Oracle10g新特性——LOG ERRORS 記錄DML錯誤日誌(一)OracleError
- 正規表示式中的捕獲和反向引用筆記筆記