利用mysqlbinlog恢复数据
Posted 雅冰石
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用mysqlbinlog恢复数据相关的知识,希望对你有一定的参考价值。
原理:
binlog2sql分析binlog日志,生成相反的sql。比如,对于delete操作,生成的回滚语句是insert。
前提条件:
mysql server必须设置以下参数:
[mysqld]
server_id = 1
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full
一 安装binlog2sql
该工具的使用依赖以下三个包:
PyMySQL==0.7.8
wheel==0.24.0
mysql-replication==0.9
其中,每个包又会依赖其它包,所以安装这些包是一个比较麻烦的事情。如果是在外网的环境下,可直接通过pip install安装,它会自动下载并安装依赖包的。
在内网环境下,可手动安装这些包,目前,这些包已下载打包,并上传到百度云盘中,大家可自行下载。
binlog2sql.tar.gz_免费高速下载|百度网盘-分享无限制
安装教程:
cd /opt
tar xvf binlog2sql.tar.gz
cd binlog2sql/binlog2sql_dependencies/
tar xvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
python setup.py install
cd ..
tar xvf pip-9.0.1.tar.gz
cd pip-9.0.1
python setup.py install
cd ..
pip install *.whl mysql-replication-0.9.tar.gz
二 使用binlog2sql
2.1 语法
2.1.1 查看原始sql
python /opt/binlog2sql/binlog2sql/binlog2sql.py -hip -P端口 -u用户名 -p'密码' -d库名 -t表名 --start-file='要分析的起始binlog文件' --start-datetime='开始时间' --stop-datetime='终止时间' > /tmp/raw.sql
#查看生成的文件内容
less /tmp/raw.sql
2.1.2 生成回滚sql
python /opt/binlog2sql/binlog2sql/binlog2sql.py -hip -P端口 -u用户名 -p'密码' -d库名 -t表名 --start-file='要分析的起始binlog文件' --start-datetime='开始时间' --stop-datetime='终止时间' -B > /tmp/raw.sql
2.2 案例
2.2.1 模拟删除数据
2.2.2 查看原始sql
python /opt/binlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -dbaidd -tt1 --start-file='master1-bin.000004' --start-datetime='2023-03-14 17:00:00' --stop-datetime='2023-03-14 18:00:00' > /tmp/raw.sql
从/tmp/raw.sql里找到自己误删除的数据,示例:
DELETE FROM `baidd`.`t1` WHERE `id`=1 AND `name`='dan' LIMIT 1; #start 1147 end 1323 time 2023-03-14 17:19:23
DELETE FROM `baidd`.`t1` WHERE `id`=2 AND `name`='jiao' LIMIT 1; #start 1147 end 1323 time 2023-03-14 17:19:23
2.2.3 生成回滚sql
python /opt/binlog2sql/binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'123456' -dbaidd -tt1 --start-file='master1-bin.000004' --start-datetime='2023-03-14 17:00:00' --stop-datetime='2023-03-14 18:00:00' -B > /tmp/rollback.sql
从/tmp/rollback.sql里找到自己误删除的数据,示例:
INSERT INTO `baidd`.`t1`(`id`, `name`) VALUES (2, 'jiao'); #start 1147 end 1323 time 2023-03-14 17:19:23
INSERT INTO `baidd`.`t1`(`id`, `name`) VALUES (1, 'dan'); #start 1147 end 1323 time 2023-03-14 17:19:23
2.2.4 执行上面生成的回滚sql
略。
三 注意事项
① 无法回滚truncate table
② 无法回滚DDL
试验发现,若某个表被drop了,则该表在此之前的DML操作也将无法回滚(只能看到相应的建表删表语句,看不到DML语句)
③ 一次删除多条记录的delete sql会被生成N(N=被删除的记录条数)条delete sql(因为binlog日志里就是这样记录的),但是同一批操作里的start和end postion是一样的,不影响恢复。
--本篇文章参考自:
以上是关于利用mysqlbinlog恢复数据的主要内容,如果未能解决你的问题,请参考以下文章