ORA-26947 的原因是什么?

当 GoldenGate 复制未在数据库级别启用时,就会发生此错误,从而阻止复制进程启动或继续运行。常见原因包括:

  • ENABLE_GOLDENGATE_REPLICATION 被设置为 FALSE 这个初始化参数在 Oracle 11.2.0.4 中引入,默认值为 FALSE。在将其设置为 TRUE 之前,数据库会阻止 GoldenGate 注册、提取或应用数据。
  • 参数在设置后从未启用。 管理员通常完成 GoldenGate 安装并配置其 Manager、Extract 或 Replicat 参数文件后,却没有改动数据库自身的初始化设置。在开启此参数之前,数据库无法知道正在使用 GoldenGate。
  • 数据库准备工作不完整。 如果缺少其他设置,例如事务日志记录不正确或缺少补充日志,仅启用该参数也无济于事。这类缺口通常会在进程注册期间触发 ORA-26947。

ora 26947 的常见原因

通过启用 Oracle GoldenGate 复制来修复 ORA-26947

要解决 ORA-26947 错误,请更改控制 GoldenGate 访问权限的数据库初始化参数。以下步骤涵盖连接数据库、启用参数以及确认修复。

步骤 1:以 SYSDBA 身份连接 Oracle

更改此参数需要 SYSDBA 权限。打开 SQL*Plus 并以具有 SYSDBA 访问权限的用户连接:

bash
sqlplus / as sysdba

步骤 2:检查当前参数值

在进行任何更改之前,请检查当前设置:

bash
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;

如果 GoldenGate 复制未启用,该值将显示为 FALSE

步骤 3:启用 ENABLE_GOLDENGATE_REPLICATION

ENABLE_GOLDENGATE_REPLICATION 是动态参数,因此无需重启数据库即可启用:

bash
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;

SCOPE=BOTH 会立即将更改应用到正在运行的实例,并写入服务器参数文件(spfile),因此重启后仍会保留。

注意: 在 RAC 环境中,请在此命令中添加 SID='*',以便更改应用到所有实例。下文 RAC 部分将对此进行更详细的介绍。

步骤 4:验证 GoldenGate 复制已启用

再次运行相同的检查以确认更改已生效:

bash
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;

该值现在应显示为 TRUE

步骤 5:重启失败的 GoldenGate 进程

启用参数后,返回 GGSCI 并启动最初失败的 Extract 或 Replicat 进程:

bash
GGSCI> START EXTRACT 

使用 INFO EXTRACT <extract_name> 检查其状态,并确认它进入 RUNNING 状态且没有进一步错误。

如何在 Oracle RAC 中修复 ORA-26947

在 Oracle Real Application Clusters(RAC)环境中,所有实例都需要使用相同的参数设置。如果只在一个节点上更改了该参数,连接到其他节点的 GoldenGate 进程将继续引发 ORA-26947 错误。

要将更改应用到整个集群,请使用 SID='*' 子句。这会更新所有实例的内存,并将设置写入共享服务器参数文件(spfile)。可从任何活动的 RAC 节点运行此命令:

bash
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH SID='*';

运行后,请使用以下命令确认每个实例上的设置:

bash
SELECT inst_id, name, value 
FROM gv$parameter 
WHERE name = 'enable_goldengate_replication';

每一行的 VALUE 列都应显示 TRUE。如果某个节点仍显示 FALSE,则可能是该节点在命令执行时未运行,或者之后重启时未读取新的 spfile 值。请检查该节点是否在线,如有需要,直接在其上应用该命令。

如何在 CDB 或 PDB 环境中修复 ORA-26947

在多租户 Oracle 环境中,容器级规则会影响可以在何处设置复制参数。在容器数据库(CDB)或可插拔数据库(PDB)中的错误级别应用该设置,将导致 GoldenGate 进程无法启动。

连接到正确的容器

ENABLE_GOLDENGATE_REPLICATION 是从根容器(CDB$ROOT)设置的。在 PDB 内运行该命令将失败。

bash
ALTER SESSION SET CONTAINER = CDB$ROOT;

连接到根容器后,运行之前使用的相同命令:

bash
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;

检查该参数在 PDB 中是否可修改

ENABLE_GOLDENGATE_REPLICATION 无法在单个 PDB 级别修改。在连接到 PDB 时尝试设置它会返回:

bash
ORA-65040: operation not allowed from within a pluggable database

这是预期行为。该参数是 CDB 范围的设置,因此无论要复制哪些 PDB,都必须始终从 CDB$ROOT 进行配置。

验证所有必需的 PDB 均已打开

如果目标 PDB 本身处于关闭或挂载状态,在根容器中启用该参数也无济于事。GoldenGate 的 Extract 或 Replicat 进程需要 PDB 完全打开才能从中读取或向其写入。

