启动满负荷和 CDC 任务时,亚马逊云科技 DMS 如何处理未结交易

对于关系数据库管理系统 (RDBMS) 而言,一致性是事务的关键属性之一——它定义了在事务完成后将数据点保持在正确状态的规则。数据的一致性可确保交易仅以预定义的、可预测的方式对表进行更改,从而防止对数据的完整性造成意想不到的后果。对于减少停机时间的 RDBMS 的典型迁移方法,应首先从源数据库中获取一致的快照。然后,应记录拍摄一致快照的交易位置,以建立与源数据库持续一致的复制。从概念上讲,如果快照和复制开始之间存在任何间隔或缺少事务,则迁移的目标数据库将不一致。

亚马逊云科技 数据库迁移服务 (亚马逊云科技 DMS) 可帮助您迁移关系数据库、数据仓库、NoSQL 数据库和其他类型的数据存储。为了管理初始数据加载或 亚马逊云科技 DMS 满载阶段以及变更数据捕获 (CDC) 从一致状态开始的交易位置,亚马逊云科技 DMS 实施了设置 transactionConsityTimeout 的任务, 以在 亚马逊云科技 DMS 任务启动时处理未结交易。在这篇文章中,我们将讨论启动满负荷时的 亚马逊云科技 DMS 如何处理未结交易以及各种引擎的 CDC 任务,并分享避免一致性超时问题的最佳实践。

有关事务一致性超时的常见问题

以下是有关 事务一致性超时 的一些典型问题, 具体取决于您的源数据库:

  • Oracle 源代码 — 为什么我的任务在开始 之前在 “加载前 ” 状态中挂起 10 分钟?我的任务日志中的未结交易是什么意思?未平仓交易超时的后果是什么?
  • SQL Server 源代码 — 启动任务时,为什么我的任务会处于 “ 加载 之前 ” 状态?
  • PostgreSQL 源代码 — 尽管我没有设置 st at ement_timeout,但为什么我的任务在任务开始时因语句超时而失败?
  • MySQL 来源 — 长时间交易会阻碍满负荷和 CDC 任务的启动吗?

为了回答这些问题,让我们来看看 亚马逊云科技 DMS 中未平仓交易的含义。

在 亚马逊云科技 DMS 中打开交易

亚马逊云科技 DMS 中的未结交易是源关系数据库中的一项交易,在 亚马逊云科技 DMS 满负荷和 CDC 任务启动时尚未提交或回滚。同样,在使用前面提到的迁移方法时,亚马逊云科技 DMS 需要保持一致的状态才能启动初始批量加载,CDC 的交易状态也必须保持一致。由于不同的 RDBMS 引擎实现交易日志的方式不同,因此 亚马逊云科技 DMS 对各种 RDBMS 源的行为也不同。在以下部分中,我们将介绍 亚马逊云科技 DMS 如何处理以甲骨文、SQL Server、PostgreSQL 和 MySQL 为源的未结交易。

亚马逊云科技 DMS 如何处理 Oracle 源的未平仓交易

对于满负荷和 CDC 任务,任务设置 transactioncyConsityTimeout 定义了 亚马逊云科技 DMS 在开始满负载操作之前等待交易关闭的秒数。默认值为 600(10 分钟)。如果任务启动时有任何交易处于打开状态,则默认情况下,亚马逊云科技 DMS 将等待 10 分钟。达到 transactioncyConsityTimeout 值后,即使有未完成的事务,也将开始满载,并且长于 transactioncyConsityTimeout 的事务在未来的复制中也会丢 失。

在下图中,当满载和 CDC 任务启动时,在总共六笔交易中,亚马逊云科技 DMS 源捕获流程确定了两笔未完成的交易:

Open Transaction handle by AWS DMS

  • 事务 1 — 尽管在源捕获开始时它是一个开放事务,但它在 transactionConsific encyTimeout 时间框架内和满载开始之前提交。因此,它包含在满负荷阶段中。
  • 事务 2 — 它在 事务一致性超时 时间段内和满载开始之前启动并提交。因此,它包含在满负荷阶段中。
  • 事务 3 和 4 — 它们在满载阶段提交,因此成为缓存的更改,并在满载完成后应用。
  • 事务 5 — 它在满载阶段启动,并在满载完成后提交,因此它成为 CDC 更改,并在应用缓存的更改后应用。
  • 事务 6 — 任务继续,因为默认情况下 failonTransactionConsioncyBreached 为假。打开的交易 B 被跳过,这会导致数据丢失,因为它是在 tansactioncyConsity T imeout 之后提交的。 我们将在后面的部分中讨论有关交易 一致性超时和 failonTransactionc yBreached 设置的最佳实践。

以下日志显示了有未结交易时的典型 亚马逊云科技 DMS 日志签名的示例。 SOURCE_CAPTUR E 组件标识未完成事务的数量,而 SORTER 会在事务一致性超时后 输出事务一致性超时警告。

xxxx-xx-xxT00:00:00 [SOURCE_CAPTURE  ]I:  Opened transaction list contains '6' transactions, these in-flight transaction(s) will not be copied  (oracle_endpoint_capture.c:967)
…
xxxx-xx-xxT00:00:00 [SORTER          ]I:  6 open transactions. Waiting for transaction consistency  (sorter_transaction.c:322)
…
xxxx-xx-xxT00:10:00 [SORTER          ]W:  Transaction consistency timeout occurred. 6 transactions are still open  (sorter_transaction.c:3575)

亚马逊云科技 DMS 如何处理 SQL Server 源的未结交易

同样,当满载和 CDC 任务开始使用 SQL Server 作为源时,如果有任何未完成的交易,亚马逊云科技 DMS SOURC E_CAPTURE 会按如下方式 识别和打印日志:

