GoldenGate使用Obey脚本同步数据
一、需求
Windows服务器:
IP: 10.0.30.135
sys用户建表
SQL> create table scott.test_table1
(
id varchar2(10) primary key,
name varchar2(20)
);
Linux服务器:
IP: 192.168.6.135
sys用户建表
SQL> create table haishu.test_table1
(
id varchar2(10) primary key,
username varchar2(20)
);
要求实现Windows下的scott.test_table1和Linux下的haishu.test_table2之间的数据同步。注意这里用户不同,表名不同,字段名一个相同另一个不相同。
二、配置文件和参数文件
1 Windows服务器
文件名
存放路径
GLOBAL.txt
F:\app\Administrator\ogg
addcmds.txt
F:\app\Administrator\ogg\dirprm
defgen.prm
F:\app\Administrator\ogg\dirprm
initext.prm
F:\app\Administrator\ogg\dirprm
mgr.prm
F:\app\Administrator\ogg\dirprm
ext_o_01.prm
F:\app\Administrator\ogg\dirprm
pum_o_01.prm
F:\app\Administrator\ogg\dirprm
rep_n_01.prm
F:\app\Administrator\ogg\dirprm
注:ext_o_01和pum_o_01中的o代表old,表示本机Windows中的数据库是老库。rep_n_01中的n代表复制新库的数据到本机。
GLOBAL.txt
GGSCHEMA ogg
CHECKPOINTTABLE ogg.checkpoint
addcmds.txt
--login
DBLOGIN USERID ogg, PASSWORD oracle
--create a CHECKPOINTTABLE
ADD CHECKPOINTTABLE ogg.checkpoint
--ADD TRANDATA scott.test_table1
--create a Extract group
ADD EXTRACT ext_o_01, TRANLOG, BEGIN NOW
ADD EXTTRAIL F:\app\Administrator\ogg\dirdat\o1, EXTRACT ext_o_01
--create a data pump group
ADD EXTRACT pum_o_01, EXTTRAILSOURCE F:\app\Administrator\ogg\dirdat\o1, BEGIN now
ADD RMTTRAIL ./dirdat/o1, EXTRACT pum_o_01
--create a Replicat group
ADD REPLICAT rep_n_01, EXTTRAIL F:\app\Administrator\ogg\dirdat\n1, CHECKPOINTTABLE ogg.checkpoint
最后一步中的F:\app\Administrator\ogg\dirdat\n1文件是从Linux服务器远程投递过来的。
defgen.prm
DEFSFILE F:\app\Administrator\ogg\dirdef\rep_old.def
USERID ogg, PASSWORD oracle
TABLE scott.test_table1;
DEFSFILE参数表示所要生成的数据定义文件。
initext.prm
SOURCEISTABLE
USERID ogg, PASSWORD oracle
RMTHOST 192.168.6.135, MGRPORT 7809
RMTFILE /u01/ogg/dirdat/init_01, MEGABYTES 2, PURGE
TABLE scott.test_table1;
这个参数文件暂时不用。
mgr.prm
PORT 7809
DYNAMICPORTLIST 7810-7830
STARTUPVALIDATIONDELAYCSECS 10
PURGEOLDEXTRACTS F:\app\Administrator\ogg\dirdat\o1*, USECHECKPOINTS, MINKEEPHOURS 4, MINKEEPFILES 4
ext_o_01.prm
EXTRACT ext_o_01
USERID ogg, PASSWORD oracle
EXTTRAIL F:\app\Administrator\ogg\dirdat\o1
DISCARDFILE F:\app\Administrator\ogg\discard\ext_o_01_discard.txt, PURGE, MEGABYTES 200
TRANLOGOPTIONS EXCLUDEUSER ogg
TABLE scott.test_table1;
pum_o_01.prm
EXTRACT pum_o_01
USERID ogg, PASSWORD oracle
RMTHOST 192.168.6.135, MGRPORT 7809
RMTTRAIL ./dirdat/o1
TABLE scott.test_table1;
rep_n_01.prm
REPLICAT rep_n_01
USERID ogg, PASSWORD oracle
DISCARDFILE F:\app\Administrator\ogg\dirdat\rep_n_01_discard.txt, PURGE, MEGABYTES 200
SOURCEDEFS F:\app\Administrator\ogg\dirdef\rep_new.def
MAP haishu.test_table2, TARGET scott.test_table1,
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, IGNORE)),
RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, IGNORE)),
COLMAP
(
id=id,
name=username
);
注1:SOURCEDEFS表示源机器的数据结构定义文件。对于复制进程来说,是要从别的机器复制东西过来,所以源机器自然就是远程Linux服务器,目标机器则是本机。rep_new.def是从远程Windows机器拷贝过来的,不是本机生成的。
MAP haishu.test_table2, TARGET scott.test_table1, 表示从haishu.test_table2中(通过一些进程)复制数据到scott.test_table1中。
name=username,左边的name表示本机test_table1中的字段,右边的username表示rep_new.def中的字段,即远程Linux服务器中的字段。
注2:如果把SOURCEDEFS ./dirdef/rep_old.def换成assumetargetdefs,则colmap中两边的字段都要写成本机中的字段,即:
REPLICAT rep_n_01
USERID ogg, PASSWORD oracle
DISCARDFILE F:\app\Administrator\ogg\discard\rep_n_01_discard.txt, PURGE, MEGABYTES 200
ASSUMETARGETDEFS
MAP haishu.test_table2, TARGET scott.test_table1,
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, OVERWRITE)),
RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, IGNORE)),
RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, IGNORE)),
COLMAP
(
id=id,
name=name
);
2 Linux服务器
文件名
存放路径
GLOBAL
/u01/ogg
addcmds.txt
/u01/ogg/dirprm
defgen.prm
/u01/ogg/dirprm
initrep.prm
/u01/ogg/dirprm
mgr.prm
/u01/ogg/dirprm
ext_n_01.prm
/u01/ogg/dirprm
pum_n_01.prm
/u01/ogg/dirprm
rep_o_01.prm
/u01/ogg/dirprm
注:ext_n_01和pum_n_01中的n代表new,表示本机Linux中的数据库是新库。rep_o_01中的o代表old,表示进程的作用是复制Windows老库中的数据。
GLOBAL
GGSCHEMA ogg
CHECKPOINTTABLE ogg.checkpoint
addcmds.txt
--login
DBLOGIN USERID ogg, PASSWORD oracle
--create a CHECKPOINTTABLE
--ADD TRANDATA haishu.test_table2
ADD CHECKPOINTTABLE ogg.checkpoint
--create a Extract group
ADD EXTRACT ext_n_01, TRANLOG, BEGIN now
ADD EXTTRAIL ./dirdat/n1, EXTRACT ext_n_01
--create a data pump group
ADD EXTRACT pum_n_01, EXTTRAILSOURCE ./dirdat/n1, BEGIN now
ADD RMTTRAIL F:\app\Administrator\ogg\dirdat\n1, EXTRACT pum_n_01
--create a Replicat group
ADD REPLICAT rep_o_01, EXTTRAIL ./dirdat/o1, CHECKPOINTTABLE ogg.checkpoint
defgen.prm
DEFSFILE ./dirdef/rep_new.def
USERID ogg, PASSWORD oracle
TABLE haishu.test_table2;
DEFSFILE参数表示所要生成的数据定义文件。
initrep.prm
SPECIALRUN
END RUNTIME
USERID ogg, PASSWORD oracle
EXTFILE /u01/ogg/dirdat/init_01
TRAILCHARSET windows-936
GROUPTRANSOPS 5000
SOURCEDEFS ./dirdef/rep_old.def
MAP scott.test_table1, TARGET haishu.test_table2,
COLMAP
(
id=userid,
name=username
);
此参数文件暂时不用。
mgr.prm
PORT 7809
DYNAMICPORTLIST 7810-7830
STARTUPVALIDATIONDELAYCSECS 10
PURGEOLDEXTRACTS /u01/ogg/dirdat/n1*, USECHECKPOINTS, MINKEEPHOURS 4, MINKEEPFILES 4
ext_n_01.prm
EXTRACT ext_n_01
USERID ogg, PASSWORD oracle
EXTTRAIL ./dirdat/n1
DISCARDFILE /u01/ogg/dirdat/ext_n_01_discard.txt, PURGE, MEGABYTES 200
TRANLOGOPTIONS EXCLUDEUSER ogg
TABLE haishu.test_table2;
pum_n_01.prm
EXTRACT pum_n_01
USERID ogg, PASSWORD oracle
RMTHOST 10.0.30.135, MGRPORT 7809
RMTTRAIL F:\app\Administrator\ogg\dirdat\n1
TABLE haishu.test_table2;
rep_o_01.prm
REPLICAT rep_o_01
USERID ogg, PASSWORD oracle
DISCARDFILE /u01/ogg/discard/rep_o_01_discard.txt, PURGE, MEGABYTES 200
SOURCEDEFS ./dirdef/rep_old.def
MAP scott.test_table1, TARGET haishu.test_table2,
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, IGNORE)),
RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, IGNORE)),
RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, IGNORE)),
RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, IGNORE)),
RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, IGNORE)),
COLMAP
(
id=id,
username=name
);
注1:SOURCEDEFS表示源机器的数据结构定义文件。对于复制进程来说,是要从别的机器复制东西过来,所以源机器自然就是远程Windows服务器,目标机器则是本机。rep_old.def是从远程Windows机器拷贝过来的,不是本机生成的。
MAP scott.test_table1, TARGET haishu.test_table2, 表示从scott.test_table1中通过进程复制数据到haishu.test_table2中。
username=name,左边的username表示本机haishu.test_table1中的字段,右边的name表示rep_old.def中的字段,即远程Linux服务器中的字段。
注2:如果把SOURCEDEFS ./dirdef/rep_old.def换成assumetargetdefs,则colmap中两边的字段都要写成本机中的字段,即:
REPLICAT rep_o_01
USERID ogg, PASSWORD oracle
DISCARDFILE /u01/ogg/dirdat/rep_o_01_discard.txt, PURGE, MEGABYTES 200
ASSUMETARGETDEFS
MAP scott.test_table1,TARGET haishu.test_table2,
RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, IGNORE)),
RESOLVECONFLICT (INSERTROWEXISTS, (DEFAULT, IGNORE)),
RESOLVECONFLICT (DELETEROWEXISTS, (DEFAULT, IGNORE)),
RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, IGNORE)),
RESOLVECONFLICT (DELETEROWMISSING, (DEFAULT, IGNORE))
COLMAP
(
id=id,
username=username
);
三、数据双向复制
1 捕获数据结构定义并传到对方机器
1)捕获Windows下的老库表结构定义并拷贝到Linux下的相应位置
假如老库与新库相关表结构不完全一致,需要用命令生成结构定义文件,并将该文件拷贝到新库。
在命令提示符下执行并生成结构定义文件(rep_old.def):
F:\app\Administrator\ogg> defgen paramfile F:\app\Administrator\ogg\dirprm\defgen.prm
将生成的文件(F:\app\Administrator\ogg\dirdef\rep_old.def)用FileZilla工具或ftp传到目标库相应位置(/u01/ogg/dirdef/)。
2)捕获Linux下的新库表结构定义并拷贝到Windows下的相应位置
假如新库与老库相关表结构不完全一致,需要用命令生成结构定义文件,并将该文件拷贝到老库。
在命令提示符下执行并生成结构定义文件(rep_new.def):
/u01/ogg> ./defgen paramfile /u01/ogg/dirprm/defgen.prm
将生成的文件(/u01/ogg/dirdef/rep_new.def)用FileZilla工具或ftp传到目标库相应位置(F:\app\Administrator\ogg\dirdef\)。
2 运行obey脚本
老库:
GGSCI (John-PC) 1> obey .\dirprm\addcmds.txt
新库:
GGSCI (localhost) 1> obey ./dirprm/addcmds.txt
3 启动老库和新库进程并进行数据初始化
启动老库管理进程:
GGSCI (John-PC) 1> DBLOGIN USERID ogg, PASSWORD oracle
GGSCI (John-PC) 2> START MANAGER
启动新库管理进程:
GGSCI (localhost) 1> DBLOGIN USERID ogg, PASSWORD oracle
GGSCI (localhost) 2> START MANAGER
老库开启提取进程(ext_o_01)和投递进程(pum_o_01):
GGSCI (John-PC) 1> START EXTRACT ext_o_01
GGSCI (John-PC) 2> START EXTRACT pum_o_01
新库开启复制进程:
GGSCI (localhost) 1> START REPLICAT rep_o_01
新库开启提取进程(ext_n_01)和投递进程(pum_n_01):
GGSCI (localhost) 1> START EXTRACT ext_n_01
GGSCI (localhost) 2> START EXTRACT pum_n_01
老库开启复制进程:
GGSCI (WIN-2008) 1> START REPLICAT rep_n_01
4 查看老库和新库进程
老库:
GGSCI (John-PC) 1> INFO ALL
新库:
GGSCI (localhost) 1> INFO ALL
5 测试
(1)老库插入数据
SQL> insert into scott.test_table1 values('001', 'scott-A');
SQL> commit;
SQL> select * from scott.test_table1;
新库中检验
SQL> select * from haishu.test_table2;
ID USERNAME
---------- --------------------
001 scott-A
(2)新库中插入数据
SQL> insert into haishu.test_table2 values('002', 'haishu-A');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from haishu.test_table2;
ID USERNAME
---------- --------------------
002 haishu-A
001 scott-A
老库中检验
SQL> select * from scott.test_table1;
(3)老库中删除数据
SQL> delete from scott.test_table1 where name='haishu-A';
SQL> commit;
SQL> select * from scott.test_table1;
新库中检验
SQL> select * from haishu.test_table2;
ID USERNAME
---------- --------------------
001 scott-A
(4)新库中删除数据
SQL> delete from haishu.test_table2;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from haishu.test_table2;
no rows selected
老库中检验
SQL> select * from scott.test_table1;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29485627/viewspace-1769950/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29485627/viewspace-1769950/