简单说明:
本实验中将会模拟源库100万条记录的EMP表到目标库的复制
复制过程中源表会有事务执行,也就是模拟生产不停机的环境
环境准备:
依据《11. Setting up a simple GoldenGate replication confguration between two single node databases》
部署实验环境,停掉应用进程,因为需要在源库重新初始化emp表并插入数据,因此要停掉应用进程
数据准备完成后,需要根据源端的SCN启动应用进程,不能使应用进程执行重新初始化emp表的操作
环境准备操作如下:
1° 在源端和目标端重新创建SCOTT.EMP表:
su - oracle
sqlplus scott/tiger
drop table emp purge;
CREATE TABLE EMP (
EMPNO NUMBER(10) PRIMARY KEY,
ENAME VARCHAR2(25),
JOB VARCHAR2(25),
MGR NUMBER(10),
HIREDATE DATE,
SAL NUMBER(20,2),
COMM NUMBER(20,2),
DEPTNO NUMBER(10),
CITY VARCHAR2(25));
exit
2° 在源端使用以下脚本插入100万条数据:
su - oracle
sqlplus scott/tiger
BEGIN
FOR I IN 1..250000 LOOP
INSERT INTO EMP VALUES
(0+I,'TOM'||I,'WORKER',7369,TO_DATE('07-11-2012','DD-MM-YYYY'),10000+I,I,10,'LONDON');
INSERT INTO EMP VALUES
(250000+I,'BOB'||I,'DBA',7499,TO_DATE('07-11-2012','DD-MM-YYYY'),260000+I,I,10,'PARIS');
INSERT INTO EMP VALUES
(500000+I,'ALEX'||I,'DEVELOPER',7521,TO_DATE('07-11-2012','DD-MM-YYYY'),500000+I,I,10,'TOKYO');
INSERT INTO EMP VALUES
(750000+I,'SAM'||I,'SALESMAN',7934,TO_DATE('07-11-2012','DD-MM-YYYY'),750000+I,I,10,'BOSTON');
END LOOP;
COMMIT;
END;
/
exit
3° 源库开启EMP表的附加日志:
su - oracle
cd /ggs
./ggsci
DBLOGIN USERID system PASSWORD oracle
ADD TRANDATA scott.emp
INFO TRANDATA scott.emp
exit
4° 如果OGG数据库用户遵循权限最小化原则,则需要重新赋权:
su - oracle
sqlplus / as sysdba
GRANT SELECT ON SCOTT.EMP TO GGS;
GRANT UPDATE ON SCOTT.EMP TO GGS;
GRANT INSERT ON SCOTT.EMP TO GGS;
GRANT DELETE ON SCOTT.EMP TO GGS;
exit
# 源库需要select权限
# 目标库需要DML权限
实验步骤:
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
-- 源表和目标表结构一致
HANDLECOLLISIONS
-- 解决冲突的参数,初始化同步后需要关闭
MAP SCOTT.emp, TARGET SCOTT.emp;
EOF
2° 源端配置OGG初始化数据同步抽取进程:
# 编辑配置
su - oracle
cd /ggs/dirprm
cat>EXTINIT.prm<<EOF
EXTRACT EXTINIT
SOURCEISTABLE
-- 区别于一般抽取进程的参数
USERID ggs, PASSWORD ggs
RMTHOST 192.168.77.11, MGRPORT 8809
RMTFILE /ggs/dirdat/extinit.dat, PURGE
-- 目标端trail文件的全路径,使用PURGE参数删除原来的文件
TABLE SCOTT.EMP;
EOF
# 添加进程
cd /ggs
./ggsci
ADD EXTRACT EXTINIT, SOURCEISTABLE
exit
3° 目标端配置OGG初始化数据同步应用进程:
# 编辑配置
su - oracle
cd /ggs/dirprm
cat>RPTINIT.prm<<EOF
REPLICAT RPTINIT
SPECIALRUN
-- 区别于一般应用进程的参数
USERID ggs, PASSWORD ggs
EXTFILE /ggs/dirdat/extinit.dat
DISCARDFILE ./dirrpt/rptinit.dsc, PURGE
ASSUMETARGETDEFS
-- 源表和目标表结构一致
MAP SCOTT.EMP, TARGET SCOTT.EMP;
END RUNTIME
-- 区别于一般应用进程的参数
EOF
# 添加进程
cd /ggs
./ggsci
dblogin userid ggs,password ggs
add checkpointtable ggs.rptinit_ckpt
ADD REPLICAT RPTINIT, EXTFILE ./dirdat/extinit.dat, checkpointtable ggs.rptinit_ckpt
exit
4° 源端库信息验证,记录SCN:
su - oracle
sqlplus scott/tiger
SELECT CITY,COUNT(*) FROM EMP GROUP BY CITY;
conn / as sysdba
select to_char(current_scn) from v$database;
-- 304670
-- 一定要记录SCN,后期步骤需要基于该SCN启动原来的应用进程
exit
5° 源端抽取进程启动:
su - oracle
cd /ggs
echo 'START EXTRACT EXTINIT'|./ggsci
echo 'STATUS EXTRACT EXTINIT'|./ggsci
# 监控抽取进程的状态
echo 'INFO EXTRACT *, TASKS'|./ggsci
6° 目标端应用进程启动:
su - oracle
cd /ggs
echo 'START REPLICAT RPTINIT'|./ggsci
echo 'STATUS REPLICAT RPTINIT'|./ggsci
7° 源端模拟业务操作:
su - oracle
sqlplus scott/tiger
DELETE EMP WHERE EMPNO>650000 and CITY='TOKYO';
UPDATE EMP SET CITY='SHANGHAI' where CITY='TOKYO';
COMMIT;
exit
8° 目标端初始化应用进程自动关闭时验证数据:
su - oracle
cd /ggs
echo 'STATUS REPLICAT RPTINIT'|./ggsci
# 查看日志是否报错
cat /ggs/ggserr.log |grep -iv info
sqlplus scott/tiger
SELECT CITY,COUNT(*) FROM EMP GROUP BY CITY;
exit
# 查看表数据,发现数据和初始化同步之时的状态相同
9° 目标端原应用进程启动,数据验证:
su - oracle
cd /ggs
./ggsci
START REPLICAT RGGTEST1, AFTERCSN 304670
-- 要从初始化同步时候的SCN启动应用进程
-- 否则初始化同步之前的表重建和数据灌入语句都会同步到目标端造成问题
-- 此处基于SCN的启动应用进程,关键字区别于10g的环境
exit
sqlplus scott/tiger
SELECT CITY,COUNT(*) FROM EMP GROUP BY CITY;
exit
# 经验证,初始化同步时的事务被执行,实验成功
10° 目标端应用进程配置更改重启:
su - oracle
cd /ggs
./ggsci
STOP REPLICAT RGGTEST1
EDIT PARAMS RGGTEST1
-- 删除配置文件中的 HANDLECOLLISIONS 参数
-- 保存退出
START REPLICAT RGGTEST1
-- 删除目标端初始化应用进程
dblogin userid ggs,password ggs
DELETE REPLICAT RPTINIT
DELETE checkpointtable ggs.rptinit_ckpt !
exit
rm -rf /ggs/dirdat/extinit.dat
11° 源端删除初始化抽取进程:
su - oracle
cd /ggs
./ggsci
dblogin userid ggs,password ggs
STATUS EXTRACT EXTINIT
INFO EXTRACT *, TASKS
DELETE EXTRACT EXTINIT
exit
rm -rf /ggs/dirprm/EXTINIT.prm
实验总结:
本实验演示 Extract file to the Replicat method 的方法初始化同步一个表,表数据产生的同步文件不能大于2GB
本实验是在原来的抽取发送应用进程之外单独配置一套抽取应用进程
原抽取发送应用进程只做emp表的复制,否则就需要停掉源库所有业务SQL
源库初始化emp表,灌入数据,记录SCN后启动业务SQL
源库和目标库均重建emp表,但只有源库初始化该表的数据,目标库该表为空
原抽取发送进程保持运行状态,用于抽取源库所有的变化
原应用进程处于关闭状态,添加HANDLECOLLISIONS参数,用于初始化同步时发生的事务应用时的冲突解决
源库创建抽取进程,参数SOURCEISTABLE告诉OGG从数据库中抽取数据,而不是redo或归档中抽取
新建的抽取进程抽取数据后,直接写入目标端的对应trail文件,不写本地trail文件
目标端配置初始化应用进程,读取该文件,初始化同步emp表
使用参数SPECIALRUN和EXTFILE来标明该应用进程是初始化同步应用进程,而非普通的应用进程
该应用进程完成初始化同步后,自动停止
然后启动原来的应用进程,注意要以初始化同步时的SCN进行启动,并且要包含HANDLECOLLISIONS参数
同步完成后,应当关闭原应用进程,剔除HANDLECOLLISIONS参数,启动恢复
综上所述,该方法想当繁琐,而且只能做较小数据容量的初始化同步,应用范围应当想当狭小
如果某张表或者某些表出现故障需要重新初始化同步:
原来的应用进程中剔除掉这些表:关闭进程,使用exclude参数剔除表,启动进程
删除目标库这些表的数据
使用数据泵或其他方式基于SCN初始化同步这些表
配置新的应用进程,挂接原应用进程使用的目标端trail文件
基于SCN启动新的应用进程
追平数据后,停止抽取进程
俩应用进程停止,删掉新建的应用进程,原应用进程剔除表操作回滚
启动抽取进程
该方法比本博文实验的OGG初始化同步方法思路更为清晰,而且原理相似,只是使用OGG的方法代替了数据泵初始化同步...
[TOC]