最近老友线上一个不太重要的数据库被本人误删了,于是找到小猪本猪我复原数据,早已把"教训大于所有"思维贯彻全身的小猪必定是不会放过这次机会滴,滴,滴,滴,滴.
开始干燥的复原环节
复原计划抉择
老友平时备份都是手动备份,这样子如同也只能抉择旧备份数据+binlog来复原了.
爱护现场
- 敞开服务器,禁止数据持续写入
因为我要应用的是binlog办法复原,所以要在数据库执行一段
flush logs示意开启新的一段binlog
本地数据库版本
老友服务器上的mysql版本是5.6
我本地5.7重新安装数据库太麻烦了,docker装置也麻烦.而后开始找有5.6版本的一键环境...
- PhpStudy没
- WampServer太粉(通过截图看如同也没有5.6)
- APMServ没
- phpenv有
....找啊找啊终于找到一个说的清清楚楚反对mysql5.6一键环境,而后就是下载安装巴拉巴拉的5.6环境搭建好了.
本地mysql版本开启binlog
能够看到我本地未开启binlog, no:开启 off:未开启
- 关上my.ini
# mysqld配置下减少以下内容# binlog文件前缀,配置好这个就示意开启了binlog-bin = mysql-bin或者log_bin=ONlog_bin_basename=/var/lib/mysql/mysql-binlog_bin_index=/var/lib/mysql/mysql-bin.index### 以下配置看你须要,不过只复原数据的话上面不必管# 前缀log_bin_basename# 设置此参数是指定二进制索引文件的门路与名称log_bin_index# 此参数示意只记录指定数据库的二进制日志# 这个参数的应用办法有点坑.不是通过,分隔的哦具体百度一下binlog_do_db# 此参数示意不记录指定的数据库的二进制日志.不是通过,分隔的哦具体百度一下binlog_ignore_db# 此参数示意binlog应用的内存最大的尺寸max_binlog_cache_size# 此参数示意binlog应用的内存大小,能够通过状态变量binlog_cache_use和binlog_cache_disk_use来帮忙测试。binlog_cache_size# 应用二进制日志缓存的事务数量binlog_cache_use# 应用二进制日志缓存但超过binlog_cache_disk_use# 值并应用临时文件来保留事务中的语句的事务数量binlog_cache_size# 最大值,最大和默认值是1GB,该设置并不能严格控制Binlog的大小,尤其是Binlog比拟凑近最大值而又遇到一个比拟大事务时,为了保障事务的完整性,不可能做切换日志的动作,只能将该事务的所有SQL都记录进以后日志,直到事务完结max_binlog_sizeBinlog
应用mysqlbinlog.exe复原
#目录切换到mysql/bin上面# 执行.\mysqlbinlog.exe --database test(要复原的数据库) -s ../data/mysql-bin.000707 > sqls-x\000707-all.txt# 以上命令的意思是# 提取mysql-bin.000707文件中的test数据库的语句(只显示日志中蕴含的语句,不显示其它信息。)
mysqlbinlog.exe其余指令中文翻译
复原了几个文件之后发现太大啦!!!
于是想着先复原几个较为重要的表数据,发现mysql提供的工具并不反对复原到某个表或语句,而后各种搜索引擎发现了几个开源我的项目binlog2sql、mysqlbinlog_flashback
应用binlog2sql复原
binlog2sql
这二款工具里就它star最多,毫无疑问就是它了.
装置
# 克隆我的项目git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql# 装置依赖pip install -r requirements.txt
环境装置和mysql配置
- 装置python2.7,3.4+ python的装置教程网上有十分多
- 批改本地mysql配置
server_id = 1# 这个的值不肯定非要一样log_bin = /var/log/mysql/mysql-bin.logmax_binlog_size = 1Gbinlog_format = rowbinlog_row_image = full
设置mysql权限
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'127.0.0.1';
应用
# 切换到我的项目目录1. cd 我的项目目录/binlog2sql/2. 执行命令 python binlog2sql.py -h127.0.0.1 -P3306 -uroot -proot -dtest -t wp_userinfo wp_balance --sql-type INSERT DELETE --start-file=mysql-bin.000715 --stop-file=mysql-bin.000726 > C:\phpEnv\server\mysql\mysql-5.6\bin\sqls-x\all.sql3. 期待执行结束即可4. 将这些语句导入到数据库就ok啦-h127.0.0.1(数据库链接)-P3306(数据库端口)-uroot(数据库账号)-proot(数据库明码)-dtest(要复原的数据库)-t wp_userinfo wp_balance(导出的指定表)--sql-type INSERT DELETE(要导出的指定语句)\--start-file=mysql-bin.000715 --stop-file=mysql-bin.000726(开始binlog到完结binlog)C:\phpEnv\server\mysql\mysql-5.6\bin\sqls-x\all.sql(将打印内容输入大指定文件)
成绩
应用过程中遇到的问题
编码问题
呈现编码问题的中央会有很多,具体还是要看报错.
导致的问题
- 报错间接进行复原
解决办法
- 疏忽该编码
(self.schema_length - 1).decode("utf-8", "ignore")
倡议
1.线上肯定要记着开启binlog
2.再不济也要配置一下工作打算备份哦
3.有条件的搭档能够应用XtraBackup进行备份