删库不必跑路,自己动手MySQL数据恢复,真香~~

303 阅读3分钟

背景   今天项目上需要对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 bootstrap.pypa.io/get-pip.py python get-pip.py

再次查看命令

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

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

yum -y install git 安装binlog2sql 下载binlog2sql,执行以下命令:

git clone github.com/danfengcao/… && cd binlog2sql 下载成功后,会在你当前下载的目录下生成一个binlog2sql目录,在当前目录下执行下面的命令:

pip install -r requirements.txt 安装过程中看到方块乱码别慌,最后出现success,代表ok了

至此,binglog2sql工具安装就绪。

使用过程 源库 查看当前的binlog主文件,命令如下:

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

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

数据恢复 至此,菜都备齐了,开炒

进入你的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 ‘你的密码’;