记录一次mysqlbinlog恢复过程

BitCipher
• 阅读 3998

最近老友线上一个不太重要的数据库被自己误删了,于是找到小猪本猪我恢复数据,早已把"经验大于一切"思想贯彻全身的小猪肯定是不会放过这次机会滴,滴,滴,滴,滴.

开始枯燥的恢复环节

恢复方案选择

老友平时备份都是手动备份,这样子好像也只能选择旧备份数据+binlog来恢复了.

保护现场

  1. 关闭服务器,禁止数据继续写入
  2. 因为我要使用的是binlog方法恢复,所以要在数据库执行一段

    flush logs
    表示开启新的一段binlog

本地数据库版本

老友服务器上的mysql版本是5.6
我本地5.7重新安装数据库太麻烦了,docker安装也麻烦.然后开始找有5.6版本的一键环境...

  • PhpStudy没
  • WampServer太粉(通过截图看好像也没有5.6)
  • APMServ没
  • phpenv有

....找啊找啊终于找到一个说的清清楚楚支持mysql5.6一键环境,然后就是下载安装巴拉巴拉的5.6环境搭建好了.

本地mysql版本开启binlog

记录一次mysqlbinlog恢复过程
可以看到我本地未开启binlog, no:开启 off:未开启

  1. 打开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提供的工具并不支持恢复到某个表或语句,然后各种搜索引擎发现了几个开源项目binlog2sqlmysqlbinlog_flashback

使用binlog2sql恢复

binlog2sql
这二款工具里就它star最多,毫无疑问就是它了.

安装
# 克隆项目
git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
# 安装依赖
pip install -r requirements.txt
环境安装和mysql配置
  1. 安装python2.7,3.4+ python的安装教程网上有非常多
  2. 修改本地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(将打印内容输出大指定文件)
成果

记录一次mysqlbinlog恢复过程

使用过程中遇到的问题
编码问题

出现编码问题的地方会有很多,具体还是要看报错.

  • 导致的问题

    1. 报错直接停止恢复
  • 解决方法

    1. 忽略该编码
    (self.schema_length - 1).decode("utf-8", "ignore")

记录一次mysqlbinlog恢复过程

建议

1.线上一定要记着开启binlog
2.再不济也要配置一下任务计划备份哦
3.有条件的伙伴可以使用XtraBackup进行备份

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
mysql用户
1\.学会能按着需求创建一个帐号2\.知道连接字符串是什么样3\.密码密码怎么恢复mysql用户权限介绍mysql用户管理 !(https://oscimg.oschina.net/oscnet/368d3c1e00a0a9515545c2962660a27a080.png)!(https://oscimg.oschin
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
oracle基础知识
冷备份:在数据库完全关闭的情况下进行的,数据文件是一致的,在备份时没有任何访问和修改从冷备份中恢复:1文件还原2前向恢复热备份:在数据库已启动且正在运行时进行的备份。完全恢复:先把数据库还原,通过所有可用的归档日志对数据库进行前向恢复不完全恢复(时间点恢复):首先将数据库还原,利用部分日志有选择性的前滚到一个预先确定的时
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这