通过Log Miner 做Oracle数据同步
2016-05-15 00:00
911 查看
目前市面上有不少Oracle databasae数据库同步的软件,普遍分2类,Oracle原厂的(OGG), 开源免费的(SymmetricDS)。原厂的原理是读取redo+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
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;
SQL> select * from test.test;
ID COL1
SQL>
1. 加个栏位:newcol
PL/SQL procedure successfully completed.
ALTER TABLE TEST.TEST
ADD (newcol VARCHAR2(32 BYTE)); 《== 这个是从log miner捞到的数据
PL/SQL procedure successfully completed.
insert into "TEST"."TEST"("ID","COL1","NEWCOL" values ('4','newa',NULL); 《== 这个是从log miner捞到的数据
PL/SQL procedure successfully completed.
TRUNCATE TABLE TEST.TEST drop storage; 《== 这个是从log miner捞到的数据
PL/SQL procedure successfully completed.
DROP TABLE TEST.TEST CASCADE CONSTRAINTS PURGE; 《== 这个是从log miner捞到的数据
实验环境:
Source DB:
-- RHEL5.8 X64 OS
-- Oracle11g SE1 DB
Target DB:
-- CENTOS6.5 X64 OS
-- Oracle11g SE1 DB
使用的工具: Python2.6(Linux自带), 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执行就好了,也不多说了,基本功。
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
SQL>
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做的,python+linux+oracle,可以做到自动化分析archive log,自动化apply to target DB. 后续也可以和Hbase结合,或者Hadoop结合。这样就可以基本上可以做到读写分离了。 当然,也完全可以读取redo log,不过,自己试试看吧
相关文章推荐
- oracle分区表 转
- oracle表分区二 转
- Oracle 数据库关闭各个阶段
- Oracle 是分区表,但条件不带分区条件的SQL
- Oracle 查找锁之间依赖关系的最源头SID
- Oracle 查询每天执行慢的SQL
- Oracle 查询锁之间的依赖关系
- oracle常用函数汇总
- Oracle分析函数参考手册
- Oracle分析函数
- TDPO和TSM客户端是如何实现ORACLE备份的
- rad hat安装Oracle
- Oracle服务测试连接成功,但是用PL/SQL连接提示“无法解析指定的连接标识符”...
- 在WebLogic新建针对Oracle数据库的JNDI数据源
- Oracle计算时间差函数
- oracle输出信息
- oracle 中有三张表查找oracle中的所有包,包体等
- oracle11gRAC环境使用RMAN备份方案
- mybatis 使用oracle char 字段查询返回结果总是null
- linux中安装oracle11g