[SOURCE_CAPTURE  ]I:  do_get_best_lowset_position_for_highest_lsn_lookup(...) There is an outstanding active transaction!! It's oldest LSN is - '00000140:000217da:0001' It may be used as a '2nd chance'  SELECT MAX() candidate.  (sqlserver_log_queries.c:750)

对于禁用 RE AD_COMMIT TED_SNAPSH O T 时 的 READ COMMITTED 隔离级别(这是 SQL Server 中的默认隔离),不允许这些语句读取已修改但尚未被其他事务提交 的数据。因此,对于包含通过满载和 CDC 任务迁移的未完成事务的表,在任务范围内 该表的活动事务被提交或回滚之前, 从确切的表 中选择* 将被阻止。如果桌面上有不在任务范围内的未结交易,则 亚马逊云科技 DMS 会等待一段时间然后启动任务。亚马逊云科技 DMS 不会等待提交或回滚来启动满载和 CDC 任务,也没有任何区别。

由于这种行为,不会丢失任何数据。但是,在任务范围内与表关联的未完成事务提交或回滚 之前,满载 和 CDC 任务一直处于 “加载之前” 状态。

亚马逊云科技 DMS 如何处理 PostgreSQL 源的未平仓交易

对于 PostgreSQL 源代码,AWS DMS 使用 PostgreSQL 插件 pglogical 或 test_decoding 通过 SOUR CE_ CAPTURE 组件读取预写日 志 (WAL)。 但是,当有活跃的交易时,创建复制槽,例如 从 pg_create_logical_replication_slot 中选择*('slot_test','test_decoding') ;将挂起。 因此,亚马逊云科技 DMS 无法创建复制槽来捕获更改。在语句 超时 之前,它会等待 tansactionConsityTimeout 。只要所有未完成的事务都在 transactionConsityTimeout 内提交或回滚 ,满载和 CDC 任务就会正常启动,不会丢失数据。如果打开的事务运行时间超过 transactionConsityTimeout ,则它会失败并按如下方式打印日志,CDC 先决条件检查会失败:

[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 42P01 NativeError: 1 Message: ERROR: relation "pglogical.replication_set" does not exist; No query has been executed with that handle [1022502] (ar_odbc_stmt.c:3752)

[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 57014 NativeError: 1 Message: ERROR: canceling statement due to statement timeout; Error while executing the query [1022502] (ar_odbc_stmt.c:2581)

[SOURCE_CAPTURE ]E: Could not find any supported plugins available on source (postgres_plugin.c:269)

亚马逊云科技 DMS 如何处理 MySQL 源的未平仓交易

对于 MySQL 源代码,亚马逊云科技 DMS 使用 二进制日志 来捕获更改。MySQL 二进制日志 不包含未提交的事务。因此,当满载和 CDC 任务启动时,亚马逊云科技 DMS 只能看到已提交的交易。任何未完成的事务都被视为缓存的更改或CDC更改,具体取决于更改的提交时间,即在满载期间或满载之后。因此,使用 MySQL 作为源时,满载和 CDC 任务不存在事务一致性超时问题。

最佳实践

以下是处理未结交易的最佳实践:

  • 作为数据迁移评估的一部分,至少在迁移阶段,提前检查源数据库中是否存在长时间运行的事务,并与应用程序或服务所有者合作,制定一个流程来最大限度地减少数据库中长时间运行的事务。
  • 对于 Oracle 源,发生事务一致性超时错误时可能会丢失数据。 因此,最好将 failonTransacti oncyBreacked 设置为 true,尽早使任务失败
  • 在源数据库的低流量时段启动满载和 CDC 任务。最好等到定时转储或提取、转换和加载 (ETL) 作业在源数据库中完成,然后再开始满载和 CDC 任务。这不仅减少了遇到事务一致性超时问题的机会,还减少了任务需要捕获的正在进行的更改的数量,以便更快地赶上源代码。
  • 当满载和 CDC 任务启动并长时间停留在 Before load 状态时,建议检查源数据库中是否存在任何未完成的事务。
    • 对于 Oracle,请查看 v$tansaction 示例 )。使用 Oracle 备用数据库(Active Data Guard 或 Amazon RDS 只读副本)数据库作为源时,请在源数据库的主数据库中检查未结交易的详细信息。
    • 对于 PostgreSQL,请查看 pg_stat_activity ( 示例 )和 pg_ prepared_xacts(示例 )。
    • 对于 SQL Server,请检查 DBCC OPENTRAN 或 dm_tran_active_tran sact
  • 默认情况下, 事务一致性超时 为 10 分钟。如果源数据库的事务持续超过 10 分钟,请增加 事务 一致性超时。
  • 使用 亚马逊云科技 DMS 验证 来识别数据丢失和一致性问题。

结论

任何数据库迁移项目都不希望丢失数据。在这篇文章中,我们描述了未结交易,以及启动不同数据库引擎的满负荷和CDC任务时,亚马逊云科技 DMS如何处理这些交易。我们分享了在规划和运行 亚马逊云科技 DMS 任务时应遵循的最佳实践,以避免与未决交易相关的问题。

如果您有任何问题或建议,请发表评论。


作者简介

赵婉辰 是 亚马逊云科技 的合作伙伴解决方案架构师

Rishi Raj Srivastava 是亚马逊 网络服务 亚马逊云科技 DMS 团队的数据库工程师。

苏迪普·阿查里亚 是印度 亚马逊云科技 ProServe 团队的顾问。他与亚马逊内部和外部客户合作,为数据库现代化项目提供指导和技术援助,帮助他们在使用 亚马逊云科技 时提高解决方案的价值。他的热情是设计和实施数据库或迁移相关工具。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。