我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
启动满负荷和 CDC 任务时,亚马逊云科技 DMS 如何处理未结交易
对于关系数据库管理系统 (RDBMS) 而言,一致性是事务的关键属性之一——它定义了在事务完成后将数据点保持在正确状态的规则。数据的一致性可确保交易仅以预定义的、可预测的方式对表进行更改,从而防止对数据的完整性造成意想不到的后果。对于减少停机时间的 RDBMS 的典型迁移方法,应首先从源数据库中获取一致的快照。然后,应记录拍摄一致快照的交易位置,以建立与源数据库持续一致的复制。从概念上讲,如果快照和复制开始之间存在任何间隔或缺少事务,则迁移的目标数据库将不一致。
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 源捕获流程确定了两笔未完成的交易:
- 事务 1 — 尽管在源捕获开始时它是一个开放事务,但它在 transactionConsific
encyTimeout
时间框架内和满载开始之前提交。因此,它包含在满负荷阶段中。 - 事务 2 — 它在
事务一致性超时
时间段内和满载开始之前启动并提交。因此,它包含在满负荷阶段中。 - 事务 3 和 4 — 它们在满载阶段提交,因此成为缓存的更改,并在满载完成后应用。
- 事务 5 — 它在满载阶段启动,并在满载完成后提交,因此它成为 CDC 更改,并在应用缓存的更改后应用。
- 事务 6 — 任务继续,因为默认情况下
failonTransactionConsioncyBreached
为假。打开的交易 B 被跳过,这会导致数据丢失,因为它是在 tansactioncyConsityT
imeout 之后提交的。我们将在后面的部分中讨论有关交易
一致性超时和 failonTransactionc
yBreached 设置的最佳实践。
以下日志显示了有未结交易时的典型 亚马逊云科技 DMS 日志签名的示例。 SOURCE_CAPTUR
E 组件标识未完成事务的数量,而 SORTER 会在事务一致性超时后
输出事务一致性超时警告。
亚马逊云科技 DMS 如何处理 SQL Server 源的未结交易
同样,当满载和 CDC 任务开始使用 SQL Server 作为源时,如果有任何未完成的交易,亚马逊云科技 DMS SOURC E_CAPTURE
会按如下方式 识别和打印日志:
对于禁用 RE
AD_COMMIT TED_SNAPSH
的数据。因此,对于包含通过满载和 CDC 任务迁移的未完成事务的表,在任务范围内 该表的活动事务被提交或回滚之前, O
T 时 的 READ COMMITTED 隔离级别(这是 SQL Server 中的默认隔离),不允许这些语句读取已修改但尚未被其他事务提交 从确切的表 中选择*
将被阻止。如果桌面上有不在任务范围内的未结交易,则 亚马逊云科技 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 先决条件检查会失败:
亚马逊云科技 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
- 对于 Oracle,请查看
- 默认情况下,
事务一致性超时 为
10 分钟。如果源数据库的事务持续超过 10 分钟,请增加事务
一致性超时。 - 使用
亚马逊云科技 DMS 验证 来识别数据丢失和一致性问题。
结论
任何数据库迁移项目都不希望丢失数据。在这篇文章中,我们描述了未结交易,以及启动不同数据库引擎的满负荷和CDC任务时,亚马逊云科技 DMS如何处理这些交易。我们分享了在规划和运行 亚马逊云科技 DMS 任务时应遵循的最佳实践,以避免与未决交易相关的问题。
如果您有任何问题或建议,请发表评论。
作者简介
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。