【问题标题】:MySQL Slave replication failure: How to identify SQL which is causing it to failMySQL 从属复制失败:如何识别导致其失败的 SQL
【发布时间】:2016-10-15 05:40:21
【问题描述】:

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

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

【问题讨论】:

    标签: mysql master-slave rds mysqlbinlog binlog


    【解决方案1】:

    使用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 和从属,因此它们是多余的......所以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


    感谢source 使用awk 查找两个模式之间的线的灵感。

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

    【讨论】:

      猜你喜欢
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多