背景
今天项目上需要对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
看到如下内容,代表安装成功了
安装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了
至此,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 ‘你的密码’;