使用 MySQL 作为源时,为什么我的 AWS DMS CDC 任务失败并显示 1236 错误?

4 分钟阅读
0

我正在使用 AWS Database Migration Service (AWS DMS) 将我的数据从源 MySQL 数据库引擎迁移到目标引擎。但是任务失败了,出现了错误讯息 1236。如何排查此问题?

简短描述

借助 AWS DMS,您可以执行一次性迁移,还可以复制正在进行的更改以使源和目标保持同步。为了从源数据库读取正在进行的更改,AWS DMS 使用特定于引擎的 API 操作从源引擎的事务日志中读取更改。使用 MySQL 作为源时,AWS DMS 会从基于行的二进制日志 (binlog) 中读取更改。然后,AWS DMS 会将这些更改迁移到目标。

Error 1236 是由二进制日志问题引起的。因此,在进行故障排除之前,请确保所有二进制日志记录参数均已正确配置为支持 AWS DMS CDC。有关更多信息,请参阅使用自管理的 MySQL 兼容数据库作为 AWS DMS 的源使用 AWS 管理的 MySQL 兼容数据库作为 AWS DMS 的源

解决方法

请按照以下步骤操作,具体取决于错误的根本原因。

读取 binlog 时出现的 Error 1236(在二进制日志索引文件中找不到第一个日志文件名)

任务日志中出现错误:

[SOURCE_CAPTURE  ]I: Setting position in binlog 'mysql-bin-changelog.014448' at 119624570  (mysql_endpoint_capture.c:886)
[SOURCE_CAPTURE  ]I: Position was set in binlog 'mysql-bin-changelog.014448' at 119624570  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]E: Error 1236 (Could not find first log file name in binary log index file) reading binlog [1020493] 
[TASK_MANAGER    ]I: Task - ABCDXXXXXXXXXXXXXX is in ERROR state, updating starting status to AR_NOT_APPLICABLE

此错误表示 AWS DMS 用于将数据更改复制到目标的二进制日志已从源 MySQL 数据库中清除。发生这种情况有两个原因:

  • 二进制日志保留期太短。
  • AWS DMS 任务因问题卡住或停止。

运行这些命令以确认二进制日志是否可用。

列出所有二进制日志文件

mysql> SHOW BINARY LOGS;

列出当前的二进制日志文件和位置

mysql> SHOW MASTER STATUS;

要解决此错误,请先查看源 MySQL 数据库上的二进制日志保留期。如果需要,可以延长保留期。重新启动 AWS DMS 任务以再次运行满载阶段。

请按照以下步骤操作,具体取决于您使用的实例类型。

自管理的 MySQL 数据库 - 本地或 Amazon Elastic Compute Cloud (Amazon EC2)

查看 expire_logs_days 的值以检查二进制日志的保留期。最佳做法是在全局级别将此参数设置为 1 或更大值。

AWS 托管的 MySQL 数据库——Amazon Relational Database Service (Amazon RDS) 或 Amazon Aurora MySQL 兼容版

1.    通过运行 mysql.rds_show_configuration 命令,检查在 MySQL 数据库上设置的 binlog 保留小时数:

mysql> call mysql.rds_show_configuration;

2.    要将日志保留期延长到 24 小时,请运行 mysql.rds_set_configuration 命令:

mysql> call mysql.rds_set_configuration('binlog retention hours', 24);

Error 1236(日志事件条目超出 max_allowed_packet;增加主服务器上的 max_allowed_packet;...)

