如何同步两个 PostgreSQL 数据库 [5 种经过验证的方法]
2026-09-20
2026-09-20
2026-09-15
2026-09-15
当 GoldenGate 复制未在数据库级别启用时,就会发生此错误,从而阻止复制进程启动或继续运行。常见原因包括:
ENABLE_GOLDENGATE_REPLICATION 被设置为 FALSE。 这个初始化参数在 Oracle 11.2.0.4 中引入,默认值为 FALSE。在将其设置为 TRUE 之前,数据库会阻止 GoldenGate 注册、提取或应用数据。
要解决 ORA-26947 错误,请更改控制 GoldenGate 访问权限的数据库初始化参数。以下步骤涵盖连接数据库、启用参数以及确认修复。
更改此参数需要 SYSDBA 权限。打开 SQL*Plus 并以具有 SYSDBA 访问权限的用户连接:
sqlplus / as sysdba
在进行任何更改之前,请检查当前设置:
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
如果 GoldenGate 复制未启用,该值将显示为 FALSE。
ENABLE_GOLDENGATE_REPLICATION 是动态参数,因此无需重启数据库即可启用:
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;
SCOPE=BOTH 会立即将更改应用到正在运行的实例,并写入服务器参数文件(spfile),因此重启后仍会保留。
SID='*',以便更改应用到所有实例。下文 RAC 部分将对此进行更详细的介绍。再次运行相同的检查以确认更改已生效:
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
该值现在应显示为 TRUE。
启用参数后,返回 GGSCI 并启动最初失败的 Extract 或 Replicat 进程:
GGSCI> START EXTRACT
使用 INFO EXTRACT <extract_name> 检查其状态,并确认它进入 RUNNING 状态且没有进一步错误。
在 Oracle Real Application Clusters(RAC)环境中,所有实例都需要使用相同的参数设置。如果只在一个节点上更改了该参数,连接到其他节点的 GoldenGate 进程将继续引发 ORA-26947 错误。
要将更改应用到整个集群,请使用 SID='*' 子句。这会更新所有实例的内存,并将设置写入共享服务器参数文件(spfile)。可从任何活动的 RAC 节点运行此命令:
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH SID='*';
运行后,请使用以下命令确认每个实例上的设置:
SELECT inst_id, name, value
FROM gv$parameter
WHERE name = 'enable_goldengate_replication';
每一行的 VALUE 列都应显示 TRUE。如果某个节点仍显示 FALSE,则可能是该节点在命令执行时未运行,或者之后重启时未读取新的 spfile 值。请检查该节点是否在线,如有需要,直接在其上应用该命令。
在多租户 Oracle 环境中,容器级规则会影响可以在何处设置复制参数。在容器数据库(CDB)或可插拔数据库(PDB)中的错误级别应用该设置,将导致 GoldenGate 进程无法启动。
ENABLE_GOLDENGATE_REPLICATION 是从根容器(CDB$ROOT)设置的。在 PDB 内运行该命令将失败。
ALTER SESSION SET CONTAINER = CDB$ROOT;
连接到根容器后,运行之前使用的相同命令:
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;
ENABLE_GOLDENGATE_REPLICATION 无法在单个 PDB 级别修改。在连接到 PDB 时尝试设置它会返回:
ORA-65040: operation not allowed from within a pluggable database
这是预期行为。该参数是 CDB 范围的设置,因此无论要复制哪些 PDB,都必须始终从 CDB$ROOT 进行配置。
如果目标 PDB 本身处于关闭或挂载状态,在根容器中启用该参数也无济于事。GoldenGate 的 Extract 或 Replicat 进程需要 PDB 完全打开才能从中读取或向其写入。
检查每个 PDB 的状态:
SHOW PDBS;
确认目标 PDB 在 OPEN MODE 下显示 READ WRITE。如果没有,请打开它:
ALTER PLUGGABLE DATABASE OPEN;
有时即使参数已更新,ORA-26947 错误仍然存在。发生这种情况时,下一步是检查环境不匹配或缺少日志记录依赖项。
在运行多个数据库实例的服务器上,很容易在错误的实例上更新参数。这通常归结为在错误的 ORACLE_SID 环境变量下运行 SQL 命令。
检查实例名称和参数值,以确认您位于正确的数据库上:
SELECT instance_name, status FROM v$instance;
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
如果实例名称与 GoldenGate 配置为从中捕获的数据库不匹配,请切换 ORACLE_SID 环境变量,并在正确的实例上重新应用修复。
GoldenGate 的 Extract 和 Replicat 进程使用凭据存储或 TNS 别名进行连接。如果 DBLOGIN 命令中的别名指向错误的服务,例如只读 Active Data Guard 备库或不同的容器,进程最终会连接到一个从未启用该参数的数据库。
检查 tnsnames.ora 文件或 GoldenGate 凭据存储配置:
GGSCI> DBLOGIN USERIDALIAS ggadmin_prod
确认别名 ggadmin_prod 指向读写主数据库,而不是备库或辅助实例。
GoldenGate 从数据库的重做日志中读取事务详细信息。在 NOARCHIVELOG 模式下,这些日志会很快被覆盖,并且不会保留在磁盘上,从而阻止复制读取历史变更数据。
检查数据库的日志记录模式:
ARCHIVE LOG LIST;
如果输出显示“Database log mode: No Archive Mode”,则切换到 ARCHIVELOG 模式需要短暂的维护窗口,因为数据库必须以 mount 状态重启:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
默认情况下,Oracle 重做日志仅捕获从崩溃中恢复所需的最少信息。GoldenGate 需要更多信息,例如主键和已更改列的值,以重建完整的 SQL 操作进行复制。这就是补充日志提供的内容。
在数据库级别检查并启用最小补充日志:
SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
架构级或表级补充日志是单独配置的,在开始复制之前从 GGSCI 中配置:
GGSCI> DBLOGIN USERID ggsadmin, PASSWORD password
GGSCI> ADD SCHEMATRANDATA
某些操作,例如直接路径加载或批量插入,可以使用 NOLOGGING 子句跳过写入重做日志以获得更好的性能。由于 GoldenGate 只复制写入重做日志的内容,NOLOGGING
当数据库未配置为支持 Oracle GoldenGate 复制时,就会出现 ORA-26947 错误。它通常会在启动或注册 Extract 或 Replicat 进程时出现。本指南将逐步介绍其根本原因以及如何修复。
当 GoldenGate 复制未在数据库级别启用时,就会发生此错误,从而阻止复制进程启动或继续运行。常见原因包括:
ENABLE_GOLDENGATE_REPLICATION 被设置为 FALSE。 这个初始化参数在 Oracle 11.2.0.4 中引入,默认值为 FALSE。在将其设置为 TRUE 之前,数据库会阻止 GoldenGate 注册、提取或应用数据。要解决 ORA-26947 错误,请更改控制 GoldenGate 访问权限的数据库初始化参数。以下步骤涵盖连接数据库、启用参数以及确认修复。
更改此参数需要 SYSDBA 权限。打开 SQL*Plus 并以具有 SYSDBA 访问权限的用户连接:
sqlplus / as sysdba
在进行任何更改之前,请检查当前设置:
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
如果 GoldenGate 复制未启用,该值将显示为 FALSE。
ENABLE_GOLDENGATE_REPLICATION 是动态参数,因此无需重启数据库即可启用:
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;
SCOPE=BOTH 会立即将更改应用到正在运行的实例,并写入服务器参数文件(spfile),因此重启后仍会保留。
SID='*',以便更改应用到所有实例。下文 RAC 部分将对此进行更详细的介绍。再次运行相同的检查以确认更改已生效:
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
该值现在应显示为 TRUE。
启用参数后,返回 GGSCI 并启动最初失败的 Extract 或 Replicat 进程:
GGSCI> START EXTRACT
使用 INFO EXTRACT <extract_name> 检查其状态,并确认它进入 RUNNING 状态且没有进一步错误。
在 Oracle Real Application Clusters(RAC)环境中,所有实例都需要使用相同的参数设置。如果只在一个节点上更改了该参数,连接到其他节点的 GoldenGate 进程将继续引发 ORA-26947 错误。
要将更改应用到整个集群,请使用 SID='*' 子句。这会更新所有实例的内存,并将设置写入共享服务器参数文件(spfile)。可从任何活动的 RAC 节点运行此命令:
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH SID='*';
运行后,请使用以下命令确认每个实例上的设置:
SELECT inst_id, name, value
FROM gv$parameter
WHERE name = 'enable_goldengate_replication';
每一行的 VALUE 列都应显示 TRUE。如果某个节点仍显示 FALSE,则可能是该节点在命令执行时未运行,或者之后重启时未读取新的 spfile 值。请检查该节点是否在线,如有需要,直接在其上应用该命令。
在多租户 Oracle 环境中,容器级规则会影响可以在何处设置复制参数。在容器数据库(CDB)或可插拔数据库(PDB)中的错误级别应用该设置,将导致 GoldenGate 进程无法启动。
ENABLE_GOLDENGATE_REPLICATION 是从根容器(CDB$ROOT)设置的。在 PDB 内运行该命令将失败。
ALTER SESSION SET CONTAINER = CDB$ROOT;
连接到根容器后,运行之前使用的相同命令:
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;
ENABLE_GOLDENGATE_REPLICATION 无法在单个 PDB 级别修改。在连接到 PDB 时尝试设置它会返回:
ORA-65040: operation not allowed from within a pluggable database
这是预期行为。该参数是 CDB 范围的设置,因此无论要复制哪些 PDB,都必须始终从 CDB$ROOT 进行配置。
如果目标 PDB 本身处于关闭或挂载状态,在根容器中启用该参数也无济于事。GoldenGate 的 Extract 或 Replicat 进程需要 PDB 完全打开才能从中读取或向其写入。
检查每个 PDB 的状态:
SHOW PDBS;
确认目标 PDB 在 OPEN MODE 下显示 READ WRITE。如果没有,请打开它:
ALTER PLUGGABLE DATABASE OPEN;
有时即使参数已更新,ORA-26947 错误仍然存在。发生这种情况时,下一步是检查环境不匹配或缺少日志记录依赖项。
在运行多个数据库实例的服务器上,很容易在错误的实例上更新参数。这通常归结为在错误的 ORACLE_SID 环境变量下运行 SQL 命令。
检查实例名称和参数值,以确认您位于正确的数据库上:
SELECT instance_name, status FROM v$instance;
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;
如果实例名称与 GoldenGate 配置为从中捕获的数据库不匹配,请切换 ORACLE_SID 环境变量,并在正确的实例上重新应用修复。
GoldenGate 的 Extract 和 Replicat 进程使用凭据存储或 TNS 别名进行连接。如果 DBLOGIN 命令中的别名指向错误的服务,例如只读 Active Data Guard 备库或不同的容器,进程最终会连接到一个从未启用该参数的数据库。
检查 tnsnames.ora 文件或 GoldenGate 凭据存储配置:
GGSCI> DBLOGIN USERIDALIAS ggadmin_prod
确认别名 ggadmin_prod 指向读写主数据库,而不是备库或辅助实例。
GoldenGate 从数据库的重做日志中读取事务详细信息。在 NOARCHIVELOG 模式下,这些日志会很快被覆盖,并且不会保留在磁盘上,从而阻止复制读取历史变更数据。
检查数据库的日志记录模式:
ARCHIVE LOG LIST;
如果输出显示“Database log mode: No Archive Mode”,则切换到 ARCHIVELOG 模式需要短暂的维护窗口,因为数据库必须以 mount 状态重启:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
默认情况下,Oracle 重做日志仅捕获从崩溃中恢复所需的最少信息。GoldenGate 需要更多信息,例如主键和已更改列的值,以重建完整的 SQL 操作进行复制。这就是补充日志提供的内容。
在数据库级别检查并启用最小补充日志:
SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
架构级或表级补充日志是单独配置的,在开始复制之前从 GGSCI 中配置:
GGSCI> DBLOGIN USERID ggsadmin, PASSWORD password
GGSCI> ADD SCHEMATRANDATA
某些操作,例如直接路径加载或批量插入,可以使用 NOLOGGING 子句跳过写入重做日志以获得更好的性能。由于 GoldenGate 只复制写入重做日志的内容,NOLOGGING 事务会被完全遗漏,这可能导致 Extract 进程失败或数据不同步。
SELECT force_logging FROM v$database;
如果结果为 NO,请启用 FORCE LOGGING,以覆盖所有事务中的本地 NOLOGGING 指令:
ALTER DATABASE FORCE LOGGING;
上述排查步骤可以修复 ORA-26947,但它们并没有解决一个更广泛的问题:如何在不依赖 GoldenGate 许可或手动跟踪每个 RAC 节点和 PDB 上的 ENABLE_GOLDENGATE_REPLICATION 等参数的情况下,保持 Oracle 数据库同步。
i2Stream 正是为此而构建的。它通过日志解析实时复制 Oracle 数据库,无需在源数据库上安装代理。由于它直接读取归档日志和重做日志,而不是依赖数据库级复制服务,因此从一开始就不存在需要排查的 ORA-26947 等价问题。
对于已经在处理前面介绍的 CDB/PDB 和 RAC 特定配置步骤的团队,i2Stream 简化了设置:
如果你当前的设置同时涉及实时复制和灾难恢复,i2Availability 通过为备用数据库提供自动故障转移进一步扩展了这一点,减少了主实例宕机时的手动干预。
Q1:ORA-26947 是什么意思?
ORA-26947 表示数据库未配置为允许 Oracle GoldenGate 复制。它通常出现是因为 ENABLE_GOLDENGATE_REPLICATION 参数被设置为 FALSE。
Q2:如何检查 GoldenGate 复制是否已启用?
在 SQL*Plus 中运行 SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION。值为 TRUE 表示已启用;FALSE 表示未启用。
Q3:启用 GoldenGate 复制后需要重启 Oracle 吗?
不需要。ENABLE_GOLDENGATE_REPLICATION 是动态参数,因此 ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH 会立即生效,无需重启数据库。
Q4:ORA-26947 会影响 Extract 还是 Replicat?
两者都会。Extract 和 Replicat 进程都依赖此参数被启用,因此在它设置为 FALSE 时,任一进程都可能无法启动或注册。
Q5:ORA-26947 会在 Oracle RAC 中发生吗?
会。如果参数只在一个 RAC 实例上设置,其他节点仍会引发 ORA-26947。设置参数时请使用 SID='*',以便应用到所有实例。
Q6:我可以在 PDB 内设置 ENABLE_GOLDENGATE_REPLICATION 吗?
不可以。该参数只能从根容器(CDB$ROOT)设置。在 PDB 内尝试设置会返回 ORA-65040。
Q7:启用此参数需要 GoldenGate 许可证吗?
需要。Oracle 要求持有有效的 Oracle GoldenGate 许可证,才能使用将 ENABLE_GOLDENGATE_REPLICATION 设置为 TRUE 所解锁的功能。
ORA-26947 归根结底只有一件事:数据库尚未被允许进行 GoldenGate 复制。在大多数情况下,从根容器将 ENABLE_GOLDENGATE_REPLICATION 设置为 TRUE 即可立即清除该错误。
如果错误仍然存在,原因通常在其他地方,例如实例错误、连接别名配置错误,或缺少补充日志和 ARCHIVELOG 模式。逐一排查这些问题将有助于缩小范围。
对于希望在不跨 RAC 节点和 PDB 管理 GoldenGate 参数的情况下实现实时 Oracle 复制的团队,英方软件 提供 i2Stream 作为基于日志、无代理的替代方案。
公告
邮件
销售