检查每个 PDB 的状态:

bash
SHOW PDBS;

确认目标 PDB 在 OPEN MODE 下显示 READ WRITE。如果没有,请打开它:

bash
ALTER PLUGGABLE DATABASE  OPEN;

启用 GoldenGate 复制后 ORA-26947 仍然出现

有时即使参数已更新,ORA-26947 错误仍然存在。发生这种情况时,下一步是检查环境不匹配或缺少日志记录依赖项。

参数更改未应用到正确的实例

在运行多个数据库实例的服务器上,很容易在错误的实例上更新参数。这通常归结为在错误的 ORACLE_SID 环境变量下运行 SQL 命令。

检查实例名称和参数值,以确认您位于正确的数据库上:

bash
SELECT instance_name, status FROM v$instance;
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;

如果实例名称与 GoldenGate 配置为从中捕获的数据库不匹配,请切换 ORACLE_SID 环境变量,并在正确的实例上重新应用修复。

参数已启用,但 GoldenGate 进程使用另一个数据库

GoldenGate 的 Extract 和 Replicat 进程使用凭据存储或 TNS 别名进行连接。如果 DBLOGIN 命令中的别名指向错误的服务,例如只读 Active Data Guard 备库或不同的容器,进程最终会连接到一个从未启用该参数的数据库。

检查 tnsnames.ora 文件或 GoldenGate 凭据存储配置:

bash
GGSCI> DBLOGIN USERIDALIAS ggadmin_prod

确认别名 ggadmin_prod 指向读写主数据库,而不是备库或辅助实例。

数据库未处于 ARCHIVELOG 模式

GoldenGate 从数据库的重做日志中读取事务详细信息。在 NOARCHIVELOG 模式下,这些日志会很快被覆盖,并且不会保留在磁盘上,从而阻止复制读取历史变更数据。

检查数据库的日志记录模式:

bash
ARCHIVE LOG LIST;

如果输出显示“Database log mode: No Archive Mode”,则切换到 ARCHIVELOG 模式需要短暂的维护窗口,因为数据库必须以 mount 状态重启:

bash
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

缺少补充日志

默认情况下,Oracle 重做日志仅捕获从崩溃中恢复所需的最少信息。GoldenGate 需要更多信息,例如主键和已更改列的值,以重建完整的 SQL 操作进行复制。这就是补充日志提供的内容。

在数据库级别检查并启用最小补充日志:

bash
SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

架构级或表级补充日志是单独配置的,在开始复制之前从 GGSCI 中配置:

bash
GGSCI> DBLOGIN USERID ggsadmin, PASSWORD password
GGSCI> ADD SCHEMATRANDATA 

未启用 FORCE LOGGING

某些操作,例如直接路径加载或批量插入,可以使用 NOLOGGING 子句跳过写入重做日志以获得更好的性能。由于 GoldenGate 只复制写入重做日志的内容,NOLOGGING

当数据库未配置为支持 Oracle GoldenGate 复制时,就会出现 ORA-26947 错误。它通常会在启动或注册 Extract 或 Replicat 进程时出现。本指南将逐步介绍其根本原因以及如何修复。

ORA-26947 的原因是什么?

当 GoldenGate 复制未在数据库级别启用时,就会发生此错误,从而阻止复制进程启动或继续运行。常见原因包括:

  • ENABLE_GOLDENGATE_REPLICATION 被设置为 FALSE 这个初始化参数在 Oracle 11.2.0.4 中引入,默认值为 FALSE。在将其设置为 TRUE 之前,数据库会阻止 GoldenGate 注册、提取或应用数据。
  • 参数在设置后从未启用。 管理员通常完成 GoldenGate 安装并配置其 Manager、Extract 或 Replicat 参数文件后,却没有改动数据库自身的初始化设置。在开启此参数之前,数据库无法知道正在使用 GoldenGate。
  • 数据库准备工作不完整。 如果缺少其他设置,例如事务日志记录不正确或缺少补充日志,仅启用该参数也无济于事。这类缺口通常会在进程注册期间触发 ORA-26947。

通过启用 Oracle GoldenGate 复制来修复 ORA-26947

要解决 ORA-26947 错误,请更改控制 GoldenGate 访问权限的数据库初始化参数。以下步骤涵盖连接数据库、启用参数以及确认修复。

步骤 1:以 SYSDBA 身份连接 Oracle

更改此参数需要 SYSDBA 权限。打开 SQL*Plus 并以具有 SYSDBA 访问权限的用户连接:

bash
sqlplus / as sysdba

步骤 2:检查当前参数值

