MySQL 从属复制失败:如何识别导致它失败的 SQL
MySQL Slave replication failure: How to identify SQL which is causing it to fail
我在 AWS RDS 运行 MySQL 上。由于以下错误,从属复制卡住了。它说它无法在从属服务器的 table 中找到记录...有没有办法知道是哪条记录?或者失败的 SQL !
Read Replica Replication Error - SQLError: 1032, reason: Could not
execute Update_rows_v1 event on table customers.visitor; Can't
find record in 'visitor', Error_code: 1032; handler error
HA_ERR_END_OF_FILE; the event's master log
mysql-bin-changelog.206572, end_log_pos 12627388
使用mysqlbinlog
阅读日志。
mysqlbinlog --verbose --base64-output=decode-rows mysql-bin-changelog.206572 \
| awk '/end_log_pos/{flag=0}/end_log_pos\ 12627388\ /{flag=1}flag'
从错误消息来看,这看起来像是一个以行格式记录的事件,因此 mysqlbinlog
会将其解码为伪 sql,显示每一列及其顺序位置,一些东西像这样:
### UPDATE `my_db_name`.`my_table_name`
### WHERE
### @1=70
### @2=1476602910
### @3=NULL
### @4=NULL
### @5=NULL
### @6=NULL
### @7=NULL
### SET
### @1=70
### @2=1476602910
### @3=1476602926
### @4=000000016.283000000
### @5=NULL
### @6='0'
### @7=NULL
输出中的@1
、@2
等为第1列、第2列等。binlog不包含列的实际名称,因为它们被假定为在 master 和 slave 上是一样的,因此它们是多余的......所以 mysqlbinlog
创建这个伪 sql 来说明它如何解释记录的更改事件。 WHERE
是更新前出现在主服务器上的行的版本(这将是在您的从服务器上找不到的行),SET
是该行的值在更新主控之后(如果该行存在,从属应该将行更改为该行的样子)。
这不会识别您的原始查询,但它会向您显示在主服务器上存在但在从服务器上丢失的实际行。
如果你还没有日志,你可以先从 master 那里获取它:
mysqlbinlog --host=xxxx.rds.aws-regi-on.amazonaws.com --user 'rds-master-user' \
--password='rds-master-password' --read-from-remote-server \
--raw mysql-bin-changelog.206572
必须从主服务器获取日志。在这种情况下,它不能从 slave 获取。 (如果这不是 RDS,您可以通过 SSH 登录到 shell 并直接读取中继日志来连接到从站,但这些无法从外部访问,这就是为什么您必须去主站对于日志,在 RDS 中。)
除非您已经将 RDS 配置为保留您的 binlog 的时间超过技术上需要的时间,否则该日志可能不再在 master 上可用,因此您可能会有点不走运,直到下一次。您可以使用 MySQL 5.6 及更高版本的所有 RDS 实例中包含的自定义过程在 RDS 上配置二进制日志保留。要将日志保留设置为 24 小时,例如:
CALL mysql.rds_set_configuration('binlog retention hours', 24);
另见 http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html
感谢 source 使用 awk
找到两个模式之间的线的灵感。
请注意,在上面的命令匹配并打印出发生错误的事件后,它可能会挂起,因为 awk
会继续扫描到文件末尾。 Control-C 终止。
我在 AWS RDS 运行 MySQL 上。由于以下错误,从属复制卡住了。它说它无法在从属服务器的 table 中找到记录...有没有办法知道是哪条记录?或者失败的 SQL !
Read Replica Replication Error - SQLError: 1032, reason: Could not execute Update_rows_v1 event on table customers.visitor; Can't find record in 'visitor', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin-changelog.206572, end_log_pos 12627388
使用mysqlbinlog
阅读日志。
mysqlbinlog --verbose --base64-output=decode-rows mysql-bin-changelog.206572 \
| awk '/end_log_pos/{flag=0}/end_log_pos\ 12627388\ /{flag=1}flag'
从错误消息来看,这看起来像是一个以行格式记录的事件,因此 mysqlbinlog
会将其解码为伪 sql,显示每一列及其顺序位置,一些东西像这样:
### UPDATE `my_db_name`.`my_table_name`
### WHERE
### @1=70
### @2=1476602910
### @3=NULL
### @4=NULL
### @5=NULL
### @6=NULL
### @7=NULL
### SET
### @1=70
### @2=1476602910
### @3=1476602926
### @4=000000016.283000000
### @5=NULL
### @6='0'
### @7=NULL
输出中的@1
、@2
等为第1列、第2列等。binlog不包含列的实际名称,因为它们被假定为在 master 和 slave 上是一样的,因此它们是多余的......所以 mysqlbinlog
创建这个伪 sql 来说明它如何解释记录的更改事件。 WHERE
是更新前出现在主服务器上的行的版本(这将是在您的从服务器上找不到的行),SET
是该行的值在更新主控之后(如果该行存在,从属应该将行更改为该行的样子)。
这不会识别您的原始查询,但它会向您显示在主服务器上存在但在从服务器上丢失的实际行。
如果你还没有日志,你可以先从 master 那里获取它:
mysqlbinlog --host=xxxx.rds.aws-regi-on.amazonaws.com --user 'rds-master-user' \
--password='rds-master-password' --read-from-remote-server \
--raw mysql-bin-changelog.206572
必须从主服务器获取日志。在这种情况下,它不能从 slave 获取。 (如果这不是 RDS,您可以通过 SSH 登录到 shell 并直接读取中继日志来连接到从站,但这些无法从外部访问,这就是为什么您必须去主站对于日志,在 RDS 中。)
除非您已经将 RDS 配置为保留您的 binlog 的时间超过技术上需要的时间,否则该日志可能不再在 master 上可用,因此您可能会有点不走运,直到下一次。您可以使用 MySQL 5.6 及更高版本的所有 RDS 实例中包含的自定义过程在 RDS 上配置二进制日志保留。要将日志保留设置为 24 小时,例如:
CALL mysql.rds_set_configuration('binlog retention hours', 24);
另见 http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html
感谢 source 使用 awk
找到两个模式之间的线的灵感。
请注意,在上面的命令匹配并打印出发生错误的事件后,它可能会挂起,因为 awk
会继续扫描到文件末尾。 Control-C 终止。