Oracle通過LogMiner實現數據同步遷移
寫在前面
最近在研究如何實現Oracle數據庫之間的數據同步,網上的資料確實比較少。最好用的Oracle數據庫同步工具是:GoldenGate ,而GoldenGate是要收費的。那么還有什么好的辦法來同步Oracle的數據嗎?沒錯,就是使用LogMiner來實現Oracle數據同步遷移。
實現過程
1.創(chuàng)建目錄
在服務器上創(chuàng)建/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
接下來,創(chuàng)建字典文件夾配置,如下所示。
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.創(chuàng)建數據同步用戶
創(chuàng)建數據同步用戶,如果已經有可以跳過,直接賦予權限。
create user SYNC identified by SYNC; #如果存在用戶,則不需要再次創(chuàng)建,直接授權即可 GRANT CONNECT,RESOURCE,DBA,EXECUTE_CATALOG_ROLE TO SYNC;
6.創(chuàng)建數據字典
切換到要同步數據的用戶,以DBA身份登錄,創(chuàng)建數據字典文件,如下所示。
conn SYNC/SYNC@orcl as sysdba; EXECUTE dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR');
創(chuàng)建數據字典的命令也可以通過Java代碼來實現,如果使用Java代碼實現的話,首先可以通過JDBC連接到Oracle數據庫,然后執(zhí)行如下命令。
BEGIN dbms_logmnr_d.build(dictionary_filename => 'dictionary.ora', dictionary_location =>'/home/oracle/tools/oracle11g/oradata/orcl/LOGMNR'); END;
7.加入需要分析的日志文件
此步驟可以在Oracle命令行執(zhí)行,也可以使用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'”異常,則需要在創(chuàng)建用戶后,為用戶賦予EXECUTE_CATALOG_ROLE權限,如下所示。
GRANT CONNECT,RESOURCE,DBA,EXECUTE_CATALOG_ROLE TO SYNC;
(2)當在查詢v$logmnr_logs時提示“表或視圖不存在”,是因為沒有查詢v$logmnr_logs的權限。此時在查詢語句中需要為seg_owner指定相應的用戶,例如,我這里使用SYNC用戶通過LogMiner進行分析,則需要將seg_owner指定為SYNC用戶,如下所示。
SELECT sql_redo, sql_undo, seg_owner FROM v$logmnr_contents WHERE seg_name='EMP' AND seg_owner='SYNC';
以上就是Oracle通過LogMiner實現數據同步遷移的詳細內容,更多關于Oracle數據同步遷移的資料請關注腳本之家其它相關文章!
相關文章
CentOS6.2上安裝Oracle10g報ins_emdb.mk錯誤處理方法
oracle安裝過程報ins_emdb.mk錯誤,此時繼續(xù)點擊“continue”即可,待Oracle完成安裝后,再手工執(zhí)行相應腳本完成鏈接即可2014-09-09
Oracle中instr函數與substr函數及自制分割函數詳解
這篇文章主要介紹了Oracle中instr函數與substr函數以及自制分割函數,大家都知道substr函數就是很簡單明了,就是個截取字符函數,本文通過實例代碼對這接個函數詳細介紹,需要的朋友可以參考下2023-07-07
最簡單的Oracle數據恢復 select as of使用方法
這篇文章主要介紹了最簡單的Oracle數據恢復 select as of使用方法,需要的朋友可以參考下2015-08-08
Oracle 實現類似SQL Server中自增字段的一個辦法
由于Oracle中沒有類似SQL Server中的自增字段,所以我們如果想要通過設定類似ID性質的唯一列的話,需要借助Oracle的sequence,先建立一個序列,然后在每次插入數據的時候,通過前觸發(fā)器來更新ID值,并將序列的序號加1,這樣的迂回方式來實現。2009-07-07
[Oracle] Data Guard 之 Redo傳輸詳解
本文先講講其中的Redo傳輸服務,需要的朋友參考下2013-07-07

