今天是七夕节,下午工作时候还在想我女朋友在哪里,是不是迷路了,怎么这么多年都还没找到我。突然有个同事找我,说我们的平台有张表显示废弃状态,他已经联系dba看过表没问题了,让我把这个表重新抽取一次,(我们的平台目前还不完善,部分功能界面没有开发)本着严禁的态度,我根据同事给的表名a去数据库查一下,看看是否正确,结果如下:

mysql update误操作如何恢复 mysql误更新恢复_python

看了下数据没问题,那就开始更新吧,更新时候我写sql根据id=xxx来更新,于是为了偷懒也为了不出错就直接复制id和22713。

mysql update误操作如何恢复 mysql误更新恢复_sql_02

结果执行完一看改变了5084条,不是应该只更新一条吗?再看sql,?id = id,我的22713怎么没粘贴呢。瞬间冷静下来了,一下子多抽取5084张表,明天凌晨的任务得全部延迟,搞不好得卷铺盖走人了,得赶紧想办法恢复数据。

由于这个数据库不是公司dba团队维护,所以dba无法帮助恢复,网上看了下有个工具叫binlog2sql,前提是数据库开启binlog且为row模式,这个库满足条件,咨询了下公司dba同事,他们也是用binlog2sql工具恢复。

看了下这个工具的readme,需要python2.7还有pip、PyMySQL、wheel、mysql-replication。看到这个也挺奔溃的,公司生产服务器不能连接外网,python2.7是自带的,剩下都得手动安装,python手动装包又比较麻烦。

  1. 安装pip
# 下载pip并上传到服务器
# https://files.pythonhosted.org/packages/45/ae/8a0ad77defb7cc903f09e551d88b443304a9bd6e6f124e75c0fbbf6de8f7/pip-18.1.tar.gz
# 解压安装
tar -zxvf pip-18.1.tar.gz && cd pip-18.1 
# 开始安装
python setup.py install
# 安装提示没有setuptools
# 再下载setuptools上传到服务器并安装
# https://files.pythonhosted.org/packages/1d/64/a18a487b4391a05b9c7f938b94a16d80305bf0369c6b0b9509e86165e1d3/setuptools-41.0.1.zip
unzip setuptools-41.0.1.zip && cd setuptools-41.0.1
# 开始安装
python setup.py install
# 安装成功setuptools再次安装pip
cd pip-18.1 && python setup.py install
# 安装成功pip
# 测试pip命令
pip -V
# 出现错误提示如下:
pkg_resources.DistributionNotFound: The 'pip==7.1.0' distribution was not found and is required by the application
# 我分明安装的是18.1,提示是7.1.0,修改/usr/bin/pip 将里面的7.1.0改为18.1之后没问题了
  1. 安装别的依赖
# 服务器不能连接外网只能通过本地的虚拟机下载依赖包
pip install -r requirements.txt -d /tmp/requirements
# 命令执行完后目录下存在以下文件:
PyMySQL-0.7.11-py2.py3-none-any.whl
wheel-0.29.0-py2.py3-none-any.whl
mysql-replication-0.13.tar.gz
# 将上述3个文件和binlog2sql上传到服务器依次安装依赖
pip install PyMySQL-0.7.11-py2.py3-none-any.whl
pip install wheel-0.29.0-py2.py3-none-any.whl
tar -zxvf mysql-replication-0.13 && cd mysql-replication-0.13 && python setup.py install
# 测试binllog2sql
python binlog2sql.py
# 正确输出帮助信息
  1. 恢复数据
# 按照官网提示新建用户并授权
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'binlog2sql'@'xxx.xxx.xxx.xxx' identified by 'binlog2sql';
# 找到对应的binlog文件和执行的时间区间然后开始生成逆向sql
python binlog2sql.py --flashback --back-interval=0 -hxxx.xxx.xxx.xxx -P3306 -ubinlog2sql -p'binlog2sql' -dxxx -tdb_table --start-file='mysql-bin.000116' --start-datetime='2019-08-07 15:35:00' --stop-datetime='2019-08-07 15:41:00' > /tmp/db_table.sql
# 检查生成的sql文件正好是5084行,检查了下sql也没问题就直接在mysql客户端执行了
source /tmp/db_table.sql

至此数据恢复了,非常感谢binlog2sql作者开源的工具。以后执行sql也得非常小心了,差点就造成n多个一级故障了。