【MySQL】根据binlog日志获取回滚sql的一个开发思路

简介: 【MySQL】根据binlog日志获取回滚sql的一个开发思路

需要获取的信息

  • thread_id
  • 打开 mysql 客户端 开始时间
  • 关闭 mysql 客户端 结束时间

binlog 匹配流程

  • 指定 mysql 客户端 开始时间和结束时间
  • 先匹配 thread_id 相同的
  • 然后匹配 ^BEGIN$行和 ^COMMIT/*!*/;$行之间的数据
  • 当匹配到 ^COMMIT/*!*/;$行,需要再次寻找 thread_id 相同的行,匹配到后执行上一个流程
  • 直到匹配到文件结尾

具体流程

  1. 开启一个mysql连接
  2. 查看当前开始时间
  3. 查看当前线程 id
  4. 执行 sql
  5. 失败处理逻辑
  6. 查看当前结束时间
  7. 关闭mysql连接
  8. mysqlbinlog 命令 截取 指定开始时间和结束时间的 binlog文件
  9. 用代码匹配binlog信息中的 thread_id
  10. 匹配到 binlog 中的 thread_id 后 匹配 ^BEGIN$
  11. 匹配到 ^BEGIN$行后将行内容追加至文件
  12. 匹配到 ^COMMIT/*!*/;$行 结束追加
  13. 在匹配 thread_id 然后执行循环执行 👆三个步骤
  14. 直到文件结尾
  15. 用 **MyFlash**工具生成回滚 sql 保存至文件待用
  16. 需要回滚时 先和业务人员确认 导入文件即可

注意:

  • 不同客户端之间会交替追加在 binlog 中,需要通过 👆的 binlog 匹配流程来控制匹配
  • 一个线程执行多个 sql 回滚到同一个文件可能带来的问题
  • 需要回滚的可能只有一个 sql
  • 如何处理这里的逻辑?
  • 是否需要每个 sql 开启一个线程?

获取线程 id

sql 获取当前连接的线程 id

对应 binlog 日志中的 thread_id=

select ID from information_schema.processlist where info like 'select id from information_schema.processlist where info like%';

在 binlog 中的线程 ID 记录为 thread_id

# 这是一个完整的事务
# at 1433
#240719 15:19:37 server id 33068094  end_log_pos 1498 CRC32 0xd91f110c  GTID    last_committed=5        sequence_number=6       rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'c0acf1fe-23b9-11ef-8afa-000c29fa06b9:96490'/*!*/;
# at 1498
#240719 15:19:37 server id 33068094  end_log_pos 1570 CRC32 0x16965799  Query thread_id=1837  exec_time=0 error_code=0 # thread_id=1837 这里
SET TIMESTAMP=1721373577/*!*/;
BEGIN
/*!*/;
# at 1570
#240719 15:19:37 server id 33068094  end_log_pos 1615 CRC32 0x5a08aba9  Table_map: `test`.`t1` mapped to number 9257
# at 1615
#240719 15:19:37 server id 33068094  end_log_pos 1665 CRC32 0x6d1db298  Write_rows: table id 9257 flags: STMT_END_F
### INSERT INTO `test`.`t1`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO `test`.`t1`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
### INSERT INTO `test`.`t1`
### SET
###   @1=1 /* INT meta=0 nullable=1 is_null=0 */
# at 1665
#240719 15:19:37 server id 33068094  end_log_pos 1696 CRC32 0xd51ac516  Xid = 394675
COMMIT/*!*/;

实时查看 binlog 日志

mysqlbinlog -S /mydata/3306/socket/mysql.sock  --stop-never -R  mysql-bin.000044


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1584 152
|
10月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
1101 156
|
9月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
436 6
|
10月前
|
SQL 监控 关系型数据库
SQL优化技巧:让MySQL查询快人一步
本文深入解析了MySQL查询优化的核心技巧,涵盖索引设计、查询重写、分页优化、批量操作、数据类型优化及性能监控等方面,帮助开发者显著提升数据库性能,解决慢查询问题,适用于高并发与大数据场景。
|
10月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
10月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
886 11
|
10月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
594 158
|
10月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
10月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
639 156
|
10月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
756 161

推荐镜像

更多