Oracle通過LogMiner實現資料同步遷移
寫在前面
最近在研究如何實現Oracle資料庫之間的資料同步,網上的資料確實比較少。最好用的Oracle資料庫同步工具是:GoldenGate ,而GoldenGate是要收費的。那麼還有什麼好的辦法來同步Oracle的資料嗎?沒錯,就是使用LogMiner來實現Oracle資料同步遷移。
實現過程
1.建立目錄
在伺服器上建立/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR目錄來儲存資料庫的字典資訊,如下所示。
mkdir -p /home/oracle/tools/oracle11g/oradata/orcl/LOGMNR
2.配置LogMiner
以oracle使用者身份登入伺服器,並以DBA身份登入Oracle資料庫,如下所示。
sqlplus /nolog conn / as sysdba
接下來,建立字典資料夾配置,如下所示。
CREATE DIRECTORY utlfile AS '/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR'; alter system set utl_file_dir='/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR' scope=spfile;
注意:由於utl_file_dir只存在於檔案當中,所以scope是以檔案方式"spfile"寫入,而不是both。
3.開啟日誌追加模式
alter database add supplemental log data;
4.重啟資料庫
SHUTDOWN IMMEDIATE; STARTUP;
5.建立資料同步使用者
建立資料同步使用者,如果已經有可以跳過,直接賦予許可權。
create user SYNC identified by SYNC; #如果存在使用者,則不需要再次建立,直接授權即可 GRANT CONNECT,RESOURCE,DBA,EXECUTE_CATALOG_ROLE TO SYNC;
6.建立資料字典
切換到要同步資料的使用者,以DBA身份登入,建立資料字典檔案,如下所示。
conn SYNC/SYNC@orcl as sysdba; EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora',dictionary_location =>'/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR');
建立資料字典的命令也可以通過Java程式碼來實現,如果使用Java程式碼實現的話,首先可以通過JDBC連線到Oracle資料庫,然後執行如下命令。
BEGIN dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora',dictionary_location =>'/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR'); END;
7.加入需要分析的日誌檔案
此步驟可以在Oracle命令列執行,也可以使用Java程式碼實現。
使用SQL語句實現如下所示。
EXECUTE dbms_logmnr.add_logfile(logfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/REDO01.LOG',options=>dbms_logmnr.NEW); EXECUTE dbms_logmnr.add_logfile(logfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/REDO02.LOG',options=>dbms_logmnr.ADDFILE); EXECUTE dbms_logmnr.add_logfile(logfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/REDO03.LOG',options=>dbms_logmnr.ADDFILE);
使用Java程式碼分析時,使用的SQL語句如下所示。
BEGIN dbms_logmnr.add_logfile(logfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/REDO01.LOG',options=>dbms_logmnr.NEW); dbms_logmnr.add_logfile(logfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/REDO02.LOG',options=>dbms_logmnr.ADDFILE); dbms_logmnr.add_logfile(logfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/REDO03.LOG',options=>dbms_logmnr.ADDFILE); END;
8.檢視正在使用的日誌檔案
SELECT group#,sequence#,status,first_change#,first_time FROM V$log ORDER BY first_change#;
status為CURRENT的為當前正在使用的日誌檔案
9.使用Lominer分析日誌
EXECUTE dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR/dictionary.ora');
使用Java程式碼分析時,使用的SQL語句如下所示。
BEGIN dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR/dictionary.ora'); END;
10.檢視分析結果
SELECT sql_redo,sql_undo,seg_owner FROM v$logmnr_contents WHERE seg_name='EMP' AND seg_owner='SYNC';
注意:檢視v$logmnr_contents中的分析結果僅在我們執行過程'dbms_logmrn.start_logmnr'這個會話的生命期中存在,如果要檢視新的日誌,需要再重新加入分析日誌檔案、使用LogMiner分析。
11.常見問題
(1)如果出現“必須宣告識別符號 'SYS.DBMS_LOGMNR'”異常,則需要在建立使用者後,為使用者賦予EXECUTE_CATALOG_ROLE許可權,如下所示。
GRANT CONNECT,EXECUTE_CATALOG_ROLE TO SYNC;
(2)當在查詢v$logmnr_logs時提示“表或檢視不存在”,是因為沒有查詢v$logmnr_logs的許可權。此時在查詢語句中需要為seg_owner指定相應的使用者,例如,我這裡使用SYNC使用者通過LogMiner進行分析,則需要將seg_owner指定為SYNC使用者,如下所示。
SELECT sql_redo,seg_owner FROM v$logmnr_contents WHERE seg_name='EMP' AND seg_owner='SYNC';
以上就是Oracle通過LogMiner實現資料同步遷移的詳細內容,更多關於Oracle資料同步遷移的資料請關注我們其它相關文章!