0

我在 AWS RDS 上运行 MySQL。由于以下错误,从属复制卡住了。它说它无法在从服务器的表中找到记录......有没有办法知道哪条记录?或者失败的SQL!

读取副本复制错误 - SQLError:1032,原因:无法在表 customers.visitor 上执行 Update_rows_v1 事件;在“访客”中找不到记录,错误代码:1032;处理程序错误 HA_ERR_END_OF_FILE;事件的主日志 mysql-bin-changelog.206572, end_log_pos 12627388

4

1 回答 1

3

用于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 不包含列的实际名称,因为它们在主从服务器上被假定为相同,因此它们是多余的......所以mysqlbinlog创建这个伪 sql 来说明它是如何解释记录的更改事件的。是更新之前出现在主服务器上的WHERE行的版本(这将是在您的从服务器上找不到的行),并且SET是主服务器上更新后的行的值(从服务器是什么如果该行存在,则应该将其更改为外观)。

这不会识别您的原始查询,但它会向您显示主服务器上存在但从服务器上缺少的实际行。

如果您还没有日志,您可以首先从主服务器获取它,使用以下命令:

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

必须从主服务器获取日志。在这种情况下,它无法从从站获取。(如果这不是 RDS,您可以通过 SSH 登录到 shell 并直接读取中继日志来连接到从站,但这些日志无法从外部访问,这就是为什么您必须去主站获取日志的原因,在 RDS 中。)

除非您已经将 RDS 配置为保留 binlog 的时间超过技术上所需的时间,否则日志可能不再在 master 上可用,因此您可能会有点不走运,直到下一次。您可以使用包含在 MySQL 5.6 及更高版本的所有 RDS 实例上的自定义过程在 RDS 上配置 binlog 保留。要将日志保留时间设置为 24 小时,例如:

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

另请参阅http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.MySQL.html


归功于使用来查找两个模式之间的线条的灵感来源awk

请注意,在上面的命令匹配并打印出发生错误的事件后,它可能会出现挂起,因为awk继续扫描到文件末尾。Control-C 终止。

于 2016-10-16T19:16:26.583 回答