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.test

2025-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 rep1

REPLICAT rep1
SETENV(ORACLE_SID=CDB1)
USERID ogg@pdb1,password ogg
ALLOWNOOPUPDATES
REPERROR default,discard

ASSUMETARGETDEFS
sourcecatalog pdb1

MAP 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> 

写在后面:

在Oracle12c中,引入了容器数据库(Container Database,简称CDB)和可插拔数据库(Pluggable Database,简称PDB)的概念,以后版本均如此。

上面的那些操作并不是唯一正确的配置方式,但是能够保证经验不足的用户避开很多坑配置出一套完整抽取、投递、复制流程。

相关推荐
你不是我我3 小时前
【Java 开发日记】MySQL 与 Redis 如何保证双写一致性?
数据库·redis·缓存
望获linux3 小时前
【实时Linux实战系列】实时 Linux 在边缘计算网关中的应用
java·linux·服务器·前端·数据库·操作系统
fredinators3 小时前
数据库专家
大数据·数据库
fredinators3 小时前
数据库flask访问
数据库·oracle·flask
向葭奔赴♡4 小时前
Spring Boot 分模块:从数据库到前端接口
数据库·spring boot·后端
JosieBook4 小时前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治4 小时前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__4 小时前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
一只自律的鸡5 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql