Oracle 21C 部署ogg踩过的坑
问题背景:
我想要部署两台oracle数据库服务器,并且用Oracle Goldengate 进行数据同步更新。
跟着教程配置好ogg之后,发现抽取进程没有抽取出任何数据。
服务器配置:
两台安装了配置完全相同的Fedora服务器系统(红帽子旗下的一个linux系统)虚拟机。当然IP不能相同。
数据库配置:
Oracle 21C 可插拔式容器数据库, CDB名称是CDB1,唯一一个插拔式数据库PDB,名称是PDB1。两台虚拟机配置完全相同。
Oracle Goldengate (以下简称ogg),版本21.3。
以下是坑:
一、源端创建OGG用户
一定要登录CDB进行创建,不要在PDB中创建
也就是直接登录sqlplus ,然后执行创建用户的命令。
sqlplus / as sysdba
SQL>
create user C##OGG identified by ogg ;
注意,在CDB中创建的公共用户的用户名必须是C##开头的,不然创建会报错。
之后需要给C##OGG用户赋权,赋予DBA权限。
全部流程可参考 https://blog.csdn.net/qq_44829685/article/details/128429827
二、创建抽取进程
数据库实例名称SID是CDB1,有两个服务名称分别是CDB1和PDB1。
登录GGSCI之后,dblogin 进CDB中,而不是pdb中,
./ggsci
GGSCI (Fedora) 2> dblogin userid c##ogg@cdb1,password ogg
Successfully logged into database CDB$ROOT.GGSCI (Fedora as c##ogg@cdb1/CDB$ROOT) 3>
然后再执行一系列操作。还是参考 https://blog.csdn.net/qq_44829685/article/details/128429827
一定不要忘记 register 注册抽取进程这一操作。
三、添加附加日志(add trandata)
到了add trandata这一步,在CDB数据库中是无法直接给pdb中的表增加附加日志的。
对此,有三种方式进行添加日志操作。
1. ggsci中登录pdb
GGSCI (Fedora) 1> dblogin userid c##ogg@pdb1,password ogg
Successfully logged into database.GGSCI (Fedora as c##ogg@cdb1) 2> add trandata test.test2025-10-13 17:16:28 INFO OGG-15132 Logging of supplemental redo data enabled for table TEST.TEST.2025-10-13 17:16:28 INFO OGG-15133 TRANDATA for scheduling columns has been added on table TEST.TEST.2025-10-13 17:16:28 INFO OGG-15438 Enabling logical replication (with all keys) on auto capture table TEST.TEST.2025-10-13 17:16:28 INFO OGG-15135 TRANDATA for instantiation CSN has been added on table TEST.TEST.2025-10-13 17:16:28 INFO OGG-26035 Logical replication for table TEST.TEST is ENABLED.2025-10-13 17:16:28 INFO OGG-10471 ***** Oracle Goldengate support information on table TEST.TEST *****
Oracle Goldengate support native capture on table TEST.TEST.
Oracle Goldengate marked following column as key columns on table TEST.TEST: ID.GGSCI (Fedora as c##ogg@cdb1) 3>
2.ggsci 中在CDB中添加附加日志
还是参考 https://blog.csdn.net/qq_44829685/article/details/128429827
3. 在数据库中添加
不太推荐,我还没测试好,而且感觉手写的log_group_name 不知道会不会引发其他问题。
alter table TEST.TEST add supplemental log group ggs_test_1 (AAC001,AAC003) always;
再说说 add trandata 的作用:
附加日志,又叫补充日志,是对数据库或者对表的设置,用于对事务操作记录增加一些信息。
比如,我更新了 学生的姓名,没有指定附加日志的情况,数据库操作记录仅仅会记录主键和姓名字段,如果有主键,那么一切都会没有问题,如果没有主键,那么操作记录只会记录姓名,当我们通过ogg进行数据同步时,由于没有主键,目标端的读取进程就会报错或者丢弃这条更新记录,也就目标端是无法应用更新和删除等操作,对插入是没有影响的。
也就是,如果你的表都有主键,那么可以不进行add trandata操作,如果你的表没有主键,那么请添加附加日志。
四、目标端用户和复制进程的创建
目标的创建,不在CDB中创建,而是在你的目标pdb中创建,包括ogg用户等创建操作。
由于CDB中创建的抽取进程的抽取信息包含catalog 信息(pdb1),它的表名会显示为pdb1.test.test
咱们在 replicat的配置文件中,可以加一行这个 sourcecatalog pdb1
GGSCI (Fedora) 4> view params rep1REPLICAT rep1
SETENV(ORACLE_SID=CDB1)
USERID ogg@pdb1,password ogg
ALLOWNOOPUPDATES
REPERROR default,discardASSUMETARGETDEFS
sourcecatalog pdb1MAP TEST.AC01, TARGET TEST.AC01,colmap(usedefaults,UPDATE_TIME=@GETENV('GGHEADER','COMMITTIMESTAMP'));
MAP TEST.AB01, TARGET TEST.AB01,colmap(usedefaults,UPDATE_TIME=@GETENV('GGHEADER','COMMITTIMESTAMP'));
MAP TEST.AC02, TARGET TEST.AC02,colmap(usedefaults,UPDATE_TIME=@GETENV('GGHEADER','COMMITTIMESTAMP'));
MAP TEST.AB02, TARGET TEST.AB02,colmap(usedefaults,UPDATE_TIME=@GETENV('GGHEADER','COMMITTIMESTAMP'));
MAP TEST.AC03, TARGET TEST.AC03,colmap(usedefaults,UPDATE_TIME=@GETENV('GGHEADER','COMMITTIMESTAMP'));
MAP TEST.AC04, TARGET TEST.AC04,colmap(usedefaults,UPDATE_TIME=@GETENV('GGHEADER','COMMITTIMESTAMP')) KEYCOLS(AAC001);GGSCI (Fedora) 5>