参考博客:

A:https://www.jianshu.com/p/55b0d52edca2

B:https://www.cnblogs.com/martinzhang/p/3454358.html

C:https://www.cnblogs.com/xxoome/p/9802684.html

本文基于Mysql 5.7.27,Centos7.4。

1:如何开启bin_log

1.1:查看是否开启bin_log

1.2:修改mysql配置文件,开启bin_log

(1)我的配置文件在 /etc/my.cnf,也可以使用 whereis my.cnf 查看位置。

注意点:

  1.binlog_format 有三种格式,分别是STATEMENT、ROW、MIXED。自5.7.7之后默认为ROW 格式。具体区别可自行百度之。

  2.mysql-bin-log 为日志文件前缀,生成的日志文件格式为 mysql-bin-log.000001 。

(2)重启mysql,在检查bin_log 是否开启

 

   上述则表示已成功开启bin_log 了,后面开始进行数据恢复测试。

2:如何恢复数据

(1)方便测试,可以导入一下数据:

###建库:
CREATE DATABASE `back_master` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci'; ### 建表
CREATE TABLE `back_master`.`tb_user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
### 插入数据
insert into tb_user(name) values('wew'),('1233'),('sdsa'),('wqewq');

测试sql

(2)常用binlog日志操作命令
1.查看所有binlog日志列表

mysql> show master logs;

2.查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值

mysql> show master status;

3.刷新log日志,自此刻开始产生一个新编号的binlog日志文件

mysql> flush logs;

 注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;

4.重置(清空)所有binlog日志

mysql> reset master;

(3)binlog_format=Row 模式下查看sql命令

1.按时间 

  /usr/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin-log.000007 \
  --start-datetime="2020-05-11 17:00:00" \
  --stop-datetime="2020-05-11 18:00:00"

2.按节点

  /usr/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin-log.000001 \
  --start-position=454 \
  --stop-position=665

3. 在mysql 中显示某个文件的具体几条

  show binlog events in 'mysql-bin-log.000001' from 1 limte 10 ;

2.1:单恢复某个表

(1)导入数据,然后删除表 tb_user

(2)进入bin_log 日志文件夹,使用命令查看 SQL 日志。

  我们在删除tb_user 之前,日志是放在 msysql-bin-log.000002 中的,因此我们查看这个文件的日志即可。

BASH:

  /usr/bin/mysqlbinlog -v --base64-output=decode-rows mysql-bin-log.000002

 部分截图:

因为binlog_format 格式是ROW,因此在Mysql 中使用该BASH命令是无法看到sql的。

  show binlog events in 'mysql-bin-log.000002'

 可以看到在 pos=1044 之后进行了表删除操作,因此我们要恢复数据的话,mysqlbinlog 读取的节点应该在 pos=665 和 pos=1044 之间。

 BASH:

/usr/bin/mysqlbinlog --start-position=454 --stop-position=1044  mysql-bin-log.000002 | mysql -uroot -pZgq@123456 -v back_master

 部分截图:

 

 可以看到数据被成功恢复了。

2.2:删库之后进行数据恢复

本人重新导入数据,并把本次实验日志写到 mysql-bin-log.00005 文件中。所以可以看到:

 BASH:

/usr/bin/mysqlbinlog --stop-position=1033  mysql-bin-log.000005 | mysql -uroot -pZgq@123456 -v 

可以看到:

 

库结构、表结构、数据都得到恢复了。

2.2.1:为什么我要把删除和删表分开描述

那为什么我要单独废话再讲一遍?因为笔者在这里走了弯路。明明一句命令就可以搞定,因为操作不当,走了弯路,

因此特意提醒,留心!

我复现一下:

1:我flush logs 生成新的log 文件,重新导入数据,然后直接删库(与2.2的前置操作一样)

log 日志:

2:输入BASH

   /usr/bin/mysqlbinlog --stop-position=1033  mysql-bin-log.000005 | mysql -uroot -pZgq@123456 -v back_master 

报错:提示库不存在

3:输入BASH

  /usr/bin/mysqlbinlog --stop-position=1033  --database=back_master mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v

执行到最后报错:提示表不存在

 此时我已不在 mysql-bin-log.000008 中写入日志了,因此我再次删库以方便第四次测试

4:使用命令 

  (1)恢复库结构

  /usr/bin/mysqlbinlog --start-position=219 --stop-position=454  --database=back_master mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v

执行结果:成功

  (2)恢复表结构及数据

  /usr/bin/mysqlbinlog --start-position=454 --stop-position=1033  --database=back_master mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v 

执行报错:提示表不存在

显然恢复表结构和表数据失败了。换个思路,执行命令:

  (3)再次尝试恢复表结构和数据

  /usr/bin/mysqlbinlog --start-position=454 --stop-position=1033  mysql-bin-log.000008 | mysql -uroot -pZgq@123456 -v back_master

执行结果:成功

5:总结原因

  (1):恢复库结构的时候,可以附带参数 --database=back_master 但不能在 -v 后面带 back_master

  (2):恢复表结构和数据的时候,不可以附带参数 --database=back_master,但是 -v 后面可以带 back_master

       但凡我再聪明点也不会吃这个亏了啊。。

2.2.2:binlog_format由Row改Statement后不立即生效

日志对比:

设置为statement 之后没有立即生效

隔了大概半个小时生效了

咱也不知道为啥(难道我眼花还是延迟?)

MYSQL bin_log 开启及数据恢复的更多相关文章

  1. mysql的binlog进行数据恢复

    什么是binlog? binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作).数据库增量备 ...

  2. MySQL 误操作后数据恢复(update,delete忘加where条件)【转】

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...

  3. mysql数据安全一之数据恢复案例

    mysql数据安全一之数据恢复案例 --chenjianwen 应用场景:适宜开启binlog 日志功能,定时备份并使用--master-data参数备份,在某个时间点丢失数据,用于数据恢复 开篇总结 ...

  4. mysql日志开启和查看

    mysql日志开启和查看. 找到mysql根目录下的my.ini文件,打开在下面插入 log-bin=mysql-bin binlog_format=mixed 然后重启mysql. 在dos端登录m ...

  5. MySQL 误操作后数据恢复(update,delete忘加where条件)

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...

  6. mysql 启动失败,数据恢复

    mysql 启动失败,数据恢复 2017年02月13日 16:46:36 阅读数:621 Forcing InnoDB Recovery提供了6个等级的修复模式,需要注意的是值大于3的时候,会对数据文 ...

  7. mysql利用binlog进行数据恢复

    目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...

  8. mysql如何开启远程连接(默认未开启,即使密码正确,仍然无法访问)

    mysql如何开启远程连接 | 浏览:1846 | 更新:2015-03-11 20:19 1 2 3 4 5 6 分步阅读 百度经验:jingyan.baidu.com 大家在公司工作中,经常会遇到 ...

  9. service: no such service mysqld 与MySQL的开启,关闭和重启

    1.问题原因与解决办法 因为修改了MySQL临时文件的目录后,使用service mysqld restart重启MySQL出现如下错误: service: no such service mysql ...

随机推荐

  1. git submodule添加、更新和删除

    添加 git submodule add <url> <path> url:替换为自己要引入的子模块仓库地址 path:要存放的本地路径 执行添加命令成功后,可以在当前路径中看 ...

  2. Thank in Java

    Think in Java 2.一切都是对象 2.1 引用操作对象 Java 中一切都是对象,因此可以采用单一固定得语法. 操作对象得标识符实际上是对对象得一个 "引用"refer ...

  3. django开发东京买菜,全栈项目,前端vue,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等

    因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...

  4. A - A Gifts Fixing

    t组询问,每次给出数列长度n 以及两个长度为n的数列{ai​}和{bi​}. 有三种操作:ai​−1, bi​−1以及ai​,bi​同时− 1 -1−1. 问最少多少步以后可以让两个数列变成常数数列. ...

  5. CF662C Binary Table【FWT】

    CF662C Binary Table 题意: 给出一个\(n\times m\)的\(01\)矩阵,每次可以反转一行或者一列,问经过若干次反转之后,最少有多少个\(1\) \(n\le 20, m\ ...

  6. CodeForces - 1100E 二分+拓扑排序

    题意: 一个n个节点的有向图,节点标号从1到n,存在m条单向边.每条单向边有一个权值,代表翻转其方向所需的代价.求使图变成无环图,其中翻转的最大边权值最小的方案,以及该方案翻转的最大的边权. Inpu ...

  7. 牛客编程巅峰赛S1第11场 - 黄金&钻石 C.牛牛找子集 (二分)

    题意:有一\(n\)个数,从中找数构成相同的子集,要求子集元素个数为\(k\),求构成子集个数最多的情况,输出子集(字典序最小). 题解:我们可以对子集的个数二分答案,首先用桶记录每个元素的个数,然后 ...

  8. 六、Python集合定义和基本操作方法

    一.集合的定义方法及特点 1.特点: (1)由不同元素组成 #集合由不同元素构成 s={1,2,3,3,4,3,3,} print(s)#运行结果:{1, 2, 3, 4} (2)集合无序 #集合无序 ...

  9. div 水平居中 内容居左

    <div style="margin:0 auto;width:500px;text-align:left"> </div> https://zhidao. ...

  10. Linux系统编程【3.2】——ls命令优化版和ls -l实现

    前情提要 在笔者的上一篇博客Linux系统编程[3.1]--编写ls命令中,实现了初级版的ls命令,但是与原版ls命令相比,还存在着显示格式和无颜色标记的不同.经过笔者近两天的学习,基本解决了这两个问 ...