背景

  今天项目上需要对MySQL进行数据修复,通过比较各种方案和工具,准备使用binlog2sql工具进行“数据闪回”,具体怎么使用呢,安排。

MySQL数据库准备

以恢复某个库的某个表为例,

准备两个一模一样地MySQL,安装上,推荐用yum+rpm方式安装,否则,配置起来能否一次性安装成功,看运气了。

源库:MySQL 5.7.30

目标库:MySQL 5.7.30

源库开启binlog

修改my.cnf配置文件,添加以下内容:

server_id=1# 标识,集群时必须且不能重复
 
log_bin = mysql-bin #必须开启
 
binlog_format = ROW#必须
 
expire_logs_days = 0 #日志保存天数,按需,0代表永久

 

安装过程

安装PIP

binlog2sql需要Python运行环境,首先安装pip。

pip 是一个 Python 包安装与管理工具,查看本机是否安装了pip,命令如下:

pip -V

 如果没有安装,执行一下命令下载安装,下载前请确保你的服务器能够访问公网权限(貌似是废话,但或许你申请的设备默认是不开的)

wget https://bootstrap.pypa.io/get-pip.py

  python get-pip.py

 再次查看命令

pip -V

看到如下内容,代表安装成功了

mysql drop库 mysql drop库 恢复_sql

 

 安装Git

通过yum进行安装,命令如下:

yum -y install git

安装binlog2sql

下载binlog2sql,执行以下命令:

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql

下载成功后,会在你当前下载的目录下生成一个binlog2sql目录,在当前目录下执行下面的命令:

pip install -r requirements.txt

安装过程中看到方块乱码别慌,最后出现success,代表ok了

mysql drop库 mysql drop库 恢复_sql_02

 

 

至此,binglog2sql工具安装就绪。

使用过程

 源库

 查看当前的binlog主文件,命令如下:

 

 

mysql drop库 mysql drop库 恢复_sql_03

 

 可以看到,源库当前正在写入的主log是mysql-bin.000003,将该文件通过SSH等方式,拷贝到目标库任意目录,备用。

目标库

同样执行show master status\G;命令,查看目标库当前binlog主文件,如果文件序号小于源库的序号,例如,目标库目前是mysql-bin.000002,则手工刷出一个或若干个binlog文件,直至可以覆盖源库的binlog序号(文件名)。

mysql drop库 mysql drop库 恢复_sql_04

 

数据恢复

至此,菜都备齐了,开炒

进入你的binlog2sql的主目录下的binlog2sql目录,执行以下命令:

python binlog2sql.py -h127.0.0.1 -P你的数据库端口 -u数据库用户 -p'数据库密码' --flashback  -d '数据库名称'  -t '表名  --start-file='mysql-bin.000003' --start-datetime='开始时间' --stop-datetime='结束时间'  > flashback-test(名字随便起).sql

命令执行后,就是等待,时间视你的过滤条件多少,binlog文件数据大小,时间区间大小等条件制约,根据你服务器资源情况设置过滤条件。如果数据量过大,可能等不出结果。

没有消息就是好消息,如果经过一段时间的等待,最后成功地看到命令提示符,且生成的文件大小 > 0,恭喜,成功了!

这个SQL文件,就是针对指定时间区间(如果你输入了)等过滤条件内的执行的SQL的反向SQL,在目标表中执行一下,数据就回到你期望的时间点了。

 

安装遇到的问题及解决

问题一 Python脚本连接Mysql出错

pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1' ... ...

这个在网上有很多文章都是提示你输入格式有问题,如果你不属于这种情况,那么以下的办法会终极解决

你的MySQL使用的caching_sha2_password认证方式,换成mysql_native_password就可以了,具体操作如下:

ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的密码’;