配置需求:
某用户ogg典型的多对一同步场景,如图所示:源端和目标端的操作系统、数据库版本及ogg版本如下:
参考4个理由:
1.原目标机老化,故障次数多
2.源端新增了oracle19.9环境需同步,考虑ogg版本兼容性
3.考虑应用系统的兼容性,目标端只能sqlserver
4.考虑迁移的稳定平滑性
所以选择新目标端使用新服务器(配置大于原目标机)并安装windows2012+sqlserver2012+ogg19.1.0.4版本。
由于迁移过程中发现源和目标数据库版本sqlserver2012库表结构,字段类型完全一样varchar(20)竟然还出现报错OGG-00869
虽然可以临时修改目标端字段类型为nvarchar(20)解决,但由于表和数据量太大,无法作此修改,因为原服务器环境并无此问题,怀疑是ogg存在兼容性bug。在目标端再安装老版本ogg12.1.2.0.1(从原目标服务器直接拷贝),配置不同服务名称及端口范围(区别ogg19)后同步正常
最终目标端同时存在两个ogg版本:
迁移思路:
1.目标端根据规划安装好操作系统、数据库和ogg软件,打上相应补丁。
2.目标端sqlserver配置ogg,数据源系统dsn,复制进程等
3.各个源端配置推送进程(新增的源端,还需要配置抽取进程)
安装关键步骤:
以下为目标端操作:
sqlserver配置数据源ODBC:
选择系统DSN
提前在sqlserver创建好ogg用户,并赋予相应db权限
系统数据源配置好之后,创建windows的ogg服务:
1-在goldengate环境ggsci下:
edit params ./GLOBALS
#(注意./GLOBALS为大写)编辑文件,添加以下内容。
MGRSERVNAME GGMGR
#GGMGR 是个性化设置的OGG管理进程服务名,保存退出。
2-在OGG安装目录下使用“以管理员身份运行”模式打开cmd提示符,执行命令,激活服务。
C:\OGG19c\oggcore_1>install addservice
Service’GGMGR’ created.
Installprogram terminated normally.
3-在Windows服务找到GGMGR,右键选择启动。
登录指定数据库test,增加checkpoint表:
dblogin sourcedb test,userid ogg,password xxxxxx
ADD CHECKPOINTTABLE dbo.ckpttab
配置MGR进程
GGSCI >edit params mgr
port 7809
DYNAMICPORTLIST 7808,7810-7890 --此处注意目标端的端口范围应包含所有源端的端口范围,否则可能出现OGG-01224连接拒绝的问题
ACCESSRULE,PROG *,IPADDR 192.168.*.*,ALLOW
autorestart er *, retries 5, waitminutes 3
purgeoldextracts D:\ogg\dirdat\*,usecheckpoints, minkeepdays 30
安装ogg19.1报错记录:
运行ogg遇到的问题:
解决办法:安装vc2013和2015
配置一个sqlserver源和目标端的操作实例:
1.源端操作:配置推送进程
add extract p_ba01, EXTTRAILSOURCE ./dirdat/ba --./dirdat/ba为本地抽取生成的队列名称,参看抽取参数view param e_ba01中的配置,意思是推送进程将读取本地队列ba
add rmttrail ./dirdat/b1, ext p_ba01, MEGABYTES 200 --./dirdat/b1为推送到目标端将生成的队列名称,这个b1在目标端生成
2.目标端操作:配置复制进程:
dblogin sourcedb test, userid ogg,password xxxx
ADD CHECKPOINTTABLE dbo.ckpttab
add replicat r_ba,exttrail D:\ogg\dirdat\b1,begin now,checkpointtable dbo.ckpttab --此处b1就是上述源端推送过来的队列
edit param r_ba --编辑复制进程
replicat r_ba
targetdb test, userid ogg,password xxxx
ALLOWNOOPUPDATES
SOURCECHARSET gbk
--HANDLECOLLISIONS--初始化完成后需注释掉该参数
REPLACEBADCHAR ESCAPE
sourcedefs ./dirdef/ba01.def --由于源端ogg版本<12.2,所以还需def表定义文件(从原目标机拷贝所有def文件到新目标机dirdef目录下)
discardfile ./dirrpt/r_ba01.dsc,append,megabytes 1024
REPORTROLLOVER AT 02:00 on sunday
DISCARDROLLOVER AT 02:00 on sunday
MAPEXCLUDE dbo.xxx;
map dbo.*,target dbo.*;
3.源端操作:启动抽取和推送进程
start e_ba01,tranlog,begin now
start p_ba01
4.备份sqlserver数据库,并拷贝到目标端还原
5.查看备份库的scn值xxx
SELECT top 3 [Current LSN] FROM sys.fn_dblog(NULL, NULL) order by [Current LSN] desc
https://sqlora.blog.csdn.net/article/details/109240835
Missing Records in Target Database After GoldenGate Direct Load RMTTASK Initial Load. SPECIALRUN (Doc ID 1467541.1)
方法2的参考:
4.配置目标端接收
replicat ir_5
--ASSUMETARGETDEFS
targetdb sqldb, userid ogg,password xxx
reperror default, discard
sourcedefs ./dirdef/p123.def
discardfile d:/ogg/dirrpt/ir_5.txt, append, megabytes 4000
MAP xxx.*,target dbo.*;
启动接收:
add replicat ir_5,specialrun
5.配置初始化推送
Extract i_5
setEnv ( ORACLE_SID = xxdb1)
userid ogg password oracle
rmthost 192.168.xxx.xxx, mgrport 7809
rmttask replicat,group ir_5
table xxx.xxx;
启动初始化抽取
add extract i_5,sourceistable
start i_5
启动复制进程r_ba等待复制进程执行的时间点超过初始化进程结束ir_5的时间点后,编辑复制端r_ba进程注释掉 HANDLECOLLISIONS 参数,并支持在线发送取消该参数(可在线取消无需重启复制进程,当然也可重启复制进程)
GGSCI (oem) 60> send replicat r_ba nohandlecollisions
6.目标端启动同步:
dblogin sourcedb sqldb,userid ogg, password xxx
add checkpinttable dbo.ckpttab
alter replicat r_ba01,extseqno xxx,extrba 0
start r_ba01,aftercsn xxxxxx
遇到的错误:
1)ogg-01264 The call to the cm_mmap() function from ano_get() returned an unexpected value
处理办法:抽取进程添加CACHMGR CACHESIZE 64GB
2)OGG-01496 Failed to open target trail file
处理办法:滚动生成下一个推送队列alter extract xxx,etrollover
3)OGG-01192 Trying to use RMTTASK on data types which may be written as LOB chunks
处理办法:参考How to initial load files/tables larger than 2 gig using rmtfile (Doc ID 1195705.1)
源端:extract paramfile d:\ggs\dirprm\i_6.prm reportfile d:\ggs\dirrpt\i_6.txt
extract i_6
SOURCEISTABLE
setEnv (ORACLE_SID = xxdb1)
userid ogg password oracle
rmthost 192.168.xx.xxx, mgrport 7809
rmtfile ./dirdat/pa,maxfiles 5,MEGABYTES 2000, PURGE
--rmttask replicat,group ir_5
table xxx.xxx;
目标端:
ggsci> add rep ir_6, exttrail ./gg/dirdat/pa, nodbcheckpoint
replicat ir_6
--ASSUMETARGETDEFS
--SPECIALRUN
--END RUNTIME
targetdb sqldb, userid ogg,password xxx
reperror default, discard
--extfile ./dirdat/pa
sourcedefs ./dirdef/p123.def
discardfile d:/ogg/dirrpt/ir_6.txt, append, megabytes 4000
MAP xxx.*,target dbo.*;
4)目标端复制进程 SQL报错error 1946索引条目长度超出了允许的最大长度900
处理办法:根据实际情况删掉目标端超长索引
5)源端推送显示running,目标端也没报错,源端检查发现info xxx发现是读取ba000000
处理办法:指定读取队列号重启推送alter extract p_ba01,extseqno xxx,extrba 0
6)新问题:OGG-01332,OGG-01232
本以为源端推送进程修改添加参数format release 12.1可解决,但错误依旧:(见问题6)
rmttrail ./dirdat/r2,format release 12.1
alter extract p2, etrollover
目标端重新应用队列:
stop rep2
ALTER REPLICAT rep2,EXTSEQNO xxx, EXTRBA 0
start rep2
info rep2
由于源端是12.3,目标端12.1.2,不支持,报错如下:
原因:
https://docs.oracle.com/goldengate/c1230/gg-winux/OGGRN/whats-new-this-release.htm#OGGRN-GUID-3BE8D087-CEAE-40B1-BACC-4809BAA9838A
解决办法:
目标端ogg改为使用19.1的
7)问题:目标端同步报错OGG-01154主键重复插入失败
处理办法:–HANDLECOLLISIONS取消注释,然后重启复制进程,待同步后再注释掉。