数据初始化(initial data load)
在进行同步以前,要先对目标端的数据进行初始化
在线迁移有几种方法,这里采取比较靠谱的两种:通过数据库工具(expdp/impdp)和通过文件导入到replicat。我们将这两种方法分别应用在两组抽取/复制对应的4个数据库用户上。w1ext对应的dycommondatabase20用户和dyulcentermanage使用前者,w2ext对应的dyacdb34和dyulcenterm_bak使用后者。
通过expdp/impdp来迁移初始数据
流程图如下:
准备工作
1. 禁用DDL的抽取和复制
在extract和replicat参数中将ddl去掉。实际上,若能保证在expdp导出数据期间不会有ddl操作,可以忽略此项
2. 在replicat中使用HANDLECOLLISIONS参数。每一个目标表都必须由一个主键或唯一键。如果没有,使用KEYCOLS选项来代替,如果不能指定,祈祷不会出现两条完全一样的记录吧...
在源端和目标端打开MANAGER
在源端和目标端执行ggsci命令start mgr,启动manager进程
在源端,打开extract进程
GGSCI (rac1) 35>
start ext w1ext
Sending START request to MANAGER ...
EXTRACT W1EXT starting
GGSCI (rac1) 36>
start ext w1extdp
Sending START request to MANAGER ...
EXTRACT W1EXTDP starting
GGSCI (rac1) 37>
info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING W1EXT 00:00:00 00:00:05
EXTRACT RUNNING W1EXTDP 00:00:00 02:00:51
EXTRACT STOPPED W2EXT 00:00:00 01:54:09
EXTRACT STOPPED W2EXTDP 00:00:00 01:50:00
在源端,执行expdp导出数据
首先需要在源数据中创建一个directory:
SQL>
create directory expdpdir as '/bak/expdpdata';
Directory created.
执行导出:
[oracle@rac1 ~]$
expdp system/aaa directory=expdpdir dumpfile=w1data_%U.dmp logfile=w1data.log schemas=dycommondatabase20, dyulcentermanage parallel=4
将初始数据导入到目标数据库
先通过ftp将expdp导出的文件拷贝到目标主机上:
目标端:
[oracle@ggdb ~]$ ftp 192.168.47.241
Connected to 192.168.47.241.
……
ftp> cd /bak/expdpdata
250 Directory successfully changed.
ftp> lcd /bak/impdpdata
Local directory now /bak/impdpdata
ftp> bin
200 Switching to Binary mode.
ftp> mget w1*
创建directory:
SQL> create directory impdpdir as '/bak/impdpdata';
Directory created.
需要的表空间也要先创建好
数据导入:
impdp system/aaa directory=impdpdir dumpfile=w1data_%U.dmp logfile=w1data_impdp.log schemas=dycommondatabase20, dyulcentermanage parallel=4
由于数据库版本是10.2.0.4,需要在目标库中禁用我们要同步的用户中的触发器
SQL>
begin
for x in (select owner,trigger_name from dba_triggers
where owner in ('DYCOMMONDATABASE20', 'DYULCENTERMANAGE'))
loop
execute immediate 'alter trigger '||x.owner||'.'||x.trigger_name||' disable';
end loop;
end;
/
在目标端,启动复制进程
impdp导入结束之后,启动复制进程
GGSCI (ggdb) 51>
start rep dyrep
Sending START request to MANAGER ...
REPLICAT DYREP starting
通过info replicat dyrep 命令来查看复制的状态
在目标端的数据变化追上initial-load结束的时间点后,关闭handlecollisions参数: 先使用SEND REPLICAT命令使之对运行中的replicat生效,然后修改参数文件,使其在下一次启动时生效。
GGSCI (ggdb) 57>
SEND REPLICAT w1rep, NOHANDLECOLLISIONS
Sending NOHANDLECOLLISIONS request to REPLICAT W1REP ...
W1REP No tables found matching GOLDENGATE.* to set NOHANDLECOLLISIONS.
然后修改dyrep参数文件,去掉handlecollisions参数
通过文件到replicat方式来迁移初始数据
流程图如下所示
expdp/impdp的优势之一就是导入很快,而通过文件到replicat的方式,需要一条一条地应用到目标库中,因此导入是最慢的
准备工作
1. 禁用DDL的抽取和复制
2. 确认目标端表是空的
3. 禁用外键及check约束
4. 在replicat中使用HANDLECOLLISIONS参数
5. 可以删除大表中的索引以加快导入速度,导入结束后再重建索引
在源端和目标端打开MANAGER
在源端和目标端执行ggsci,打开manager
start mgr
这一步在上面已经做过了,就不再重复
配置初始化extract
在源端,添加一个extract,并配置参数
GGSCI (rac1) 1>
add extract einit,sourceistable
EXTRACT added.
参数说明:
1.SOURCEISTABLE:将源数据库中指定的表中的所有记录导出到指定的文件中,一般用于initial-data load
2. RMTFILE:目标文件的路径。设置最大文件数和最大文件大小,否则当文件超过2GB时会出错
GGSCI (rac1) 2>
edit params einit
EXTRACT einit
SOURCEISTABLE
USERID GOLDENGATE, PASSWORD GOLDENGATE
RMTHOST 192.168.47.211, MGRPORT 5898
RMTFILE /opt/gg/trails/initdata,purge,maxfiles 100,megabytes 1024
TABLE dyacdb34.*;
TABLE dyulcenterm_bak.*;
在目标库中创建表空间、用户及表结构
在导入数据以前,需要准备好这个容器
我们使用expdp来导出,不导出表中的数据:
源端:
[oracle@rac1 ~]$
expdp system/aaa directory=expdpdir dumpfile=w2data.dmp logfile=w2data.log schemas= DYACDB34,DYULCENTERM_BAK exclude=table_data,table_statistics
目标端:
[oracle@ggdb ~]$
ftp 192.168.47.241
Connected to 192.168.47.241.
……
ftp>
cd /bak/expdpdata
250 Directory successfully changed.
ftp>
lcd /bak/impdpdata
Local directory now /bak/impdpdata
ftp>
bin
200 Switching to Binary mode.
ftp>
mget w2*
导入用户及其表结构:
[oracle@ggdb ~]$
impdp system/aaa directory=impdpdir dumpfile=w2data.dmp logfile=w2data_imp.log schemas=DYACDB34,DYULCENTERM_BAK
禁用约束:
SQL>
begin
for x in (select owner,table_name,constraint_name from dba_constraints where owner in ('DYACDB34', 'DYULCENTERM_BAK') and constraint_type in ('C','R')) loop
execute immediate 'alter table '||x.owner||'.'||x.table_name||
' disable constraint '||x.constraint_name;
end loop;
dbms_output.put_line('ok');
end;
/
禁用触发器:
SQL>
begin
for x in (select owner,trigger_name from dba_triggers
where owner in ('DYACDB34', 'DYULCENTERM_BAK'))
loop
execute immediate 'alter trigger '||x.owner||'.'||x.trigger_name||' disable';
end loop;
end;
/
在源端,打开抽取进程
GGSCI (rac1) 3>
start ext w2ext
Sending START request to MANAGER ...
EXTRACT W2EXT starting
GGSCI (rac1) 4>
start ext w2extdp
Sending START request to MANAGER ...
EXTRACT W2EXTDP starting
GGSCI (rac1) 5>
info all
Program Status Group Lag Time Since Chkpt
MANAGER RUNNING
EXTRACT RUNNING W1EXT 00:00:00 00:00:08
EXTRACT RUNNING W1EXTDP 00:00:00 00:00:05
EXTRACT RUNNING W2EXT 02:58:57 00:00:04
EXTRACT RUNNING W2EXTDP 00:00:00 03:03:40
在源端,启动initial-load extract
[goldengate@rac1 ~]$
cd $GG_HOME
[goldengate@rac1 goldengate]$
./extract paramfile dirprm/einit.prm reportfile /opt/gg/einit.log
通过查看报告文件监控抽取的过程和结果,直到抽取结束
配置初始化replicat
在目标端,添加一个replicat,并配置参数
GGSCI (rac2) 1>
add replicat rinit,specialrun
REPLICAT added.
参数说明:
1. SPECIALRUN:一次性的导入,不会产生checkpoint。一般用于通过文件到replicat的初始数据的加载,或者批量进行更新同步
2. EXTFILE:指定数据所在文件的路径,文件名需要输入全称
3. ASSUMETARGETDEFS:由于源和目标数据需要同步的表的结构一致,指定该参数以提高效率
GGSCI (rac2) 2>
edit params rinit
REPLICAT rinit
SPECIALRUN
USERID GOLDENGATE,PASSWORD GOLDENGATE
EXTFILE /opt/gg/trails/initdata000000
ASSUMETARGETDEFS
MAP DYACDB34.* , TARGET DYACDB34.* ;
MAP DYULCENTERM_BAK.* , TARGET DYULCENTERM_BAK.* ;
在目标端,启动initial-load replicat
[goldengate@ggdb goldengate]$
cd $GG_HOME
[goldengate@ggdb goldengate]$
./replicat paramfile dirprm/rinit.prm reportfile /opt/gg/rinit.log
我的测试环境中由于生成了3个extfile,需要修改rinit参数文件,将extfile文件名修改,再执行2次。也可以增加两个specialrun的replicat来同时执行。导入结束后注意查看生成的日志,确保没有出现错误
在目标端,启动复制进程
在initial-load replication结束之后,启动复制进程
GGSCI (ggdb) 51>
start rep w2rep
Sending START request to MANAGER ...
REPLICAT W2REP starting
通过info replicat w2rep 命令来查看复制的状态
在目标端的数据变化追上initial-load结束的时间点后,关闭handlecollisions参数: 先使用SEND REPLICAT命令使之对运行中的replicat生效,然后修改参数文件,使其在下一次启动时生效。
GGSCI (ggdb) 57>
SEND REPLICAT w2rep, NOHANDLECOLLISIONS
Sending NOHANDLECOLLISIONS request to REPLICAT W2REP ...
W2REP No tables found matching GOLDENGATE.* to set NOHANDLECOLLISIONS.
然后修改w2rep参数文件,去掉handlecollisions参数
重新启用目标数据库中导入数据前禁用的约束:
SQL>
begin
for x in (select owner,table_name,constraint_name from dba_constraints where owner in ('DYACDB34', 'DYULCENTERM_BAK') and constraint_type in ('C','R')) loop
execute immediate 'alter table '||x.owner||'.'||x.table_name||
' enable constraint '||x.constraint_name;
end loop;
dbms_output.put_line('ok');
end;
/
可以试着在源数据库中进行一些ddl或dml操作,在目标端使用ggsci命令stats或在数据库中查看更改是否被应用了。
这里GoldenGate就配置完成了
GoldenGate配置实例:RHEL 4.7下的Oracle 10g RAC到单实例的单向同步(一)
http://blog.csdn.net/wildwave/article/details/7053768
GoldenGate配置实例:RHEL 4.7下的Oracle 10g RAC到单实例的单向同步(二)
http://blog.csdn.net/wildwave/article/details/7056362
GoldenGate配置实例:RHEL 4.7下的Oracle 10g RAC到单实例的单向同步(三)
http://blog.csdn.net/wildwave/article/details/7056451
GoldenGate配置实例:RHEL 4.7下的Oracle 10g RAC到单实例的单向同步(四)
http://blog.csdn.net/wildwave/article/details/7056500