任务日志中出现错误:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'mysql-bin.056367' at 787323674  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]D:  net_safe_read error 1236 (log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.056367' at 787323674, the last event read from '/mnt/data/logs/mysql-bin.056367' at 123, the last byte read from '/mnt/data/logs/mysql-bin.056367' at 787323693.)  (mysql_endpoint_capture.c:1119)
[SOURCE_CAPTURE  ]I:  Error 1236 (log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-bin.056367' at 787323674, the last event read from '/mnt/data/logs/mysql-bin.056367' at 123, the last byte read from '/mnt/data/logs/mysql-bin.056367' at 787323693.) reading binlog. Try reconnect  (mysql_endpoint_capture.c:1123)

此错误有两个可能的原因:

  1. 源上的 max_allowed_packet 的值小于源上 binlog 事件的大小。
  2. 源数据库上的 binlog 已损坏。

要解决这些问题,请按照以下步骤执行操作:

1.    在源上,将 max_allowed_packet 设置为更高的值。通过这样做,您可以排除 binlog 事件大小作为错误的可能原因。此参数的值最多可达 1 GB。

2.如果设置更高的 max_allowed_packet 值不能解决问题,则源上的 binlog 可能已损坏。错误消息包含以下文本:

"the first event '/mnt/data/logs/mysql-bin.056367' at 123, the last event read from '/mnt/data/logs/mysql-bin.056367' at 787323693"

因此,通过运行以下命令检查 mysql-bin.056367 是否存在损坏:

1.    检查 binlog 是否存在

mysql> SHOW BINARY LOGS;

2.    查看二进制日志中的事件

mysql> SHOW BINLOG EVENTS IN '<binlog file>' FROM <position>;

3.    下载二进制日志

mysql> MYSQLBINLOG;

Error 1236(binlog 在事件中间被截断;请考虑主服务器上的磁盘空间不足;...)

任务日志中出现错误:

[SOURCE_CAPTURE ]I: Read next binary log event failed; net_safe_read error 1236 (binlog truncated in the middle of event; consider out of disk space on master; the first event 'mysql-bin-changelog.017672' at 486, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.017672' at 125, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.017672' at 4756.) (mysql_endpoint_capture.c:1069)
[SORTER ]I: Transaction consistency reached (sorter_transaction.c:347)
[TASK_MANAGER ]I: Starting replication now (replicationtask.c:2774)
[TASK_MANAGER ]I: Task - MGLVRIRUJH6FE2GP6F7SW46BPBW6YKF2JUJPSVY is in RUNNING state, updating starting status to AR_RUNNING (repository.c:5110)

造成此错误的主要原因有两个:

  1. 在主服务器上有一个 sync_binlog != 1。这意味着可能无法在磁盘上同步二进制日志事件。
  2. 源数据库上的 binlog 已损坏。

要解决此错误:

1.    检查源上的 sync_binlog 参数的值。

2.    修改 sync_binlog 的值,并将其设置为 1

3.    重新启动任务。

注意:如果 sync_binlog 参数已设置为 1,则使用之前详述的错误 Error 1236(日志事件条目超出 max_allowed_packet;增加主服务器上的 max_allowed_packet;...)详细说明的步骤查看二进制日志是否损坏

Error 1236(客户端请求主服务器从不可能的位置开始复制...)

任务日志中出现错误:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'mysql-bin-changelog.007989' at 1631  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]I:  Read next binary log event failed; net_safe_read error 1236 (Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.007989' at 1631, the last event read from 'mysql-bin-changelog.007989' at 4, the last byte read from 'mysql-bin-changelog.007989' at 4.)  (mysql_endpoint_capture.c:1053)
[SOURCE_CAPTURE  ]D:  Error reading binary log. [1020493]  (mysql_endpoint_capture.c:3995)
[SOURCE_CAPTURE  ]E:  Error 1236 (Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.007989' at 1631, the last event read from 'mysql-bin-changelog.007989' at 4, the last byte read from 'mysql-bin-changelog.007989' at 4.) reading binlog events [1020493]  (mysql_endpoint_capture.c:1074)

如果源 MySQL 数据库服务器意外停止,通常会发生此错误。这可能是硬件故障(如磁盘错误或断电)造成的。

要解决此错误,请根据您的 AWS DMS 任务类型执行以下操作:

  • 满载和 CDC 任务 - 重新启动 AWS DMS 任务。
  • 仅限 CDC 的任务 - 从下一个二进制日志位置启动 AWS DMS 任务

Error 1236(客户端请求主节点从位置 > 文件大小开始复制)

任务日志中出现错误:

[SOURCE_CAPTURE  ]I:  Position was set in binlog 'binlog.000012' at 2179  (mysql_endpoint_capture.c:922)
[SOURCE_CAPTURE  ]I:  Read next binary log event failed; net_safe_read error 1236 (Client requested master to start replication from position > file size)  (mysql_endpoint_capture.c:1052

此错误可能是由加密的二进制日志引起的。如果您的源 MySQL 数据库运行的是 MySQL 8.0 版,并且二进制日志已加密,则 AWS DMS 无法在任务初始化时读取日志。因此,AWS DMS 会记录此错误。启用二进制日志加密时,AWS DMS 不支持使用 MySQL 8.0 作为源进行的 CDC 复制。

1.    检查您的 MySQL 版本:

mysql> SELECT VERSION();

2.    检查 binlog_encryption 是否已开启

mysql> SELECT * FROM performance_schema.global_variables WHERE VARIABLE_NAME = 'binlog_encryption';

3.    关闭 binlog 加密:

mysql> SET GLOBAL binlog_encryption = OFF;

-或者-

在关闭 binlog_encryption 的情况下启动 AWS DMS 任务,然后打开 binlog_encryption:

mysql> SET GLOBAL binlog_encryption = ON;

相关信息

在将 Aurora MySQL 和作为源的 AWS DMS 结合使用时,如何排查收到的二进制日志记录错误?

AWS 官方
AWS 官方已更新 2 年前