共计 2621 个字符,预计需要花费 7 分钟才能阅读完成。
最近老友线上一个不太重要的数据库被本人误删了, 于是找到小猪本猪我复原数据, 早已把 ” 教训大于所有 ” 思维贯彻全身的小猪必定是不会放过这次机会滴, 滴, 滴, 滴, 滴.
开始干燥的复原环节
复原计划抉择
老友平时备份都是 手动备份 , 这样子如同也只能抉择 旧备份数据 +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 文件前缀, 配置好这个就示意开启了 bin
log-bin = mysql-bin
或者
log_bin=ON
log_bin_basename=/var/lib/mysql/mysql-bin
log_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.log
max_binlog_size = 1G
binlog_format = row
binlog_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.sql
3. 期待执行结束即可
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 进行备份
正文完