MySQL 数据库闪回工具binlog2sql —— 筑梦之路
2023-09-14 09:09:36 时间
适用范围:
mysql数据库,包括mysql、mariadb
github:
https://github.com/danfengcao/binlog2sql.git
前提条件:
1)配置要求
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
要授权一个用户有以下权限:
SELECT, REPLICATION SLAVE, REPLICATION CLIENT
2)权限说明:
select:需要读取server端information_schema.COLUMNS表,获取表结构的元信息,拼接成可视化的sql语句
super/replication client:两个权限都可以,需要执行'SHOW MASTER STATUS', 获取server端的binlog列表
replication slave:通过BINLOG_DUMP协议获取binlog内容的权限
3)binlog2sql的使用参数说明:
mysql连接配置
-h host; -P port; -u user; -p password
解析模式
--stop-never 持续同步binlog。可选。不加则同步至执行命令时最新的binlog位置。
-K, --no-primary-key 对INSERT语句去除主键。可选。
-B, --flashback 生成回滚语句,可解析大文件,不受内存限制,每打印一千行加一句SLEEP SELECT。可选。与stop-never或no-primary-key不能同时添加。
解析范围控制
--start-file 起始解析文件。必须。
--start-position/--start-pos start-file的起始解析位置。可选。默认为start-file的起始位置。
--stop-file/--end-file 末尾解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
--stop-position/--end-pos stop-file的末尾解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。
--start-datetime 从哪个时间点的binlog开始解析,格式必须为datetime,如'2016-11-11 11:11:11'。可选。默认不过滤。
--stop-datetime 到哪个时间点的binlog停止解析,格式必须为datetime,如'2016-11-11 11:11:11'。可选。默认不过滤。
对象过滤
-d, --databases 只输出目标db的sql。可选。默认为空。
-t, --tables 只输出目标tables的sql。可选。默认为空。
闪回原理:
MySQL binlog 以 event 为单位,记录数据库的变更信息,这些信息能够帮助我们重现这之间的所有变化,也就是所谓的闪回。利用 binlog 做闪回,需要将 binlog 格式设置为 row,因为我们需要最详尽的信息来确定操作之后数据不会出错。
既然 binlog 以 event 形式记录了所有的变更信息,那么我们把需要回滚的 event,从后往前回滚回去即可。
回滚操作:
1)对于 delete 操作,我们从 binlog 提取出 delete 信息,反向生成 insert 回滚语句;
2)对于 insert 操作,反向生成 delete 回滚语句;
3)对于 update 操作,根据信息生成反向的 update 语句。
#查看日志格式
show global variables like 'binlog_format';
#查看位置
show master status;
#做一系列操作增删改查
#使用binlog2sql进行格式为ROW的binlog生成标准SQL,带个-d的参数指定库名
python binlog2sql.py -uroot -h127.0.0.1 -proot -dtest --start-file='mysql-bin.000107' > test.sql
#生成反向sql
#对test这个库的所有操作生成反向SQL,这个时候需要在上面语句的基础上带一个-B参数,就是flashback闪回的意思
python binlog2sql.py -uroot -h127.0.0.1 -proot -dtest --start-file='mysql-bin.000107' -B > rollback_test.sql
#导入数据库
mysql> use test;
Database changed
mysql> source /tmp/rollback_test.sql
注意事项:
drop table 和truncate table 是无法生成反向SQL的,所以建议线上程序账号只给insert,upfate,select,delete权限
相关文章
- mysql数据库监控工具-MONyog的配置和基本使用项
- MySQL 快速创建索引
- mysql数据库回滚
- CentOS中安装MySQL数据库
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
- mysql定时任务简单例子
- 总结--解决 mysql 中文乱码
- 前后端项目部署-6, flask+Gunicorn+gevent+supervisor+nginx+redis+mysql+mongodb+vue,docker-compose部署
- 性能测试:监控mysql数据库
- MySQL数据库数据类型之集合类型SET测试总结
- 用户命令行方式连MYSQL数据库
- mysql 数据库导入导出
- 24个经典的MySQL索引问题,你都遇到过哪些?
- Atitit mysql 数据类型 5.7.9 目录 1.1. 数值类型1 2. 字符串2 3. 时间日期2 4. 地理位置2 5. 几何数据的存储,生成,分析,优化。 空间数据类型(存储)
- atitit.跨语言实现备份mysql数据库 为sql文件特性 api 兼容性java c#.net php js
- PHP MySQL 创建数据库
- 〖Python 数据库开发实战 - Python与MySQL交互篇⑰〗- 项目实战 - 实现用户管理 - 修改用户
- JSP连接mysql数据库的重点
- mysql 远程连接数据库的二种方法
- 96.第十九章 MySQL数据库 -- 多表查询(六)
- MySQL中replace的使用
- Mysql数据库的安装教程
- Linux中8个访问MySQL或MariaDB数据库的GUI工具