MySQL:从库binlog 使用mysqlbinlog stop-datetime过滤问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 更多主从同步相关可以参考我的《深入理解MySQL主从原理》专栏:本文是一个朋友问我问题。从库使用mysqlbinlog --stop-datetime 的时候没有想要的记录。本文简单记录这个问题:如果从库log_slave_updates开启,那么从库需要记录从库应用的Event,有如下特点:从库binlog记录的应用主库的Event,其Event header timestamp是主库的时间。

更多主从同步相关可以参考我的《深入理解MySQL主从原理》专栏:

KTA2LA6$`_9Z0B2~P)FULPL.png


本文是一个朋友问我问题。从库使用mysqlbinlog --stop-datetime 的时候没有想要的记录。
本文简单记录这个问题:如果从库log_slave_updates开启,那么从库需要记录从库应用的Event,有如下特点:

  • 从库binlog记录的应用主库的Event,其Event header timestamp是主库的时间。
  • 从库binlog记录本地实例的Event,其Event header timestamp则是本地实例的时间。
  • 从库binlog的format event和p gtid event则是本地实际的时间。

一、构造这样的binlog

# at 4
#190825  0:01:37 server id 953340  end_log_pos 123 CRC32 0x9409b3c9     Start: binlog v 4, server v 5.7.22-22-debug-log created 190825  0:01:37
# Warning: this binlog is either in use or was not closed properly.
BINLOG '
YV9hXQ/8iw4AdwAAAHsAAAABAAQANS43LjIyLTIyLWRlYnVnLWxvZwAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AcmzCZQ=
'/*!*/;
# at 123
#190825  0:01:37 server id 953340  end_log_pos 234 CRC32 0x483a41ac     Previous-GTIDs
# 010fde77-2075-11e9-ba07-5254009862c0:16-40,
# cb7ea36e-670f-11e9-b483-5254008138e4:94-104
# at 234
#190724 14:07:36 server id 413340  end_log_pos 299 CRC32 0x9294741b     GTID    last_committed=0        sequence_number=1       rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'cb7ea36e-670f-11e9-b483-5254008138e4:105'/*!*/;
# at 299
#190724 14:07:36 server id 413340  end_log_pos 362 CRC32 0x23ecd791     Query   thread_id=5     exec_time=2714050       error_code=0
SET TIMESTAMP=1563948456/*!*/;
SET @@session.pseudo_thread_id=5/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=524288/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=83,@@session.collation_connection=83,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 362
#190724 14:07:36 server id 413340  end_log_pos 414 CRC32 0x65673dab     Table_map: `testmts`.`testwq` mapped to number 110
# at 414
#190724 14:07:36 server id 413340  end_log_pos 454 CRC32 0xa368ded1     Write_rows: table id 110 flags: STMT_END_F

BINLOG '
qPU3XROcTgYANAAAAJ4BAAAAAG4AAAAAAAEAB3Rlc3RtdHMABnRlc3R3cQABAwABqz1nZQ==
qPU3XR6cTgYAKAAAAMYBAAAAAG4AAAAAAAEAAgAB//4KAAAA0d5oow==
'/*!*/;
# at 454
#190724 14:07:36 server id 413340  end_log_pos 485 CRC32 0x40df9d14     Xid = 44
COMMIT/*!*/;

这个binlog是从库的binlog,Event header timestamp如下:

  • FORMAT_DESCRIPTION_EVENT:190825 0:01:37
  • PREVIOUS_GTIDS_LOG_EVENT:190825 0:01:37

以上两个Event都是从库binlog自己生成当然就是本实例的时间。

  • GTID_LOG_EVENT:190724 14:07:36
  • QUERY_EVENT:190724 14:07:36
  • MAP_EVENT:190724 14:07:36
  • WRITE_EVET:190724 14:07:36
  • XID_EVENT:190724 14:07:36

他们都是主库语句命令发起的时间。

如果这个时候我们使用stop-datetime=‘2019-07-25 00:00:00’ 不会解析到这个事务。原因在于FORMAT_DESCRIPTION_EVENT的时间超过了这个时间直接退出了。

源码如下:

image.png

debug如下:
image.png

好了简单记录

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
SQL 关系型数据库 MySQL
MySQL操作利器——mysql-connector-python库详解
MySQL操作利器——mysql-connector-python库详解
37 0
|
1月前
|
SQL 监控 关系型数据库
MySQL 延迟从库介绍
本文介绍了MySQL中的延迟从库功能,详细解释了其工作原理及配置方法。延迟从库允许从库在主库执行完数据变更后延迟一段时间再同步,主要用于快速恢复误操作的数据。此外,它还可用于备份、离线查询及数据合规性需求。通过合理配置,可显著提升数据库系统的稳定性和可靠性。
|
1月前
|
canal 消息中间件 关系型数据库
Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
【9月更文挑战第1天】Canal作为一款高效、可靠的数据同步工具,凭借其基于MySQL binlog的增量同步机制,在数据同步领域展现了强大的应用价值
207 4
|
2月前
|
SQL 关系型数据库 MySQL
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
172 2
|
2月前
|
SQL 关系型数据库 MySQL
【MySQL】根据binlog日志获取回滚sql的一个开发思路
【MySQL】根据binlog日志获取回滚sql的一个开发思路
|
5天前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
41 11
|
2月前
|
SQL 关系型数据库 MySQL
MySQL主从:延时从库恢复全解
MySQL主从:延时从库恢复全解
|
2月前
|
关系型数据库 MySQL Shell
MySQL回滚脚本: 误操作delete binlog回滚shell脚本
MySQL回滚脚本: 误操作delete binlog回滚shell脚本
|
2月前
|
关系型数据库 MySQL 数据库
MySQL回滚工具:binlog 闪回工具 MyFlash工具
MySQL回滚工具:binlog 闪回工具 MyFlash工具
|
2月前
|
SQL 监控 关系型数据库
MySQL 延迟从库介绍
我们都知道,MySQL 主从延迟是一件很难避免的情况,从库难免会偶尔追不上主库,特别是主库有大事务或者执行 DDL 的时候。MySQL 除了这种正常从库外,还可以设置延迟从库,顾名思义就是故意让从库落后于主库多长时间,本篇文章我们一起来了解下 MySQL 中的延迟从库。
43 0
下一篇
无影云桌面