概述
在进行GoldeGate数据同步之前,我们往往需要对数据进行初始化,以获得数据同步的基础点。由于选择数据同步的方法不同,数据初始化的源库既可以是正在进行读写操作的数据库,也可以是对外只读的数据库。数据同步的方法主要有以下几种:
Loading data with a database utility,由数据库工具进行目标端数据的初始化,在oracle平台下,常见的有RMAN,exp/imp和expdp/impdp,该方法无法使用多个GoldenGate进程进行并行数据同步
Loading data from file to Replicat,抽取进程将数据抽取到文件中,再从文件中复制数据到目标数据库,可用于ETL处理。这种方式速度最慢。
Loading data from file to database utility,抽取进程以ASCII格式写入到抽取文件中,再通过数据库工具进行批量导入,导入所需的控制文件由复制进程生成和管理。
Loading data with an Oracle GoldenGate direct load,抽取进程直接通过TCP/IP协议将数据传输给复制进程进行处理,不在需要Collector进程和中间文件。
Loading data with a direct bulk load to SQL*Loader,抽取进程以ASCII格式写入到抽取文件中,再通过SQL*Loader进行批量导入,导入所需的控制文件由复制进程生成和管理。 官方文档中声称这种方式是Oracle数据库之间初始化数据最快的,个人认为,如果是进行全库的初始化,rman速度会更快,如果只是针对个别表或者对 象,该方式应该是最快的。这种方式原理和前面提到的Loading data from file to database utility类似。
Loading data with Teradata load utilities, 用于两个teradata数据库之间进行数据同步,同步的工具为multiLoad
数据同步前的前提
禁用DDL同步
目标表应满足的条件,注意:仅为建议,能提高同步速度和避免错误,非必须:
数据:确认目标表为空,否则可能导致与以存在数据行发生冲突或报错。
约束:禁用外键约束和检查约束。外键约束容易引起报错,检查约束会减慢同步速度,可以在数据同步成功后重新激活约束
索引:删除目标表的索引,索引并非插入操作所必须的,且会明显的降低导入速度。可以在数据初始化同步成功后另外建立索引
注意:主键索引是db2 for z/OS平台所必须的,故不应删除该平台数据库的主键索引
在源端和目标端配置manager进程
在目标端参数文件中加入HANDLECOLLISIONS参数来解决数据冲突,但需要有主键或唯一索引,如果没有主键或唯一索引,则需在table和map参数中使用keycols选项
利用RMAN 初始化数据
架构图
RMAN和exp/imp都是利用数据库自带工具copy源端的数据库,然后再建立目标端建立数 据库。在copy数据库的过程中GoldenGate启动一组抽取进程来获取在copy过程中源端数据库的数据变化,copy完成后启动目标端的 replicat进程吧copy数据库过程中的交易再在目标端执行一遍。初始化过程完成后,extract和replicat进程持续运行来保证目标端和 源端数据一致。
RMAN在线初始化是使用RMAN工具备份源端的数据库,然后在目标端恢复数据库到一个SCN, 从这个SCN以后启动REPLICAT进程,所以这种方法不需要冲突处理,在备份和恢复过程中需要启动Extract进场组来获取在backup和 recover过程中的数据变化,目标端恢复完成后启动replicat进程。此后Extract和Replicat持续运行,保证源端和目标端数据一 致。
查看数据库所有事务的开始时间,直到其大于Extract进程的启动时间再开始备份数据库,因为 GoldenGate只获取Extract启动以后的交易变化,在Extract启动之前开始而在Extract启动后完成的交易GoldenGate将 会忽略这些交易,这些被忽略的交数据就会丢失,所以应等数据库所有的交易都在extract启动之后开始时才能开始备份数据。可以通过如下SQL查看交易 开始时间
SQL>select min(start_time) from v$transaction
MIN(START_TIME)
------------------------------------------------------------
07/22/12 10:18:53
关于GoldenGate的安装与配置可以查看笔者的如下文章
http://czmmiao.iteye.com/admin/blogs/1554857
源端GoldenGate配置如下
GGSCI (rac1) 43> view params mgr
port 7500
GGSCI (rac1) 44> view params eora
extract eora
userid ogg,password ogg
exttrail ./dirdat/et
rmthost 192.168.1.112, mgrport 7500
rmttrail ./dirdat/rt
table hr.*;
GGSCI (rac1) 46> info exttrail *
Extract Trail: ./dirdat/et
Extract: EORA
Seqno: 2
RBA: 1038
File Size: 100M
Extract Trail: ./dirdat/rt
Extract: EORA
Seqno: 2
RBA: 69000
File Size: 100M
GGSCI (rac1) 47> info rmttrail *
Extract Trail: ./dirdat/et
Extract: EORA
Seqno: 2
RBA: 1038
File Size: 100M
Extract Trail: ./dirdat/rt
Extract: EORA
Seqno: 2
RBA: 69120
File Size: 100M
用如下匿名包向hr用户下的testgg的每20s插入数据
SQL> grant dba to hr;
Grant succeeded.
SQL> conn hr/hr;
Connected.
SQL> create table testgg(id int);
Table created.
SQL> begin
2 for i in 1..100000 loop
3 insert into testgg values(i);
4 commit;
5 dbms_lock.sleep(20);
6 end loop;
7 end;
8 /
启动extract进程
GGSCI (rac1) 42> start eora
Sending START request to MANAGER ...
EXTRACT EORA starting
GGSCI (rac1) 45> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA 00:00:00 00:00:00
备份源端数据库, 注意,一定要在抽取进程启动后进行数据备份
RMAN> run{
2> backup database format '/home/oracle/full_%U.dbf';
3> sql 'alter system archive log current';
4> backup archivelog all format '/home/oracle/arch_%U.dbf';
5> }
将备份文件拷贝到目标端
$scp full_0* 192.168.1.112:/home/oracle/
$scp arch_0* 192.168.1.112:/home/oracle
恢复目标端数据库,这里涉及到了RMAN的异机恢复,不清楚的读者可以参考笔者的如下文章
http://czmmiao.iteye.com/blog/1602553
目标端GoldenGate配置
GGSCI (rac2) 15> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT STOPPED PORA 00:00:00 00:00:03
GGSCI (rac2) 16> view params mgr
port 7500
GGSCI (rac2) 17> view params pora
replicat pora
setenv(ORACLE_SID=orcl)
userid ogg, password ogg
assumetargetdefs
handlecollisions
discardfile ./dirrpt/pora.dsc, purge
map hr.*, target hr.*;
GGSCI (rac2) 147> view params ./GLOBALS
checkpointtable ogg.checkczm
GGSCI (rac2) 149> add checkpointtable ogg.checkczm
Successfully created checkpoint table ggs.checkczm.
REPLICAT added.
恢复控制文件
SQL>startup nomount;
RMAN> restore controlfile from '/home/oracle/full_02ngko20_1_1.dbf';
Starting restore at 21-JUL-12
......省略若干行......
output filename=/u01/app/oradata/orcl/control03.ctl
Finished restore at 21-JUL-12
RMAN> sql 'alter database mount';
sql statement: alter database mount
released channel: ORA_DISK_1
RMAN> run{
2> allocate channel c1 type disk;
3> allocate channel c2 type disk;
4> restore database;
5> recover database;
6> }
allocated channel: c1
channel c1: sid=156 devtype=DISK
......省略若干行......
channel c1: restore complete, elapsed time: 00:01:15
Finished restore at 21-JUL-12
Starting recover at 21-JUL-12
starting media recovery
......省略若干行......
released channel: c2
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 07/21/2012 09:02:32
RMAN-06054: media recovery requesting unknown log: thread 1 seq 4 lowscn 480661
由于没有指定SCN,故报错RMAN-06054,这里可以忽略
SQL> alter database open resetlogs
查看数据库启动时的SCN,并从这个SCN之后启动Replicat进程
SQL> select checkpoint_change#,file# from v$datafile_header;
CHECKPOINT_CHANGE# FILE#
------------------ ----------
480661 1
480661 2
480661 3
480661 4
480661 5
REPLICAT PORA starting
验证数据一致性
源端
SQL> select count(*) from testgg
COUNT(*)
----------
141
目标端
SQL> select count(*) from testgg
COUNT(*)
----------
141
这种方法可以使用传输表空间或者基于备份的传输表空间来实现,这样就不需要对整个目标端数据库进行同步了,只需要同步所需的数据。
利用exp/imp 初始化数据
使用exp/imp(当然expdp/impdp同理)进行数据初始化的架构图和GoldeGate配置方法和使用RMAN是一致的,这里不再赘述,这里读者需要注意以下几个步骤
导出前,查看源端获得当前的scn号
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
4 92124
确认Extract进程已经启动
GGSCI (rac1) 45> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA 00:00:00 00:00:00
导出数据
$ exp system/oracle file=/home/oracle/hr_table.dmp triggers=n flashback_scn=480494 owner=hr
Export: Release 10.2.0.1.0 - Production on Sun Jul 22 11:16:15 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
......省略若干行......
. exporting statistics
Export terminated successfully without warnings.
复制到目标端
$scp hr_table.dmp 192.168.1.112:/home/oracle/
确认复制进程未启动
GGSCI (rac2) 15> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT STOPPED PORA 00:00:00 00:00:03
导入数据
$ imp system/oracle file=hr_table.dmp fromuser=hr touser=hr
Import: Release 10.2.0.1.0 - Production on Sun Jul 22 11:22:04 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
......省略若干行......
"END secure_dml;"
About to enable constraints...
Import terminated successfully with warnings.
有报错,但和本次数据导入无关,忽略
注意:如果数据量较大,则会造成大事务,且导入执行很长时间。如果imp操作被中断,这个中断将导致这个大事物的回滚,回滚会占用更多时间影响启动复制进程的时间,这是读者在日常工作中注意的问题
启动pora进程
GGSCI (rac2) 89> start pora,aftercsn 492124
Sending START request to MANAGER ...
REPLICAT PORA starting
GGSCI (rac2) 90> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING PORA 00:00:00 00:00:00
GGSCI (rac2) 91> send replicat pora,report
Sending REPORT request to REPLICAT PORA ...
Request processed.
验证数据一致性
源端
SQL> select count(*) from testgg
COUNT(*)
----------
1013
目标端
SQL> select count(*) from testgg
COUNT(*)
----------
1013
如果只是是某些表由于各种原因造成两边数据不一致,需要重新进行同步,则可以在map参数中增加filter选项解决,如
map hr.testgg, target hr.testgg, filter ( @GETENV ("TRANSACTION", "CSN") > 492124) ;
利用GoldenGate初始化导入数据
架构图
GoldenGate Initial Load直接初始化是GoldenGate Initial Load Extract进程获取的源端记录直接传输给目标端的Initial Load Replicat进程,这个过程由MGR进程动态的启动,不需要Collect进程和文件。
在Initial Load过程中,需要启动Extract和Replicat进程来获取Initial Load过程中的数据变化,然后部署到目标端,从而保证结果的一致。这种方式不支持LOB和LONG类型的数据。GoldenGate会根据MGR进程中的DYNAMICPORTLIST配置的端口列表来为Replicat进程动态的分配端口。
Extract进程和Replicat进程和前文所述的配置一致,这里不再赘述,下面介绍Initial Load进程的配置
源端
GGSCI (rac1) 60> view params extinit
extract extinit
userid ogg, password ogg
rmthost 192.168.1.112, mgrport 7500
rmttask replicat, group porarini
table hr.*;
GGSCI (rac1) 58> add extract extinit,sourceistable
EXTRACT added.
GGSCI (rac1) 59> info extract *,tasks
EXTRACT EXTINIT Initialized 2012-07-22 17:21 Status STOPPED
Checkpoint Lag Not Available
Log Read Checkpoint Not Available
First Record Record 0
Task SOURCEISTABLE
GGSCI (rac1) 61> start extinit
Sending START request to MANAGER ...
EXTRACT EXTINIT starting
GGSCI (rac1) 62> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING EORA 00:00:00 00:00:03
目标端
GGSCI (rac2) 115> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING PORA 00:00:00 00:00:05
GGSCI (rac2) 116> view params poraini
replicat poraini
assumetargetdefs
userid ogg, password ogg
discardfile ./dirrpt/poraini.dsc, purge
map hr.*, target hr.*;
GGSCI (rac2) 117> add replicat poraini, specialrun
三种方式的比较
RMAN:速度快,如果是对整个目标库进行数据同步,效果较为理想。如果针对所需数据进行同步,使用传输表空间的话,会造成生产端表空间read only的情况,如果是基于备份的传输表空间,则会造成存储空间的浪费
exp/imp:速度相对较快,同步方式也较为灵活,适用于同步意外终止的故障处理或者针对个别表进行初始化数据同步
Initial Load:速度较慢(网友的测试结果,笔者未做详细测试),但操作简单、灵活。
参考至: 《GoldenGate Windows and UNIX Administrator’s Guide》
《叱咤风云:GoldenGate企业级运维实战》戴冠平著
http://space.itpub.net/25264937/viewspace-716068
http://andrewliu.blog.51cto.com/3272341/668289
http://hi.baidu.com/oracle88/blog/item/c2c62408d1782024b0351d61.html
http://blog.csdn.net/tianlesoftware/article/details/6976551
http://blog.csdn.net/tianlesoftware/article/details/6982908
本文原创,转载请注明出处、作者
如有错误,欢迎指正
邮箱:czmcj@163.com