MYSQL bin_log 开启及数据恢复
参考博客:
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 开启及数据恢复的更多相关文章
- mysql的binlog进行数据恢复
什么是binlog? binlog,也称为二进制日志,记录对数据发生或潜在发生更改的SQL语句,并以二进制的形式保存在磁盘中,可以用来查看数据库的变更历史(具体的时间点所有的SQL操作).数据库增量备 ...
- MySQL 误操作后数据恢复(update,delete忘加where条件)【转】
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...
- mysql数据安全一之数据恢复案例
mysql数据安全一之数据恢复案例 --chenjianwen 应用场景:适宜开启binlog 日志功能,定时备份并使用--master-data参数备份,在某个时间点丢失数据,用于数据恢复 开篇总结 ...
- mysql日志开启和查看
mysql日志开启和查看. 找到mysql根目录下的my.ini文件,打开在下面插入 log-bin=mysql-bin binlog_format=mixed 然后重启mysql. 在dos端登录m ...
- MySQL 误操作后数据恢复(update,delete忘加where条件)
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...
- mysql 启动失败,数据恢复
mysql 启动失败,数据恢复 2017年02月13日 16:46:36 阅读数:621 Forcing InnoDB Recovery提供了6个等级的修复模式,需要注意的是值大于3的时候,会对数据文 ...
- mysql利用binlog进行数据恢复
目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...
- mysql如何开启远程连接(默认未开启,即使密码正确,仍然无法访问)
mysql如何开启远程连接 | 浏览:1846 | 更新:2015-03-11 20:19 1 2 3 4 5 6 分步阅读 百度经验:jingyan.baidu.com 大家在公司工作中,经常会遇到 ...
- service: no such service mysqld 与MySQL的开启,关闭和重启
1.问题原因与解决办法 因为修改了MySQL临时文件的目录后,使用service mysqld restart重启MySQL出现如下错误: service: no such service mysql ...
随机推荐
- BGP总结(二)
BGP属性 路由器发送关于目标网络的BGP更新消息,更新的度量值被称为路径属性.属性可以是公认的或可选的.强制的或自由决定的.传递的或非传递的.属性也可以是部分的.并非组织的和有组合都是合法的,路径属 ...
- OSPF特殊区域和LSA
OSPF路由计算优选次序: (1) 直连路由:本路由器发起的LSA 1.2: (2) 区域内路由:O: LSA 1.2: (3) 区域间路由:O IA: LSA 3: (4) 1类外部路由:O E1: ...
- 【Java】构造方法
成员变量声明时初始化和构造方法中初始化的区别 声明时为成员变量赋值,那每次创建这个类的对象都是同一个值. 构造方法初始化,每次创建对象时可以为每一个对象赋不同的值(此时要通过有参构造). 无返回值类型 ...
- python工业互联网应用实战5—Django Admin 编辑界面和操作
1.1. 编辑界面 默认任务的编辑界面,对于model属性包含"choices"会自动显示下来列表供选择,"datetime"数据类型也默认提供时间选择组件,如 ...
- jmespath(1)基础语法
前言 JMESPath是JSON的查询语言.您可以从JSON文档中提取和转换元素 官方文档:https://jmespath.org/tutorial.html 基本表达式 JMESPath用的最多的 ...
- Educational Codeforces Round 85 (Div. 2)
题目链接:https://codeforces.com/contest/1334 A. Level Statistics 题意 一个关卡有玩家的尝试次数和通关次数,按时间顺序给出一个玩家 $n$ 个时 ...
- Codeforces Round #652 (Div. 2)D. TediousLee 推导
题意: Rooted Dead Bush (RDB) of level 1是只有一个点,如下图 当(RDB) of level i变成(RDB) of level i+1的时候,每一个顶点要进行下面的 ...
- Codeforces Round #672 (Div. 2) D. Rescue Nibel! (思维,组合数)
题意:给你\(n\)个区间,从这\(n\)区间中选\(k\)个区间出来,要求这\(k\)个区间都要相交.问共有多少种情况. 题解:如果\(k\)个区间都要相交,最左边的区间和最右边的区间必须要相交,即 ...
- JavaScript——三
任务: 其中的"options = options || {}"就代表如果options是一个真的对象,就使用它,否则就给他默认值 在Node函数中: 函数中的this指向wind ...
- Incorrect string value: '\xF0\x9F\x93\xB7</...' for column 'content' at row 1
出现原因:当insert数据中有表情时发生.而这些表情是按照4个字节一个单位进行编码的,而我们使用的utf-8编码在mysql数据库中默认是按照3个字节一个单位进行编码的. 解决方法:将表字段字符集设 ...