7人参与 • 2025-12-08 • Mysql
确认 binlog 已开启
查看是否开启 binlog:
show variables like 'log_bin';
返回 on 表示已开启。
找到需要回滚的 binlog 文件和位置
查看当前 binlog 文件列表:
show binary logs;
查看 binlog 内容:
mysqlbinlog mysql-bin.000123 > binlog.txt
确定误操作的时间段或事务
可以通过 binlog 文件内容,查找对应的时间戳或事务 id(gtid)。
定位起始和结束位置
binlog 记录格式大致如下:
# at 12345 #210601 10:00:00 server id 1 end_log_pos 12456 crc32 0x12345678
使用 mysqlbinlog 工具解析 binlog
mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000123 > binlog.txt
-vv 可以显示更详细的行数据。
查找需要回滚的 sql
在 binlog.txt 中找到误操作的 sql(比如 delete、update、insert)。
手动生成反向 sql
insert,生成对应的 delete。delete,生成对应的 insert。update,生成反向的 update(把新值改回旧值)。常用工具:
用法示例:
# 生成回滚sql python mysqlbinlog2sql.py -h localhost -u root -p password -d dbname -t tablename -b mysql-bin.000123 --start-time "2024-06-19 10:00:00" --stop-time "2024-06-19 11:00:00" --flashback
--flashback 参数表示生成反向 sql。
仔细审核生成的回滚 sql
确认没有遗漏和误操作。
在备份库或测试库先执行,确保无误
建议先在测试环境执行,确认效果。
在生产库执行回滚 sql
建议业务低峰期执行,并做好备份。
假设你在 2024-06-19 10:00 到 2024-06-19 11:00 之间误删了某些数据,现在需要回滚。
确定 binlog 文件
show binary logs;
找到对应的 binlog 文件,比如 mysql-bin.000123。
定位时间段
使用 mysqlbinlog 工具,筛选时间范围:
mysqlbinlog --start-datetime="2024-06-19 10:00:00" --stop-datetime="2024-06-19 11:00:00" /path/to/mysql-bin.000123 > binlog_10_11.sql
打开 binlog_10_11.sql,查找所有误操作的 sql。
比如你看到如下语句:
delete from users where id=101;
你需要将其反向为:
insert into users (id, ...) values (101, ...);
这需要知道被删除行的全部字段内容,可以用 binlog 的 -vv 参数解析出行数据。
使用 mysqlbinlog2sql 工具,自动生成反向 sql。
安装依赖:
pip install mysql-replication
运行命令:
python mysqlbinlog2sql.py -h 127.0.0.1 -u root -p yourpassword -d yourdb -b /path/to/mysql-bin.000123 --start-time "2024-06-19 10:00:00" --stop-time "2024-06-19 11:00:00" --flashback > rollback.sql
检查 rollback.sql 内容,确认无误。
在测试环境导入 rollback.sql:
mysql -u root -p yourdb < rollback.sql
检查数据是否恢复正常。
备份生产库数据!
业务低峰期,执行回滚 sql:
mysql -u root -p yourdb < rollback.sql
检查生产库数据,确认回滚成功。
q1. binlog 没有行数据,无法生成反向 sql?
a: 需要开启 binlog_format = row,否则 binlog 只记录语句,无法还原行数据。
可通过 show variables like 'binlog_format'; 查看。
q2. binlog 文件太大,如何筛选?
a: 使用 --start-datetime 和 --stop-datetime 精确过滤时间段。
q3. 使用 gtid 怎么处理?
a: 可以通过 gtid 定位事务,mysqlbinlog 支持 --include-gtids 参数。
q4. 表结构发生变化怎么办?
a: 回滚时需保证表结构与 binlog 记录一致,否则反向 sql 可能执行失败。
q5. 误操作涉及多个表或库?
a: 需分别生成每个表/库的反向 sql,逐一回滚。
只回滚某个用户或某条数据
可以在解析 binlog 时加过滤条件,如 --table、--database,或在生成反向 sql 后筛选相关语句。
定期备份 binlog,便于恢复
建议定期备份 binlog 文件,遇到误操作时更容易定位和回滚。
回滚前后做一致性校验
对比回滚前后的数据,确保无遗漏和误回滚。
表结构一致性
回滚 sql 的执行依赖表结构与 binlog 记录时一致。如果中途有 ddl(比如 alter table),需要先还原表结构,否则反向 sql 可能报错。
外键约束、触发器
如果表有外键或触发器,执行反向 sql 可能受到影响。建议临时关闭外键检查:
set foreign_key_checks=0;
回滚后再恢复:
set foreign_key_checks=1;
唯一键/主键冲突
回滚 insert/delete 时,注意主键或唯一索引冲突。比如回滚 delete 时,如果该主键已经被其他数据占用,insert 会失败。
分批执行
如果回滚 sql 很多,建议分批次执行,避免长事务锁表影响业务。
关闭日志加速回滚
在回滚过程中,可以临时关闭 autocommit 和 binlog,加快回滚速度(但要保证安全性):
set autocommit=0; set sql_log_bin=0;
回滚后再恢复。
监控慢查询和锁等待
回滚期间注意监控数据库性能,防止锁表、慢查询影响线上业务。
主从一致性
在主从架构下,建议只在主库执行回滚 sql,保证 binlog 正常同步到从库。不要直接在从库执行回滚,否则可能导致主从数据不一致。
gtid 模式下的处理
如果开启了 gtid,回滚 sql 也会生成新的 gtid,建议关注 gtid 的连续性,避免主从同步异常。
binlog 只记录 ddl语句,但无法回滚表结构的变化(比如 drop table)。如果误删了表,只能通过备份恢复。
如果只需要回滚某个表、某几行数据,可以在生成反向 sql后筛选相关语句,或者在 mysqlbinlog2sql 工具中加 -t tablename 参数。
update 的回滚 sql需要知道“旧值”,而 binlog 必须是 row 格式才会记录。否则只能手动查找或通过备份恢复。
回滚不是万能的
binlog只记录了变更操作,无法回滚未记录的操作(如未开启 binlog、非 row 格式、部分 ddl)。
业务影响评估
回滚会影响后续依赖同一数据的业务流程,务必提前评估影响。
备份优先
回滚前务必全库备份,确保可以随时恢复。
测试先行
一定要在测试环境全流程验证,确认无误后再在生产执行。
开启 binlog 且使用 row 格式
这样才能完整记录每一行数据变化,方便回滚。
定期备份 binlog 文件和全库数据
误操作时能快速定位和恢复。
重要操作前后做快照
比如批量 delete、update 前,先备份相关表。
建立回滚预案和流程
关键业务场景下,提前设计回滚方案,遇到问题能快速响应。
回滚后做数据一致性校验
比如比对行数、主键、业务关键字段,确保回滚效果。
# 查看 binlog 文件列表 show binary logs; # 解析 binlog 文件 mysqlbinlog --base64-output=decode-rows -vv mysql-bin.000123 > binlog.txt # 按时间过滤 mysqlbinlog --start-datetime="2024-06-19 10:00:00" --stop-datetime="2024-06-19 11:00:00" mysql-bin.000123 > binlog_10_11.sql # 使用 mysqlbinlog2sql 生成回滚 sql python mysqlbinlog2sql.py -h 127.0.0.1 -u root -p password -d dbname -b mysql-bin.000123 --start-time "2024-06-19 10:00:00" --stop-time "2024-06-19 11:00:00" --flashback > rollback.sql
到此这篇关于mysql回滚binlog日志的实现示例的文章就介绍到这了,更多相关mysql回滚binlog日志内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论