作者 | JiekeXu
来源 | JiekeXu DBA之路(ID: JiekeXu_IT)
大家好,我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看 OGG 初始化数据问题处理,欢迎点击上方蓝字关注我,标星或置顶,更多干货第一时间到达!
各位看官您请座,看我慢慢道来。利用 OGG 19.1 同步数据库 11g 到 19c 的测试迁移工作,OGG 搭建完毕后,使用数据泵初始化数据后。目标端启动 rep 进程,出现 OGG-01004 的问题。
2021-08-18 17:06:27 WARNING OGG-01004 Aborted grouped transaction on PROD_JIEKEXU.T_SYS_FILE_RET_TASK, Database error 1403 (No data found).
个人 OGG 相关知识也只还是入门阶段,到处碰壁,现在对于这个问题做一个简单的总结回顾。
下面一起回顾下:2021-08-17 下午前(记住时间点更容易理解),完成 OGG 的搭建及配置工作,只是没有启动进程。
本次只说明配置过程,不涉及具体细节及参数详解,OGG 搭建也不做说明可自行部署;
一、简单参数相关配置如下:
1.源端 MGR 参数:
edit param mgr
start mgr
2.源端配置 extract 抽取进程 ext1
add extract ext1, TRANLOG, BEGIN NOW, THREADS 4 --源库有四组日志,故需 THREADS 4
3.源端配置 extract 传输进程 dpe1
edit param dpe1
4.目标端 MGR 配置
view param mgr
start mgr
5.目标端 rep2 配置
view params rep2
二、初始化数据2021-08-17 晚上 21:00 左右6.源库导出数据
--生产环境如果有事务建议使用如下语句查看 SCN 最小值
根据 SCN 导出源库数据
nohup expdp \'/ as sysdba\' directory=PUBLIC_DUMP dumpfile=expdp_PROD_JKX-2021-08-17_%U.dmp COMPRESSION=ALL flashback_scn=9035744263 exclude=statistics parallel=6 cluster=no schemas=PROD_JKX,PROD_JIEKEXU logfile=impdp_PROD_JIEKEXU081721.log &
2021-08-18 早上 10:00 左右开始导入2021-08-18 下午 14:30 左右开启捕获进程 start ext1、start dpe1 7.目标库导入 首先参考源库创建数据和索引表空间,其次查看源库用户创建语法,是否带有非默认的临时表或者非默认 PROFILE。
create tablespace xxx datafile '/u01/app/oracle/product/XXX.dbf' size 30G;
19c 目标库导入数据
nohup impdp \'/ as sysdba\' directory=EXPDP_DIR dumpfile=expdp_PROD_JKX-2021-08-17_%U.dmp parallel=4 logfile=impdp_PROD_JIEKEXU_081720.log logtime=ALL TRANSFORM=DISABLE_ARCHIVE_LOGGING:Y &
注意:在不管是非归档还是归档情况下使用 DISABLE_ARCHIVE_LOGGING 都会减小导入时间,减少归档量,但是需要注意如果数据库是force logging情况下,DISABLE_ARCHIVE_LOGGING 参数会无效。
8.检查导入情况,确保无关键错误,注意归档空间即可,数据导入完成后收集统计信息。
exec dbms_stats.gather_database_stats(degree =>4);
9.完成后根据源库导出时的 scn 启动目标端 rep2
start REP2, aftercsn 9035744263
结果启动就报文章开头所示的错误 No data found :
2021-08-18 17:06:27 WARNING OGG-01004 Aborted grouped transaction on PROD_JIEKEXU.T_SYS_FILE_RET_TASK, Database error 1403 (No data found).
三、解决过程
**No data found 因源端 ext1 捕获进程启动时间比较晚,而添加时所用语法为:add extract ext1, TRANLOG, BEGIN NOW, THREADS 4 BEGIN NOW 意为当前时间,虽添加时间是 2021-08-17 但启动时间是 2021-08-18 下午了,这个捕获时间相当于导出到启动的这段时间内没有捕获,数据则不连续了,No data found 也就说得过去了。****那么,肿么办呢?删除原来添加的 ext1 重新将时间改为 expdp 导出的时间即可。**10.源端登录 OGG
--删除 ext1
11.重新添加 ext1
--需登录源库 sqlplus 查看 scn 对应的时间值
然后添加时指定该时间即可 BEGIN 2021-08-17 21:00:56
GGSCI (testrac2 as ogg@testrac3) 84> REGISTER extract EXT1 database
exttrail 指定文件名,操作系统层相应路径下则生成已 am 开头的 trail 文件。
[oracle@testrac2 goldengate]$ cd goldengate/ogg19c/dirdat/
然后也需要修改 dpe1 中 trail 文件名,将原来 "RMTTRAIL ogg/dirdat/xx" 的文件重命名改为类似的 "RMTTRAIL ogg/dirdat/am",防止因生成的 trail 不连续而报错找不到数据。
12.启动捕获和投递进程
源端:
start ext1
start dpe1
目标端:
start REP2, aftercsn 9035744263
这样基本上就没问题了,可以正常传输了。
GGSCI (Ops-19cOGG) 10> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:00:00 00:00:08
REPLICAT RUNNING REP2 00:00:00 00:00:09
-------------以下可以不用看折腾的过程了-------------
但是吧,我们七点下班,这么个时间点还早,就瞎折腾了一下,网上找了两个帖子,手工切换trail 文件,如下所示:
源端不需停 OGGSEND extract ext1, ROLLOVERSEND extract dpe1, ROLLOVER切换完后启动报错又换了种切换方案源端需要停止 OGGalter extract ext1 etrolloveralter extract dpe1 etrolloveralter extract dpe1,thread 4,extseqno 3,extrba 0目标端也修改 trail 文件号再启动。ALTER REPLICAT rep1, EXTSEQNO 3, EXTRBA 0start dpe1start rep2
具体切换方案详见:blog.csdn.net/leo\_\_1990…
期间也换过 trail 文件名,删除 ext1 让重新捕获,当重新捕获后目标端启动报错变了,看来是有希望了。
2021-08-18 19:05:11 WARNING OGG-01154 SQL error 1 mapping PROD_JIEKEXU.T_AUTH_ORIGINAL to PROD_JIEKEXU.T_AUTH_ORIGINAL OCI Error ORA-00001: unique constraint (PROD_JIEKEXU.P_T_AUTH_ORIGINAL) violated (status = 1), SQL <INSERT /*+ RESTRICT
_ALL_REF_CONS */ INTO "PROD_JIEKEXU"."T_AUTH_ORIGINAL" ("SEQUENCE_NO","PK_ORIGINAL","FK_SIGNATURE","ORIGINAL","ORIGINAL_DIGEST","DIGEST_TIME","IS_BATCH","FK_USER","FK_PERSON","BUSINESS_TYPE","FK_BUSINESS","FK_WORKFLOW","FK_WORKFLOW_TASK",
"ORIGINAL_TYPE","VERSION_ID","ORIGINAL_RULE_TYPE") VALUES (:a0,:a1,:a2,:a3,:a4,:a5,:a6,:a7,:a8,:a9,:a10,:a11,:a12,:a13,:a14,:a15)>.
Source Context :
SourceModule : [er.replicat.errors]
SourceID : [er/replicat/reperrors.cpp]
SourceMethod : [repError]
SourceLine : [1754]
ThreadBacktrace : [15] elements
: [/ogg/libgglog.so(CMessageContext::AddThreadContext())]
: [/ogg/libgglog.so(CMessageFactory::CreateMessage(CSourceContext*, unsigned int, ...))]
: [/ogg/libgglog.so(_MSG_QualTableName_QualTableName(CSourceContext*, int, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, ggs::gglib::ggapp::CQualDBObjName<(DBObjType)1> const&, CMessageFactory::Message
Disposition))]
: [/ogg/replicat(ggs::er::ReplicatContext::repError(short, int, char const*, extr_ptr_def*, ggs::gglib::gglcr::CommonLCR const*, std_rec_hdr_def*, char*, ObjectMetadata*, bool))]
: [/ogg/replicat()]
: [/ogg/replicat(ggs::er::ReplicatContext::processRecord(ggs::gglib::gglcr::CommonLCR const*, ggs::gglib::gglcr::CommonLCR*, extr_ptr_def*&, extr_ptr_def*&, bool&, int&, bool, RepCsn&))]
: [/ogg/replicat(ggs::er::ReplicatContext::processReplicatLoop())]
: [/ogg/replicat(ggs::er::ReplicatContext::run())]
: [/ogg/replicat()]
: [/ogg/replicat(ggs::gglib::MultiThreading::MainThread::ExecMain())]
: [/ogg/replicat(ggs::gglib::MultiThreading::Thread::RunThread(ggs::gglib::MultiThreading::Thread::ThreadArgs*))]
: [/ogg/replicat(ggs::gglib::MultiThreading::MainThread::Run(int, char**))]
: [/ogg/replicat(main)]
: [/lib64/libc.so.6(__libc_start_main)]
: [/ogg/replicat()]
2021-08-18 19:05:11 ERROR OGG-01296 Error mapping from PROD_JIEKEXU.T_AUTH_ORIGINAL to PROD_JIEKEXU.T_AUTH_ORIGINAL.
下班时间看到了报错是 OGG-01296 Error mapping ,难道是目标端的相关映射文件有问题?想了许久看了许久不得而知,先下班吧,来日再战。
除了家目录下的 ggserr.log 日志外,dirrpt 目录下也会有单独的各个进程报告。由 Extract、Replicat 和 Manager 进程创建的进程报告文件的默认位置,用于报告与处理运行相关的统计信息。以外部 ASCII 格式编写。文件名称格式为 group name+sequence number.rpt 地方sequence number 附加到旧文件的序号。注意不要编辑这些文件。
total 6932
-rw-r----- 1 oracle oinstall 3216 Jul 14 20:10 REP15.rpt
-rw-r----- 1 oracle oinstall 0 Aug 9 03:00 rep19.dsc
-rw-r----- 1 oracle oinstall 0 Aug 10 03:00 rep18.dsc
-rw-r----- 1 oracle oinstall 0 Aug 11 03:00 rep17.dsc
-rw-r----- 1 oracle oinstall 0 Aug 12 03:00 rep16.dsc
-rw-r----- 1 oracle oinstall 0 Aug 13 03:00 rep15.dsc
-rw-r----- 1 oracle oinstall 0 Aug 14 03:00 rep14.dsc
-rw-r----- 1 oracle oinstall 0 Aug 15 03:00 rep13.dsc
-rw-r----- 1 oracle oinstall 176747 Aug 16 14:55 REP14.rpt
-rw-r----- 1 oracle oinstall 16471 Aug 16 15:01 REP13.rpt
-rw-r----- 1 oracle oinstall 14940 Aug 16 15:14 REP12.rpt
-rw-r----- 1 oracle oinstall 14940 Aug 16 15:15 REP11.rpt
-rw-r----- 1 oracle oinstall 2708 Aug 16 15:18 rep12.dsc
-rw-r----- 1 oracle oinstall 15311 Aug 17 10:20 REP10.rpt
-rw-r----- 1 oracle oinstall 9787 Aug 17 10:23 MGR0.rpt
-rw-r----- 1 oracle oinstall 209 Aug 17 16:28 rep11.dsc
-rw-r----- 1 oracle oinstall 0 Aug 18 03:00 rep10.dsc
-rw-r----- 1 oracle oinstall 20471 Aug 18 16:41 REP29.rpt
-rw-r----- 1 oracle oinstall 14784 Aug 18 16:54 REP28.rpt
-rw-r----- 1 oracle oinstall 15111 Aug 18 17:06 REP27.rpt
-rw-r----- 1 oracle oinstall 254995 Aug 18 17:40 REP26.rpt
-rw-r----- 1 oracle oinstall 15766 Aug 18 18:07 REP25.rpt
-rw-r----- 1 oracle oinstall 15770 Aug 18 18:20 REP24.rpt
-rw-r----- 1 oracle oinstall 15787 Aug 18 18:29 REP23.rpt
-rw-r----- 1 oracle oinstall 15787 Aug 18 18:44 REP22.rpt
-rw-r----- 1 oracle oinstall 15790 Aug 18 19:04 REP21.rpt
-rw-r----- 1 oracle oinstall 15790 Aug 18 19:05 REP20.rpt
-rw-r----- 1 oracle oinstall 0 Aug 19 03:00 rep1.dsc
-rw-r----- 1 oracle oinstall 11457 Aug 19 08:59 REP1.rpt
-rw-r----- 1 oracle oinstall 22769 Aug 19 10:49 MGR.rpt
-rw-r----- 1 oracle oinstall 74424 Aug 19 10:49 rep2.dsc
-rw-r----- 1 oracle oinstall 6298955 Aug 19 18:20 REP2.rpt
今早上来重启了下 rep2,查看了报错还是一样,目标库查看 rep2.dsc
vim ogg/dirrpt/rep2.dsc
--搜索到报错的表名:T_AUTH_ORIGINAL
这才大吃一惊 ORA-00001 违反唯一约束,恍然大悟,有重复数据了,昨晚上一顿乱操作后有数据进入到了目标库,怎么办呢?
目标库只能按用户删除重新导入咯。
drop user XXX cascade;
重新导入
.......
19-AUG-21 10:25:24.289: Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
19-AUG-21 10:25:27.706: Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
19-AUG-21 10:32:55.348: Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
19-AUG-21 10:34:43.856: Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
19-AUG-21 10:35:26.070: Job "SYS"."SYS_IMPORT_FULL_01" completed with 17 error(s) at Thu Aug 19 10:35:26 2021 elapsed 0 00:28:30
然后重启 rerp2
start REP2, aftercsn 9035744263
一段时间后同步完成,可观察试运行一段时间,后期准备正式迁移。
GGSCI (Ops-19cOGG) 10> info all
Program Status Group Lag at Chkpt Time Since Chkpt
MANAGER RUNNING
REPLICAT RUNNING REP1 00:00:00 00:00:03
REPLICAT RUNNING REP2 00:00:00 00:00:02
附:Oracle GoldenGate 经典架构安装的子目录(见原文)
吐血整理,踩坑无数,实属不易,如认真阅读,此文一定对您有帮助,欢迎点赞、在看与转发,写作不易,坚持写作更不易,您的点赞、转发,举手之劳,便是对我最大的支持,也能让更多的人看到更多的人受益,万分感谢!
———————————————————————————
公众号:JiekeXu DBA之路
墨天轮:www.modb.pro/u/4347
CSDN :blog.csdn.net/JiekeXu
腾讯云:cloud.tencent.com/developer/u…
———————————————————————————
【安装篇】- 基于 VMWARE Oracle Linux7.9 安装 Oracle19c RAC 详细配置方案
2021年7月国产数据库排行榜:openGauss高歌猛进,GBase持续下跌
Oracle 12c 及以上版本补丁更新说明及下载方法(收藏版)
百花齐放的国产数据库