透過Log Miner做Oracle資料同步
目前市面上有不少Oracle databasae資料庫同步的軟體,普遍分兩類:Oracle原廠的(OGG)、開源免費的(SymmetricDS)。原廠的原理是讀取redo log和archive log,SDS主要是透過Trigger做同步。實際測試的結果,感覺很臃腫,OGG很貴,其實我們是可以透過archive log做同步的(但是建議,要資深的DBA才能做,因為log miner是需要DBA許可權的。作者在世界500強跨國企業當DBA超過10年)
實驗環境:
Source DB:
-- RHEL5.8 X64 OS
-- Oracle11g SE1 DB
Target DB:
-- CENTOS6.5 X64 OS
-- Oracle11g SE1 DB
使用的工具:
Python2.6、Bshell(Linux自帶), Oracle Client(Oracle11g 自帶)
比較難的點:
-- 利用log miner讀取log
-- 利用Linux的ls, seq, awk定位最近產生的log(這個難不倒大家吧)
-- 利用Python把SQL, Shell結合在一起,做到real-time
首先,log miner需要先安裝,網上很多範例,就不多說了。安裝完成後,利用下面的SQL語句,就可以找到相對應的SQL。產生完SQL就直接在target DB執行。
SQL>
alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"; -- 如果不設定,就只能看到日期看不到時間
execute dbms_logmnr.add_logfile(LogFileName=>'/home/hadoop/ora11g/dbs/arch/1_204_897823121.dbf', options=>dbms_logmnr.new); -- 需要分析的log
execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.COMMITTED_DATA_ONLY+DBMS_LOGMNR.NO_ROWID_IN_STMT); -- 讀取線上的字典,只有commit的語句才讀出來,不要ROWID
set feedback off
set heading off
spool spool.tmp
SELECT sql_redo FROM v$logmnr_contents where seg_name ='TEST'; -- 需要找什麼樣的table就看自己了條件自己把握。
execute dbms_logmnr.end_logmnr;
spool off
exit;
實驗內容:透過對test.test表格的修改,看log miner是否可以從log中找到相關的SQL語句:
Table test.test的內容:
SQL> select * from test.test;
ID COL1
---------- --------------------------------
1 a
2 aa
3 aaa
1. 增加個欄位:newcol
PL/SQL procedure successfully completed.
ALTER TABLE TEST.TEST ADD (newcol VARCHAR2(32 BYTE)); 《== 這個是從log miner撈到的資料
2. 插入條record
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","COL1","NEWCOL" values ('4','newa',NULL); 《== 這個是從log miner撈到的資料
3. truncate table資料
PL/SQL procedure successfully completed.
TRUNCATE TABLE TEST.TEST drop storage; 《== 這個是從log miner撈到的資料
4. delete table
PL/SQL procedure successfully completed.
DROP TABLE TEST.TEST CASCADE CONSTRAINTS PURGE; 《== 這個是從log miner撈到的資料
以上基本的操作,都可以完全做出來。當然,其他DDL和資料型別,就要按照情況測試了。當然,這個是基本功,需要自動化運維的話,還需要更多的知識,這裡是利用Python做的,Linux+Python+Oracle,可以做到自動化分析archive log,自動化apply to target DB。後續也可以和Hbase結合,或者與Hadoop結合。這樣就可以基本上做到讀寫分離了。也完全可以讀取redo log,不過,自己試試看吧。挺好玩的。
5. 支援CLOB
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","CLOB") values ('4',EMPTY_CLOB());
DECLARE
loc_c CLOB;
buf_c VARCHAR2(6156);
loc_b BLOB;
buf_b RAW(6156);
loc_nc NCLOB;
buf_nc NVARCHAR2(6156);
BEGIN
select "CLOB" into loc_c from "TEST"."TEST" where "ID" = '4' for update;
dbms_lob.trim(loc_c, 0);
END;
update "TEST"."TEST" set "CLOB" = 'Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, ' where "ID" = '4';
實驗環境:
Source DB:
-- RHEL5.8 X64 OS
-- Oracle11g SE1 DB
Target DB:
-- CENTOS6.5 X64 OS
-- Oracle11g SE1 DB
使用的工具:
Python2.6、Bshell(Linux自帶), Oracle Client(Oracle11g 自帶)
比較難的點:
-- 利用log miner讀取log
-- 利用Linux的ls, seq, awk定位最近產生的log(這個難不倒大家吧)
-- 利用Python把SQL, Shell結合在一起,做到real-time
首先,log miner需要先安裝,網上很多範例,就不多說了。安裝完成後,利用下面的SQL語句,就可以找到相對應的SQL。產生完SQL就直接在target DB執行。
SQL>
alter session set NLS_DATE_FORMAT="YYYY-MM-DD HH24:MI:SS"; -- 如果不設定,就只能看到日期看不到時間
execute dbms_logmnr.add_logfile(LogFileName=>'/home/hadoop/ora11g/dbs/arch/1_204_897823121.dbf', options=>dbms_logmnr.new); -- 需要分析的log
execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG+DBMS_LOGMNR.COMMITTED_DATA_ONLY+DBMS_LOGMNR.NO_ROWID_IN_STMT); -- 讀取線上的字典,只有commit的語句才讀出來,不要ROWID
set feedback off
set heading off
spool spool.tmp
SELECT sql_redo FROM v$logmnr_contents where seg_name ='TEST'; -- 需要找什麼樣的table就看自己了條件自己把握。
execute dbms_logmnr.end_logmnr;
spool off
exit;
實驗內容:透過對test.test表格的修改,看log miner是否可以從log中找到相關的SQL語句:
Table test.test的內容:
SQL> select * from test.test;
ID COL1
---------- --------------------------------
1 a
2 aa
3 aaa
1. 增加個欄位:newcol
PL/SQL procedure successfully completed.
ALTER TABLE TEST.TEST ADD (newcol VARCHAR2(32 BYTE)); 《== 這個是從log miner撈到的資料
2. 插入條record
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","COL1","NEWCOL" values ('4','newa',NULL); 《== 這個是從log miner撈到的資料
3. truncate table資料
PL/SQL procedure successfully completed.
TRUNCATE TABLE TEST.TEST drop storage; 《== 這個是從log miner撈到的資料
4. delete table
PL/SQL procedure successfully completed.
DROP TABLE TEST.TEST CASCADE CONSTRAINTS PURGE; 《== 這個是從log miner撈到的資料
以上基本的操作,都可以完全做出來。當然,其他DDL和資料型別,就要按照情況測試了。當然,這個是基本功,需要自動化運維的話,還需要更多的知識,這裡是利用Python做的,Linux+Python+Oracle,可以做到自動化分析archive log,自動化apply to target DB。後續也可以和Hbase結合,或者與Hadoop結合。這樣就可以基本上做到讀寫分離了。也完全可以讀取redo log,不過,自己試試看吧。挺好玩的。
5. 支援CLOB
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","CLOB") values ('4',EMPTY_CLOB());
DECLARE
loc_c CLOB;
buf_c VARCHAR2(6156);
loc_b BLOB;
buf_b RAW(6156);
loc_nc NCLOB;
buf_nc NVARCHAR2(6156);
BEGIN
select "CLOB" into loc_c from "TEST"."TEST" where "ID" = '4' for update;
dbms_lob.trim(loc_c, 0);
END;
update "TEST"."TEST" set "CLOB" = 'Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, Hello, Yes, ' where "ID" = '4';
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9034054/viewspace-2018372/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Log Miner 挖挖挖
- ETL資料整合丨透過ETLCloud工具,將Oracle資料實時同步至Doris中CloudOracle
- oracle 資料透過goldengate 實時同步到kafka訊息佇列中OracleGoKafka佇列
- 如何透過一條資料庫語句做資料分析資料庫
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- 透過 Canal 將 MySQL 資料實時同步到 EasysearchMySql
- 使用oracle的logminer同步資料Oracle
- oracle資料庫透過sqlplus連線的幾種方式介紹Oracle資料庫SQL
- Oracle透過ODBC連線SQL Server資料庫後ORA-12514OracleSQLServer資料庫
- Excel資料透視表怎麼做 Excel資料透視表技巧Excel
- 透過等待看資料庫資料庫
- DataX將MySql資料庫資料同步到Oracle資料庫MySql資料庫Oracle
- 跨平臺銷售策略:透過API同步不同市場的商品資料API
- 異構資料來源同步之表結構同步 → 透過 jdbc 實現,沒那麼簡單JDBC
- Kettle:Oracle多表格批量同步資料=》mysqlOracleMySql
- MySQL 到Oracle 實時資料同步HYXSMySqlOracle
- Zabbix透過Orabbix監控OracleOracle
- DataX將Oracle資料庫資料同步到達夢資料庫Oracle資料庫
- Dcat admin 後臺 資料實時非同步重新整理,有人做過嗎?非同步
- MySQL 透過 binlog 恢復資料MySql
- oracle 9i資料庫做spaOracle資料庫
- oracle11g單例項透過命令列dbca靜默建立資料庫Oracle單例命令列資料庫
- 透過Github同步你的VScode設定GithubVSCode
- 【LOG】Oracle資料庫清理日誌、跟蹤檔案利器Oracle資料庫
- 【MVIEW】Oracle通過物化檢視同步表資料及簡介ViewOracle
- 透過spark將資料儲存到elasticsearchSparkElasticsearch
- 如何透過SQLyog分析MySQL資料庫MySql資料庫
- 【Mysql】如何透過binlog恢復資料MySql
- 透過Python SDK 獲取tushare資料Python
- 透過API介面實現資料探勘?API
- 【資料庫資料恢復】透過資料頁恢復Sql Server資料庫資料的過程資料庫資料恢復SQLServer
- Oracle資料庫由dataguard備庫引起的log file sync等待Oracle資料庫
- Oracle/MySQL透過odbc訪問PostgreSQL for LightDBOracleMySql
- [資料整合/資料同步] 基於資料庫增量日誌的資料同步方案 : Flink CDC/Debezium/DataX/Canal/Oracle Goldengate/Kettle/Sqoop資料庫OracleGoOOP
- 透視表excel透視表怎麼做 excel的資料透視表怎麼弄Excel
- 做資料庫分離讀寫時,sqlServer資料庫資料同步的問題:資料庫SQLServer
- hadoop 透過cachefile來避免資料傾斜Hadoop
- bitcoin: 透過 rpc 請求節點資料RPC
- 透過 ETL 匯出 Hive 中的資料Hive