透過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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Log Miner相關Oracle
- MySQL 透過 binlog 恢復資料MySql
- 轉載:使用Log Miner分析Oracle日誌Oracle
- 使用oracle的logminer同步資料Oracle
- 【Mysql】如何透過binlog恢復資料MySql
- 日誌挖掘 log miner
- 如何透過一條資料庫語句做資料分析資料庫
- oracle 同步sql server 資料,怎麼做啊?OracleSQLServer
- oracle 資料透過goldengate 實時同步到kafka訊息佇列中OracleGoKafka佇列
- 透過 Canal 將 MySQL 資料實時同步到 EasysearchMySql
- 透過作業定時同步兩個資料庫資料庫
- 透過cx_Oracle模組獲取資料Oracle
- 資料庫學習:透過作業定時同步兩個資料庫(轉)資料庫
- 【SQL】Oracle資料庫通過job定期重建同步表資料SQLOracle資料庫
- Excel資料透視表怎麼做 Excel資料透視表技巧Excel
- 使用LOG Miner挖掘日誌基本步驟
- 使用impdp命令在不同例項間透過dblink同步資料庫資料庫
- 請教:如果透過cache來提取oracle中的資料?Oracle
- 透過等待看資料庫資料庫
- 透過shell抓取html資料HTML
- mysql 誤刪除表內資料,透過binlog日誌恢復MySql
- 使用LOG Miner挖掘日誌基本步驟---02
- 跨平臺銷售策略:透過API同步不同市場的商品資料API
- 透過 NTP 進行時鐘同步
- 透過Oracle的duplicate database to 【newsid】實現資料庫克隆;OracleDatabase資料庫
- SQL資料同步到ElasticSearch(三)- 使用Logstash+LastModifyTime同步資料SQLElasticsearch
- ElasticSearch + Logstash進行資料庫同步Elasticsearch資料庫
- 測了一下 透過 DBCA 透過模板 複製資料庫(資料庫架構及資料)資料庫架構
- AIX 6.1 建立信任關係透過rsync進行應用資料同步 2AI
- AIX 6.1 建立信任關係透過rsync進行應用資料同步 1AI
- 透過Database Link/IMPDP,同步10G、11G資料庫失敗Database資料庫
- Oracle Dataguard + Goldengate資料同步OracleGo
- oracle trigger 同步資料Oracle
- 如何透過SQLyog分析MySQL資料庫MySql資料庫
- 透過spark將資料儲存到elasticsearchSparkElasticsearch
- 透過API介面實現資料探勘?API
- 透過socket訪問資料庫(轉)資料庫
- Dcat admin 後臺 資料實時非同步重新整理,有人做過嗎?非同步