简单说明:
本实验实际上是将一个业务用户切分成两个抽取进程,每个抽取进程切分成两个甚至多个应用进程进行应用
清理《11. Setting up a simple GoldenGate replication confguration between two single node databases》
实验的环境,进行本章节的实验:
源端清理:
su - oracle
cd /ggs
./ggsci
DBLOGIN, USERID ggs PASSWORD ggs
stop *
DELETE EGGTEST1
DELETE PGGTEST1
exit
rm -rf /ggs/dirprm/EGGTEST1.prm
rm -rf /ggs/dirprm/PGGTEST1.prm
rm -rf /ggs/dirdat/st*
sqlplus / as sysdba
drop user scott cascade;
exit
目标端清理:
su - oracle
cd /ggs
./ggsci
DBLOGIN, USERID ggs PASSWORD ggs
stop *
delete RGGTEST1
DELETE CHECKPOINTTABLE ggs.rggtest1_ckpt !
-- 此处使用感叹号取消交互式确定
exit
rm -rf /ggs/dirprm/RGGTEST1.prm
rm -rf /ggs/dirdat/rt*
sqlplus / as sysdba
drop user scott cascade;
exit
源端和目标端均部署Oracle的样例数据库SCOTT,并打开表级附加日志:
su - oracle
sqlplus / as sysdba
@?/rdbms/admin/utlsampl.sql
cd /ggs
./ggsci
DBLOGIN USERID system PASSWORD oracle
ADD TRANDATA SCOTT.*
INFO TRANDATA SCOTT.*
exit
源端操作:
1° 源端配置两个抽取进程的配置文件:
su - oracle
cd /ggs/dirprm
cat >EGGTEST1.prm<<EOF
EXTRACT EGGTEST1
USERID ggs, PASSWORD ggs
EXTTRAIL /ggs/dirdat/EGGTEST1/st
TABLE SCOTT.BONUS,FILTER (@RANGE (1,2));
TABLE SCOTT.DEPT,FILTER (@RANGE (1,2));
TABLE SCOTT.EMP,FILTER (@RANGE (1,2));
TABLE SCOTT.SALGRADE,FILTER (@RANGE (1,2));
EOF
cat >EGGTEST2.prm<<EOF
EXTRACT EGGTEST2
USERID ggs, PASSWORD ggs
EXTTRAIL /ggs/dirdat/EGGTEST2/st
TABLE SCOTT.BONUS,FILTER (@RANGE (2,2));
TABLE SCOTT.DEPT,FILTER (@RANGE (2,2));
TABLE SCOTT.EMP,FILTER (@RANGE (2,2));
TABLE SCOTT.SALGRADE,FILTER (@RANGE (2,2));
EOF
# 创建配置文件中所需的目录
mkdir -v /ggs/dirdat/EGGTEST1
mkdir -v /ggs/dirdat/EGGTEST2
2° 源端配置两个发送进程的配置文件:
su - oracle
cd /ggs/dirprm
cat >PGGTEST1.prm<<EOF
EXTRACT PGGTEST1
USERID ggs, PASSWORD ggs
RMTHOST 192.168.77.11, MGRPORT 8809
RMTTRAIL /ggs/dirdat/PGGTEST1/rt
TABLE SCOTT.*;
EOF
cat >PGGTEST2.prm<<EOF
EXTRACT PGGTEST2
USERID ggs, PASSWORD ggs
RMTHOST 192.168.77.11, MGRPORT 8809
RMTTRAIL /ggs/dirdat/PGGTEST2/rt
TABLE SCOTT.*;
EOF
# 目标端创建配置文件中所需的目录
ssh 192.168.77.11 mkdir -v /ggs/dirdat/PGGTEST1
ssh 192.168.77.11 mkdir -v /ggs/dirdat/PGGTEST2
3° 源端配置俩抽取进程和俩发送进程:
su - oracle
cd /ggs
./ggsci
DBLOGIN USERID ggs PASSWORD ggs
ADD EXTRACT EGGTEST1, TRANLOG, BEGIN NOW
ADD EXTRACT EGGTEST2, TRANLOG, BEGIN NOW
ADD EXTTRAIL /ggs/dirdat/EGGTEST1/st, EXTRACT EGGTEST1
ADD EXTTRAIL /ggs/dirdat/EGGTEST2/st, EXTRACT EGGTEST2
ADD EXTRACT PGGTEST1, EXTTRAILSOURCE /ggs/dirdat/EGGTEST1/st
ADD EXTRACT PGGTEST2, EXTTRAILSOURCE /ggs/dirdat/EGGTEST2/st
ADD RMTTRAIL /ggs/dirdat/PGGTEST1/rt, EXTRACT PGGTEST1
ADD RMTTRAIL /ggs/dirdat/PGGTEST2/rt, EXTRACT PGGTEST2
目标端操作:
1° 目标端创建四个应用进程的配置文件
第一个和第二个是一套,第三个和第四个是一套
每套都对应一个发送进程:
su - oracle
cd /ggs/dirprm
cat >RGGTEST1.prm<<EOF
REPLICAT RGGTEST1
USERID ggs, PASSWORD ggs
DISCARDFILE /ggs/dirrpt/RGGTEST1.dsc,append,MEGABYTES 500
ASSUMETARGETDEFS
MAP SCOTT.BONUS, TARGET SCOTT.BONUS,FILTER (@RANGE (1,2));
MAP SCOTT.DEPT, TARGET SCOTT.DEPT,FILTER (@RANGE (1,2));
MAP SCOTT.EMP, TARGET SCOTT.EMP,FILTER (@RANGE (1,2));
MAP SCOTT.SALGRADE, TARGET SCOTT.SALGRADE,FILTER (@RANGE (1,2));
EOF
cat >RGGTEST2.prm<<EOF
REPLICAT RGGTEST2
USERID ggs, PASSWORD ggs
DISCARDFILE /ggs/dirrpt/RGGTEST2.dsc,append,MEGABYTES 500
ASSUMETARGETDEFS
MAP SCOTT.BONUS, TARGET SCOTT.BONUS,FILTER (@RANGE (2,2));
MAP SCOTT.DEPT, TARGET SCOTT.DEPT,FILTER (@RANGE (2,2));
MAP SCOTT.EMP, TARGET SCOTT.EMP,FILTER (@RANGE (2,2));
MAP SCOTT.SALGRADE, TARGET SCOTT.SALGRADE,FILTER (@RANGE (2,2));
EOF
cat >RGGTEST3.prm<<EOF
REPLICAT RGGTEST3
USERID ggs, PASSWORD ggs
DISCARDFILE /ggs/dirrpt/RGGTEST3.dsc,append,MEGABYTES 500
ASSUMETARGETDEFS
MAP SCOTT.BONUS, TARGET SCOTT.BONUS,FILTER (@RANGE (1,2));
MAP SCOTT.DEPT, TARGET SCOTT.DEPT,FILTER (@RANGE (1,2));
MAP SCOTT.EMP, TARGET SCOTT.EMP,FILTER (@RANGE (1,2));
MAP SCOTT.SALGRADE, TARGET SCOTT.SALGRADE,FILTER (@RANGE (1,2));
EOF
cat >RGGTEST4.prm<<EOF
REPLICAT RGGTEST4
USERID ggs, PASSWORD ggs
DISCARDFILE /ggs/dirrpt/RGGTEST4.dsc,append,MEGABYTES 500
ASSUMETARGETDEFS
MAP SCOTT.BONUS, TARGET SCOTT.BONUS,FILTER (@RANGE (2,2));
MAP SCOTT.DEPT, TARGET SCOTT.DEPT,FILTER (@RANGE (2,2));
MAP SCOTT.EMP, TARGET SCOTT.EMP,FILTER (@RANGE (2,2));
MAP SCOTT.SALGRADE, TARGET SCOTT.SALGRADE,FILTER (@RANGE (2,2));
EOF
2° 目标端添加四个检查点表:
cd /ggs
./ggsci
DBLOGIN USERID ggs PASSWORD ggs
ADD CHECKPOINTTABLE ggs.rggtest1_ckpt
ADD CHECKPOINTTABLE ggs.rggtest2_ckpt
ADD CHECKPOINTTABLE ggs.rggtest3_ckpt
ADD CHECKPOINTTABLE ggs.rggtest4_ckpt
exit
3° 目标端添加四个应用进程:
cd /ggs
./ggsci
DBLOGIN USERID ggs PASSWORD ggs
ADD REPLICAT RGGTEST1, EXTTRAIL /ggs/dirdat/PGGTEST1/rt, CHECKPOINTTABLE ggs.rggtest1_ckpt
ADD REPLICAT RGGTEST2, EXTTRAIL /ggs/dirdat/PGGTEST1/rt, CHECKPOINTTABLE ggs.rggtest2_ckpt
ADD REPLICAT RGGTEST3, EXTTRAIL /ggs/dirdat/PGGTEST2/rt, CHECKPOINTTABLE ggs.rggtest3_ckpt
ADD REPLICAT RGGTEST4, EXTTRAIL /ggs/dirdat/PGGTEST2/rt, CHECKPOINTTABLE ggs.rggtest4_ckpt
exit
源端和目标端启动进程并验证:
1° 源端启动抽取和发送进程:
cd /ggs
./ggsci
START EXTRACT EGGTEST1
START EXTRACT PGGTEST1
START EXTRACT EGGTEST2
START EXTRACT PGGTEST2
INFO ALL
INFO *
exit
2° 目标端启动应用进程:
cd /ggs
./ggsci
START REPLICAT RGGTEST1
START REPLICAT RGGTEST2
START REPLICAT RGGTEST3
START REPLICAT RGGTEST4
INFO ALL
INFO *
exit
3° 同步验证:
# 源端:
sqlplus scott/tiger
insert into SALGRADE select * from SALGRADE;
insert into SALGRADE select * from SALGRADE;
insert into SALGRADE select * from SALGRADE;
insert into SALGRADE select * from SALGRADE;
insert into SALGRADE select * from SALGRADE;
commit;
select count(*) from SALGRADE;
exit
# 目标端:
sqlplus scott/tiger
select count(*) from SALGRADE;
exit
# 继续监控源端和目标端OGG进程,验证同步成功
简单总结:
本例中,我们使用了含有RANGE操作的FILTER子句,将抽取进程的负载切分到了两个流里面:
FILTER (@RANGE (1,2))和FILTER (@RANGE (2,2))
FILTER clause子句用来提升OGG进程性能
RANGE通过计算表中的键值列的hash值来均匀的分割负载到多个流中
两者连用使每一个提取进程只处理一半的负载
每一个提取进程将自己的trail文件写入到自己的trail文件目录中
并且在源端分别为其配置了一个专用的发送进程投递这些trail文件
这些发送进程分别将各自的trail文件投递到目标端并写入了相互分离的目录中
目标端的应用进程负载又被分割成了四个流,每两个流对应一个发送进程
依然使用 FILTER (@RANGE (1,2))和FILTER (@RANGE (2,2)) 进行拆分
负载切分调优思路:
有些时候会发现,增加额外的应用进程组是唯一解决OGG复制慢的方法,这里有多种分割负载到多个进程的方法:
1,可以指定不同的表到不同的进程,为某些表单独指定进程,而非一个业务账号只使用一个进程
2,依据经验,将业务相关的表放在一起进行传输
3,具有参照完整性的表要放在同一个进程组里
4,可以使用RANGE在逻辑上分割相关的表的负载到多个流里面
5,如果单个表的负载过大,单独的进程处理不过来,应该使用RANGE分割
[TOC]