在进行任何更改之前,请检查当前设置:

bash
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;

如果 GoldenGate 复制未启用,该值将显示为 FALSE

步骤 3:启用 ENABLE_GOLDENGATE_REPLICATION

ENABLE_GOLDENGATE_REPLICATION 是动态参数,因此无需重启数据库即可启用:

bash
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;

SCOPE=BOTH 会立即将更改应用到正在运行的实例,并写入服务器参数文件(spfile),因此重启后仍会保留。

注意: 在 RAC 环境中,请在此命令中添加 SID='*',以便更改应用到所有实例。下文 RAC 部分将对此进行更详细的介绍。

步骤 4:验证 GoldenGate 复制已启用

再次运行相同的检查以确认更改已生效:

bash
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;

该值现在应显示为 TRUE

步骤 5:重启失败的 GoldenGate 进程

启用参数后,返回 GGSCI 并启动最初失败的 Extract 或 Replicat 进程:

bash
GGSCI> START EXTRACT 

使用 INFO EXTRACT <extract_name> 检查其状态,并确认它进入 RUNNING 状态且没有进一步错误。

如何在 Oracle RAC 中修复 ORA-26947

在 Oracle Real Application Clusters(RAC)环境中,所有实例都需要使用相同的参数设置。如果只在一个节点上更改了该参数,连接到其他节点的 GoldenGate 进程将继续引发 ORA-26947 错误。

要将更改应用到整个集群,请使用 SID='*' 子句。这会更新所有实例的内存,并将设置写入共享服务器参数文件(spfile)。可从任何活动的 RAC 节点运行此命令:

bash
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH SID='*';

运行后,请使用以下命令确认每个实例上的设置:

bash
SELECT inst_id, name, value 
FROM gv$parameter 
WHERE name = 'enable_goldengate_replication';

每一行的 VALUE 列都应显示 TRUE。如果某个节点仍显示 FALSE,则可能是该节点在命令执行时未运行,或者之后重启时未读取新的 spfile 值。请检查该节点是否在线,如有需要,直接在其上应用该命令。

如何在 CDB 或 PDB 环境中修复 ORA-26947

在多租户 Oracle 环境中,容器级规则会影响可以在何处设置复制参数。在容器数据库(CDB)或可插拔数据库(PDB)中的错误级别应用该设置,将导致 GoldenGate 进程无法启动。

连接到正确的容器

ENABLE_GOLDENGATE_REPLICATION 是从根容器(CDB$ROOT)设置的。在 PDB 内运行该命令将失败。

bash
ALTER SESSION SET CONTAINER = CDB$ROOT;

连接到根容器后,运行之前使用的相同命令:

bash
ALTER SYSTEM SET ENABLE_GOLDENGATE_REPLICATION=TRUE SCOPE=BOTH;

检查该参数在 PDB 中是否可修改

ENABLE_GOLDENGATE_REPLICATION 无法在单个 PDB 级别修改。在连接到 PDB 时尝试设置它会返回:

bash
ORA-65040: operation not allowed from within a pluggable database

这是预期行为。该参数是 CDB 范围的设置,因此无论要复制哪些 PDB,都必须始终从 CDB$ROOT 进行配置。

验证所有必需的 PDB 均已打开

如果目标 PDB 本身处于关闭或挂载状态,在根容器中启用该参数也无济于事。GoldenGate 的 Extract 或 Replicat 进程需要 PDB 完全打开才能从中读取或向其写入。

检查每个 PDB 的状态:

bash
SHOW PDBS;

确认目标 PDB 在 OPEN MODE 下显示 READ WRITE。如果没有,请打开它:

bash
ALTER PLUGGABLE DATABASE  OPEN;

启用 GoldenGate 复制后 ORA-26947 仍然出现

有时即使参数已更新,ORA-26947 错误仍然存在。发生这种情况时,下一步是检查环境不匹配或缺少日志记录依赖项。

参数更改未应用到正确的实例

在运行多个数据库实例的服务器上,很容易在错误的实例上更新参数。这通常归结为在错误的 ORACLE_SID 环境变量下运行 SQL 命令。

检查实例名称和参数值,以确认您位于正确的数据库上:

bash
SELECT instance_name, status FROM v$instance;
SHOW PARAMETER ENABLE_GOLDENGATE_REPLICATION;

如果实例名称与 GoldenGate 配置为从中捕获的数据库不匹配,请切换 ORACLE_SID 环境变量,并在正确的实例上重新应用修复。

参数已启用,但 GoldenGate 进程使用另一个数据库

GoldenGate 的 Extract 和 Replicat 进程使用凭据存储或 TNS 别名进行连接。如果 DBLOGIN 命令中的别名指向错误的服务,例如只读 Active Data Guard 备库或不同的容器,进程最终会连接到一个从未启用该参数的数据库。

