4. 源端数据库准备与配置

Oracle GoldenGate 的抽取进程(Extract)并不直接读取业务表,而是读取 Oracle 的在线重做日志与归档日志,从中解析出 DML 与 DDL 变更。因此,源端数据库能否被 GoldenGate 正确抽取,取决于四件事是否同时成立:日志可被持久保留、日志中带有足够的行级信息、数据库参数允许日志被读取、GoldenGate 用户具备访问日志与字典的权限。本章围绕这四项展开,并给出可直接执行的配置与验证方法。

一、开启归档日志:让变更“留得住”

在线重做日志是循环复用的,一旦被覆盖,其中的变更就永久丢失。归档模式(ARCHIVELOG)会在日志切换时把在线日志复制为归档文件,使 GoldenGate 可以在抽取滞后时仍能回溯读取。检查当前模式:

SQL> ARCHIVE LOG LIST;
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            USE_DB_RECOVERY_FILE_DEST

若为 No Archive Mode,需以 MOUNT 状态启动并切换:

SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
SQL> ARCHIVE LOG LIST;   -- 应显示 Archive Mode / Enabled

切换后必须做一次完整备份,否则归档链没有起点。同时要评估归档空间:假设业务高峰产生 20 GB/h 重做量,GoldenGate 抽取延迟容忍 4 小时,则归档保留窗口至少应覆盖 4 小时以上并留出余量,即预留 100 GB 以上空间,并配置 RMAN 的归档删除策略,避免因空间耗尽导致数据库挂起。

二、补充日志:让日志“看得清”

默认情况下,Oracle 只在重做日志中记录被修改列的前像(before image),而 GoldenGate 需要所有列的前像来构造 WHERE 条件、定位目标行。补充日志(Supplemental Logging)就是为此增加记录内容。它分三个层级,必须逐级开启:

  • 数据库级最小补充日志:ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;,这是所有行级补充日志的前提。
  • 数据库级主键补充日志:ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;,保证 UPDATE/DELETE 时记录主键列。
  • 表级全列补充日志:对无主键表或需要完整前像的表,执行 ALTER TABLE scott.emp ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;。

验证是否生效:

SQL> SELECT supplemental_log_data_min,
  2         supplemental_log_data_pk,
  3         supplemental_log_data_all
  4  FROM v$database;
SUPPLEMENTAL_LOG_DATA_MIN  SUPPLEMENTAL_LOG_DATA_PK  SUPPLEMENTAL_LOG_DATA_ALL
YES                        YES                       NO

若目标端需要同步无主键表,建议对该表单独加 ALL COLUMNS,否则 GoldenGate 会因缺少唯一行标识而报错或产生重复更新。

三、强制日志:让所有变更“都进日志”

在 RAC 或 Data Guard 环境中,某些操作(如直接路径插入、并行 DML)可能绕过重做日志。强制日志(FORCE LOGGING)确保任何数据变更都被记录,是 GoldenGate 抽取完整性的保障:

SQL> ALTER DATABASE FORCE LOGGING;
SQL> SELECT force_logging FROM v$database;   -- 返回 YES

该操作会带来一定日志量增长,属于必要代价。生产库建议在业务低峰期执行。

四、数据库参数调整

GoldenGate 抽取依赖若干初始化参数,需确认或调整:

参数建议值作用
ENABLE_GOLDENGATE_SUPPORTTRUE启用 GoldenGate 集成抽取所需内部支持
STREAMS_POOL_SIZE≥ 1G(集成抽取)为 LogMiner 与集成抽取提供内存
UNDO_RETENTION≥ 抽取延迟窗口保证长事务前像不被过早覆盖
COMPATIBLE≥ 11.2.0.4满足 GoldenGate 版本要求

例如:ALTER SYSTEM SET streams_pool_size=2G SCOPE=SPFILE;,重启后生效。UNDO_RETENTION 建议设为 10800 秒(3 小时)以上,与归档保留窗口匹配。

五、用户权限与 TNS 配置

GoldenGate 需要独立的数据库用户,并授予最小必要权限。经典抽取用户示例:

SQL> CREATE USER oggadm IDENTIFIED BY "Ogg#2024";
SQL> GRANT CREATE SESSION, ALTER SESSION TO oggadm;
SQL> GRANT SELECT ANY DICTIONARY TO oggadm;
SQL> GRANT SELECT ANY TABLE TO oggadm;
SQL> GRANT FLASHBACK ANY TABLE TO oggadm;
SQL> GRANT EXECUTE ON DBMS_FLASHBACK TO oggadm;
SQL> GRANT LOGMINING TO oggadm;   -- 12c 及以上

若使用集成抽取(Integrated Extract),还需 GRANT DBA TO oggadm; 或授予 DBMS_GOLDENGATE_ADM 相关权限。TNS 方面,源端需在 tnsnames.ora 中配置可被 GoldenGate 使用的服务名,并确保监听正常:

OGG_SRC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.21)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

用 tnsping OGG_SRC 与 sqlplus oggadm/密码@OGG_SRC 验证连通性。至此,源端准备完成,可用下图快速核对各环节的依赖关系与验证点。

源端数据库准备与配置核对图 ① 归档日志 ALTER DATABASE ARCHIVELOG ARCHIVE LOG LIST → Enabled 预留归档空间 + RMAN 策略 ② 补充日志 ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS 无主键表加 (ALL) COLUMNS ③ 强制日志 ALTER DATABASE FORCE LOGGING v$database.force_logging = YES 保障直接路径/并行 DML ④ 数据库参数调整 ENABLE_GOLDENGATE_SUPPORT = TRUE STREAMS_POOL_SIZE ≥ 1G(集成抽取) UNDO_RETENTION ≥ 抽取延迟窗口 COMPATIBLE ≥ 11.2.0.4 ⑤ 用户权限与 TNS CREATE SESSION / SELECT ANY DICTIONARY FLASHBACK ANY TABLE / LOGMINING tnsnames.ora 配置 OGG_SRC 服务名 tnsping + sqlplus 验证连通 Extract 可稳定读取重做/归档日志 行级前像完整 · 权限与连接就绪
核对顺序建议:先确认归档与强制日志(决定日志是否存在),再确认补充日志(决定日志内容是否够用),最后确认参数、权限与 TNS(决定 GoldenGate 能否连上并读取)。任何一项缺失,抽取进程都可能启动失败或产生数据不一致。
常见误区:只开了数据库级最小补充日志,却未对无主键表加 ALL COLUMNS,导致目标端 UPDATE 影响多行;或归档空间未做监控,抽取延迟数小时后归档被删除,Extract 报 OGG-00446 无法找到所需日志。生产环境务必把归档保留窗口与抽取延迟监控联动设置。