用于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 终止。