检查 tnsnames.ora 文件或 GoldenGate 凭据存储配置:

bash
GGSCI> DBLOGIN USERIDALIAS ggadmin_prod

确认别名 ggadmin_prod 指向读写主数据库,而不是备库或辅助实例。

数据库未处于 ARCHIVELOG 模式

GoldenGate 从数据库的重做日志中读取事务详细信息。在 NOARCHIVELOG 模式下,这些日志会很快被覆盖,并且不会保留在磁盘上,从而阻止复制读取历史变更数据。

检查数据库的日志记录模式:

bash
ARCHIVE LOG LIST;

如果输出显示“Database log mode: No Archive Mode”,则切换到 ARCHIVELOG 模式需要短暂的维护窗口,因为数据库必须以 mount 状态重启:

bash
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;

缺少补充日志

默认情况下,Oracle 重做日志仅捕获从崩溃中恢复所需的最少信息。GoldenGate 需要更多信息,例如主键和已更改列的值,以重建完整的 SQL 操作进行复制。这就是补充日志提供的内容。

在数据库级别检查并启用最小补充日志:

bash
SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

架构级或表级补充日志是单独配置的,在开始复制之前从 GGSCI 中配置:

bash
GGSCI> DBLOGIN USERID ggsadmin, PASSWORD password
GGSCI> ADD SCHEMATRANDATA 

未启用 FORCE LOGGING

某些操作,例如直接路径加载或批量插入,可以使用 NOLOGGING 子句跳过写入重做日志以获得更好的性能。由于 GoldenGate 只复制写入重做日志的内容,NOLOGGING 事务会被完全遗漏,这可能导致 Extract 进程失败或数据不同步。

bash
SELECT force_logging FROM v$database;

如果结果为 NO,请启用 FORCE LOGGING,以覆盖所有事务中的本地 NOLOGGING 指令:

bash
ALTER DATABASE FORCE LOGGING;

使用 i2Stream 实现实时 Oracle 数据库复制

上述排查步骤可以修复 ORA-26947,但它们并没有解决一个更广泛的问题:如何在不依赖 GoldenGate 许可或手动跟踪每个 RAC 节点和 PDB 上的 ENABLE_GOLDENGATE_REPLICATION 等参数的情况下,保持 Oracle 数据库同步。

i2Stream 正是为此而构建的。它通过日志解析实时复制 Oracle 数据库,无需在源数据库上安装代理。由于它直接读取归档日志和重做日志,而不是依赖数据库级复制服务,因此从一开始就不存在需要排查的 ORA-26947 等价问题。

对于已经在处理前面介绍的 CDB/PDB 和 RAC 特定配置步骤的团队,i2Stream 简化了设置:

  • 无代理日志捕获。 通过解析在线和归档重做日志来捕获数据变更,因此对生产数据库没有影响,也无需管理每个实例的参数。
  • 事务级一致性。 复制通过插入、更新和删除的冲突解决来保持事务完整性,因此即使在高并发工作负载下,复制的数据也能保持一致。
  • 时间点恢复。 i2Stream 不仅支持向前复制,还支持从指定 SCN 恢复,这在复制问题后需要回滚到已知良好状态时非常有用。
  • 灵活的拓扑。 支持一对一、一对多和多对一复制模式,因此同一套设置可以扩展到迁移、灾难恢复或为数据仓库供数,而无需从头重新配置。

如果你当前的设置同时涉及实时复制和灾难恢复,i2Availability 通过为备用数据库提供自动故障转移进一步扩展了这一点,减少了主实例宕机时的手动干预。

ORA-26947 故障排查 FAQ

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 作为基于日志、无代理的替代方案。

博客分类底部

准备好构建企业数据韧性了吗?

立即开启 60 天免费试用,或预约产品演示,了解英方软件如何为您的核心业务提供「零中断、零丢失」的数据保护。

请先完成图形验证

验  证  码:

英方官网验证码
第三方二维码 第三方二维码
英方公告铃铛图标
英方公告铃铛图标

公告

英方侧边栏向右箭头
英方高亮提示圆点
英方软件公告
各位求职者、合作伙伴:
近期有第三方冒用英方名义发布虚假招聘、不实业务信息。我司正规招聘全程零收费,非官网渠道信息均不作数。
信息核验热线:400-0078-655
遇诈骗请保留证据,及时联系我们并报警
英方软件
2026 年 6 月 23 日
英方邮件咨询图标
英方邮件咨询图标

邮件

英方销售支持图标
英方销售支持图标

销售

英方侧边栏向右箭头
联系销售:400-0078-655 转 1