现在的位置: 首页 > 综合 > 正文

GoldenGate配置实例:RHEL 4.7下的Oracle 10g RAC到单实例的单向同步(三)

2012年11月25日 ⁄ 综合 ⁄ 共 6513字 ⁄ 字号 评论关闭
文章目录

数据初始化(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

抱歉!评论已关闭.