1. 概述
必须为捕获的表或数据库启用补充日志记录,以便数据更改能够捕获已更改的数据库行之前的状态。下面将说明如何在表/数据库级别上配置它。 一般建议对库进行启用。
用户根据实际的数据库版本,参考下面文档进行操作。
2. Oracle 10g、11g
用户根据实际情况,选择其中一种方案:
| 方案 | 说明 | 步骤 |
|---|---|---|
| 开启单表补全日志 | 同步某张表时,就需要开启该表的补全日志 优势:操作比较精准 开启单表的全补充得在运行管道任务前,不然有可能会出现数据丢失 劣势:需要一张一张开启 | |
| 开启全库补全日志 | 若用户库里的表数据量可控,且希望一劳永逸(不想每同步一张表就开启一次),可开启全库补全日志 劣势:会占用较多数据库空间 |
|
3. Oracle 12c、18c、19c、21c、Oracle RAC集群
3.1 数据库是否支持CDB/PDB
Oracle12c 及之后版本引入了多租用户环境,其中包含两个核心概念:容器数据库-CDB(Container Database)和可插拔数据库-PDB(Pluggable Database)。
CDB 是一个包含零个或多个 PDB 的数据库;PDB 是一个独立的数据库,可以插入或拔出 CDB,每个 PDB 都有自己的数据文件和用户数据;CDB 管理多个 PDB,PDB 共享 CDB 中的系统资源,但数据和对象是隔离的。

在使用上二者与非多租户数据库实例没有任何区别,区别主要在于获取数据变更时,只能从CDB中捕获到,基于此要对其进行适配。
1)判断当前连接的数据库是否是CDB
以具有 DBA 权限的用户身份登录数据库,使用如下命令查看数据库是否开启多租户:
SELECT CDB FROM V$DATABASE;

如果查询结果中的 CDB 列值为 YES,则当前连接的数据库是容器数据库(CDB)。如果值为 NO,则当前连接的数据库是非容器数据库(非 CDB)
2)判断当前连接的是根容器还是 PDB
SELECT SYS_CONTEXT('USERENV', 'CON_NAME') FROM DUAL;

若返回的是 CDB$ROOT,则表示当前连接的是 CDB 的根容器;若返回的是其他名称,则表示当前连接的是 PDB。
3.2 场景一:非多租户
使用以下命令,确认 supplemental logging 是否开启:
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM v$database;

如果返回的三列都是 Yes 或者 Implicit
如果返回的三列都是 Yes 或者 Implicit ,则表示 identification key logging(标识键日志)和 full supplemental logging(全补充日志)已同时开启,可以直接查看第五章数据库账号相关内容。
如果返回的前两列是 Yes 或者 Implicit
如果返回的前两列是 Yes 或者 Implicit,则表示只开启了 identification key logging(标识键日志),需要开启全补充日志。
单表开启 full supplemental logging(全补充日志),使用如下命令:
ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
所有表开启 full supplemental logging(全补充日志),使用如下命令:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

提交更改的配置:
ALTER SYSTEM SWITCH LOGFILE;
然后可以使用命令查看单表的补全日志权限是否开启:
SELECT OWNER, TABLE_NAME, LOG_GROUP_NAME, ALWAYS, LOGGING_COLUMNS
FROM DBA_LOG_GROUPS
WHERE TABLE_NAME = '你的表名';
3.3 场景二:CDB/PDB
用户根据实际情况,选择其中一种方案:
| 方案 | 说明 | 步骤 |
|---|---|---|
| 开启单表补全日志 | 同步某张表时,就需要开启该表的补全日志 优势:操作比较精准 开启单表的全补充得在运行管道任务前,不然有可能会出现数据丢失 劣势:需要一张一张开启 | |
| 开启全库补全日志 | 若用户库里的表数据量可控,且希望一劳永逸(不想每同步一张表就开启一次),可开启全库补全日志 劣势:会占用较多数据库空间 | |
