mysql通过binlog恢复删除数据

 

有时候手贱不小心将数据库的数据清空了怎么办?不要慌,如果你的mysql开启了binlog那你可以大胆放心的往下看!如果没开启,那就先开启,防止下次出现这个问题。

1.数据库需要开启log_bin功能并设置开启binlog行级模式(ROW):我测试数据库在windows上,所以找到my.ini文件添加一下内容,如果是linux,找到my.cnf,我使用的是解压版的mysql5.6所以没有my.ini,需要在安装目录乡下创建一个my.ini,添加以下内容

[mysql]
 
# 设置mysql客户端默认字符集
 
default-character-set=utf8 
 
[mysqld]
 
#设置3306端口
 
port =  
 
# 设置mysql的安装目录
 
basedir=C:\\mysql\\mysql-5.6.43-winx64
datadir=C:\\mysql\\mysql-5.6.43-winx64\\data
 
# 允许最大连接数
 
max_connections=1000
 
# 服务端使用的字符集默认为8比特编码的latin1字符集
 
character-set-server=utf8
 
# 创建新表时将使用的默认存储引擎
 
default-storage-engine=INNODB

log-bin=mysql-bin
binlog-format=Row

server-id=1

2.重启mysql,cmd命令需要用管理员开启,否则权限可能不够

关闭mysql:net stop mysql
开启mysql:net start mysql

3.查看binlog

先登录到mysql

mysql -hlocalhost -uroot -p123456

再查看binlog是否已经开启

show variables like 'log_bin';

如果如下图所示,则开启成功

mysql通过binlog恢复删除数据_第1张图片

继续查看当前的binlog文件

show master status;

mysql通过binlog恢复删除数据_第2张图片

如图所示,当前binlog文件是mysql-bin.000002,接着我们看该日志的所有events

show binlog events in 'mysql-bin.000002';

mysql通过binlog恢复删除数据_第3张图片如图所示,我红色框出来的是我清空activity_manager这张表执行的sql的开始到结束,对应的position分别是120和171354,这个非常有用,一句sql从begin到commit结束,这个不用过多的解释了。

接着我们在mysql的data文件夹下执行:

mysqlbinlog --base64-output=decode-rows -v mysql-bin.000002 -v --start-position=120 --stop-position=171354 --result-file=mysql008.sql

此语句是将binlog日志转成对应的sql,即上面我们情况表的delete语句,但是我们发现这个sql不是我们的标准sql,对于我们是没有用的,那我们怎么样转成标准slq以及转换成insert语句重新插入到我们的数据库呢?下面我将介绍一款非常好用的工具binlog2sql.

5.binlog2sql安装

下载binlog2sql,https://download.csdn.net/download/chf_940684164/10500490,你也可以通过别的的方式下载

事前准备:1.binlog开启2.python安装好3.pip安装好

下面我将binlog2sql安装在linux下,我们先创个文件夹,将下载好的binlog2sql-master.zip,解压缩,进入binlog2sql文件,我们可以看到requirements.txt

mkdir binlog2sql
cd binlog2sql
unzip binlog2sql-master.zip
mv binlog2sql-master.zip binlog2sql
cd binlog2sql
pip install -r requirements.txt

到此我们就将binlog2sql安装完毕了!

6.参数列表

--stop-never 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置。

-K, --no-primary-key 对INSERT语句去除主键。可选。默认False

-B, --flashback 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。

--back-interval -B模式下,每打印一千行回滚SQL,加一句SLEEP多少秒,如不想加SLEEP,请设为0。可选。默认1.0。

-start-file 起始解析文件,只需文件名,无需全路径 。必须。

--start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。

--stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。

--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。

--start-datetime 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。

--stop-datetime 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。

-d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。

-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。

--only-dml 只解析dml,忽略ddl。可选。默认False。

--sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。

7.将binlog日志反解析回滚

如果你想看binlog原本的删除sql,那么执行下面的语句

python binlog2sql.py -h192.168.7.141 -P3306 -uroot -p'123456' -dcivil_admin_3.0 -tactivity_manager --start-file='mysql-bin.000002' --start-position=120 --stop-position=171354 > /home/binlog2sql/binlog2sql/raw.sql

如果你想得到回滚的sql,那么执行下面的语句,就可以得到对应的insert语句 

python binlog2sql.py -h192.168.7.141 -P3306 -uroot -p'123456' -dcivil_admin_3.0 -tactivity_manager --start-file='mysql-bin.000002' --start-position=120 --stop-position=171354 -B > /home/binlog2sql/binlog2sql/back.sql

我们只需要将得到的back.sql在数据库里执行以下,就可以恢复删除数据了。

你可能感兴趣的:(mysql,binlog,binlog2sql)