Yugabyte:支持的对象和操作数
以下列表介绍了 Oracle GoldenGate for Yugabyte 支持的对象和操作:
-
Oracle GoldenGate Extract 支持
yboutput插件。 -
副本身份
CHANGE是 Yugabyte 的本机设置,建议在使用yboutput插件时使用,因为与其他副本身份类型相比,它提供了更好的性能。 -
yboutput插件支持双向复制。在使用yboutput插件进行双向复制时,必须先创建 Oracle GoldenGate 检查点表并将其包含在发布列表中,然后才能启动 CDC 提取进程。此外,仅应在创建检查点表并将其添加到发布后创建复制插槽。
-
test_decoding插件支持双向复制。在使用test_decoding插件注册任何提取之前,必须先创建包括检查点表的所有表。对于PGOUTPUT插件,在提取注册之前,检查点表以及所有其他相关表必须包括在发布中。
注:请勿删除包括检查点表的任何表。
-
仅
pgoutput/yboutput插件支持多个截断操作。 -
注册带有
pgplugintype选项的命令:-
pgplugintype选项在 Web 界面和 Admin Client 中均可使用REGISTER EXTRACT命令。此选项允许您选择test_decoding或pgoutput作为逻辑解码插件。 -
指定
pgplugintype pgoutput时,底层模块会自动使用yboutput插件来注册提取进程。 -
如果不指定任何
pgplugintype,则默认情况下 CDC Extract 使用test_decoding插件进行注册。 -
要使用 Yugabyte 显式注册
yboutput插件,必须指定pgoutput插件类型。
语法:
<pre class="copy"><code>REGISTER EXTRACT *group_name* PGPLUGINTYPE *plugin_option*;</code></pre>示例:
<pre class="copy"><code>REGISTER EXTRACT ext_yb PGPLUGINTYPE pgoutput;</code></pre> -
-
STREAMINGOPTIONS参数已在TRANLOGOPTIONS下引入。此参数允许您为复制启动命令指定publication_name。示例:
TRANLOGOPTIONS STREAMINGOPTIONS (publication_names="my*123,my_publication2,123 pub,my_publication";)使用此参数时,必须考虑以下准则和限制:
- 必须在注册“提取”处理之前创建发布。
发布名称不能包含特殊字符,包括逗号 (,) 单引号(‘)双引号 (")。
-
可以将多个发布名称指定为 publication_names 中的逗号分隔列表。例如:
TRANLOGOPTIONS STREAMINGOPTIONS (publication_names="my*123,my_publication2,123 pub,my_publication";)
列表中的最终发布名称必须以分号 (;) 结尾
字节限制
设置 Yugabyte 数据库以进行捕获和传送时,请考虑以下限制:
-
缺少大型 LOB 事务处理:当 LOB(大型对象)的大小介于 200 MB 和 400 MB 之间时,CDC 流中可能缺少整个事务处理(无论是 INSERT 还是 UPDATE)。
-
由于同一事务处理中的多个更新而导致下游中的数据不匹配:当同一事务处理中发生多个更新时,如果表的副本标识设置为
FULL或DEFAULT,则 Yugabyte 中的CDCSDK模块可能无法发送正确的 AFTER 映像。这可能会导致下游系统中 AFTER 映像的数据差异。 -
复制表(test_decoding 插件)上的 DDL 后,复制连接终止:使用
test_decoding插件时,默认情况下,数据库中的所有表都将自动包括在轮询列表中。如果对该列表中包含的任何表执行 DDL 操作(例如删除表),则服务器将终止复制连接。但是,test_decoding插件不支持删除作为轮询列表一部分的表,因此,如果您需要这种灵活性,则应切换到yboutput插件。注:删除表之前,请确保该表不属于任何发布的一部分,以避免复制错误或连接中断。同样,不要删除 Oracle GoldenGate 检查点表,因为这也会导致相同的错误。
-
由于长时间不活动而导致复制插槽失效:复制插槽保留某些资源,以防止复制所需的 WAL(写前日志)记录的垃圾收集。如果某个插槽在较长时间内保持非活动状态,则会将其标记为已过期,并释放保留的资源。到期后,复制插槽将变得不可用,必须重新创建。
默认保留窗口:
-
从版本 2024.2.1 开始的 8 小时
-
2024.2.1 之前的 4 小时版本
这是 Yugabyte 站点上提到的已知问题:
https://github.com/yugabyte/yugabyte-db/issues/27766
防止到期的建议操作:
-
启用心跳功能以确保连续的 WAL 活动并防止长时间空闲。
-
为 CDC 进程配置 autostart 或 autorestart 选项,使其自动重新连接到
CDCSDK模块,从而最大限度地减少停机时间并避免插槽失效。
-
-
如果使用 Progress DD driver 设置了
BatchMechanism 3(这是 Yugabyte 的 Replicat 进程的缺省值),则 BatchSQL 无法正常工作。因此,如果需要使用 BatchSQL,必须在 Replicat 参数文件中配置 DBOPTIONS _BatchMechanism 2 设置以获得正确功能。此解决方法可以应用于 Oracle GoldenGate 23.10 及更高版本的 Yugabyte 中的 Replicat 进程。 -
仅适用于发布的表:持久性基表和分区表可以包括在发布中。以下对象类型不能是发布的一部分:
-
临时表数
-
未记录的表
-
外部表
-
实体化视图
-
常规视图
-
-
发布删除对 CDC 提取的影响:如果在 CDC 提取仍在运行期间删除了发布,则存在复制插槽损坏的风险,导致其停止运行。在这种情况下,受影响的复制插槽将变得不可用,仅重新创建同一发布将无法解决该问题。在现有流上没有恢复的解决方案,唯一的方法是创建新发布并将其与新的复制插槽关联。
-
时区限制 (Limitations with Timezone,TZ): WAL 发送方进程始终以 UTC 格式传输提交的时间戳。如果 Oracle GoldenGate 会话时区与 UTC 不同,则在 CDC 提取进程中按时间戳进行定位时可能会发生差异。要防止出现此问题,必须在部署层设置环境变量
TZ=UTC。此限制专门适用于yboutput插件。 -
Yugabyte 不支持
pgoutput插件。 -
yboutput插件不支持全球化 -
表上的主键:Yugabyte 中的 CDC 流仅支持具有主键的表。Oracle GoldenGate CDC 提取不会捕获没有主键的表。
-
Yugabyte 中的主键更新:Yugabyte 中的 PK UPDATE 将记录为 DELETE,后跟 INSERT。Oracle GoldenGate Extract 将 PK UPDATE 的统计信息显示为 DELETE 和 INSERT。虽然在提取统计信息中统计信息不会显示为更新操作,但源和目标的数据不会有任何差异。
-
副本标识行为:在创建插槽后,无法更改在创建插槽时存在的表的副本标识。但是,可以使用
ysql_yb_default_replica_identity、cdcsdk_publication_list_refresh_interval_secs和csdk_enable_dynamic_table_support tserver标志设置在创建插槽后创建的所有新表的副本标识。在创建新表之前,需要在主服务器和t-server中设置这些标志。缺省情况下,
cdcsdk_publication_list_refresh_interval_secs设置为 900 秒,即 15 分钟。您需要根据您的要求设置此项。降低其值将减少要在 CDCSDK 模块中刷新的新表,这将有助于 Oracle GoldenGate 捕获这些新表的任何记录。以下示例显示了在创建 SLOT 后为动态创建的表设置的标志:ysql_yb_default_replica_identity=FULL,cdcsdk_publication_list_refresh_interval_secs=120,cdcsdk_enable_dynamic_table_support=true -
不支持按日志结尾 (EOL) 或文件结尾 (EOF) 进行定位:您可以按当前时间戳更改插槽位置,而 EOL/EOF 将筛选现有记录。
-
截断操作:不支持
GETTRUNCATES/IGNORETRUNCATES等参数,因为如果为更改数据捕获启用了数据库,则数据库不允许用户截断表。 -
WAL 保留:Yugabyte 通常会在一段时间后清除 WAL 段。这意味着在提取停机较长时间时,如果日志被截断,Oracle GoldenGate 可能会丢失 WAL 日志数据。在调整了几个参数(如
cdc_intent_retention_ms和cdc_wal_retention_time_secs)以将WAL日志保留更长时间之前,不会保证在 Yugabyte 中保留 WAL。应在运行 Oracle GoldenGate 提取流程的所有节点或集群中调整此项。建议值如下所示:
cdc_wal_retention_time_secs=86400cdc_intent_retention_ms = 86400000 -
UNREGISTER EXTRACT命令:Oracle GoldenGate 使用UNREGISTER EXTRACT命令删除复制插槽。复制插槽只能在从其使用的客户机停止至少ysql_cdc_active_replication_slot_window_ms持续时间后删除。标志的默认值为 5 分钟,这意味着您必须等待复制插槽可以保持不活动状态的最大时间窗口,然后才被视为过时。在群集设置的情况下,需要在具有相同值的所有节点中调整此参数。
-
BLOB/CLOB限制:文本/图像等数据类型具有仅捕获 200MB 数据的限制。行大小不应超过 32MB,包含 lob 数据的每个列应最多保留 2MB。https://docs.yugabyte.com/stable/develop/best-practices-ysql/#row-size-limit
-
在 DML 操作中使用 SAVEPOINT 和回退的限制:Oracle GoldenGate CDC Extract 不支持
SAVEPOINT回退操作。CDCtest_decoding插件不接受ROLLBACK TO SAVEPOINT命令。因此,提取仍会捕获和处理本应因回退而排除的记录。此行为是 Yugabyte CDC SDK 模块的已知限制。要了解更多信息,请参阅以下链接:
https://yugabyte.atlassian.net/browse/DB-11714
https://docs.yugabyte.com/stable/develop/change-data-capture/using-logical-replication/#limitations
-
删除表限制:创建插槽后,在删除该插槽之前,用户不得从数据库中删除任何表。如果插槽处于活动状态并且用户尝试从数据库中删除任何表,则 CDC Extract 将无法从作为复制一部分的其他 CDC 表中捕获任何记录。此外,建议在运行 CDC 提取时,用户也不应删除创建插槽的数据库上的任何表。如果不遵循此步骤,则 CDC 提取将异常终止,并出现类似于以下内容的断开错误:
Error: The server has ended the streaming connection. -
对 statement_timeout 的限制:不应在用户或数据库级别修改 Yugabyte 参数
statement_timeout,并且应将其保留为默认值。如果它设置为较低值,则 CDC 提取将无法从WAL读取记录。如果需要,应始终仅在会话级别设置。 -
不支持在副本节点中以只读模式创建插槽:CDC 提取将无法从副本节点捕获记录。这是因为我们支持的版本(如 2024.2.1.0 或 2024.2.2.0)基于 PostgreSQL 11.2 构建,该版本不支持在副本节点中创建插槽。