mysqlbinlog恢复bin-log数据

Binlog日志即binary log,是二进制日志文件,有两个作用,一个是增量备份,另一个是主从复制,即从节点同步主节点数据时获取的即是bin-log,也可以通过bin-log日志来进行本机数据恢复。

1、可以登录mysql客户端查看bin-log有没有开启:

mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
6 rows in set (0.02 sec)

log_bin为ON时,binlog即开启,为OFF,未开启。以上已开启

2、开启mysql binlog日志:

进入mysql主配置文件(vim /etc/my.cnf),在mysqld模块下增加以下参数

server-id = 1(单个节点id)
log-bin= /var/lib/mysql/mysql-bin(位置一般和mysql库文件所在位置一样)
expire_logs_days = 10(表示此日志保存时间为10天;在mysql 8的版本中已经不建议使用此参数)

3、binlog日志包括两类文件;第一个是二进制索引文件(后缀为.index),第二个为日志文件(后缀名称为.0000*),记录所有的DML(除SELECT)及DDL语句事件

[root@TestCentos7 ~]# ls /var/lib/mysql/
mysql-bin.000001 mysql-bin.000002 mysql-bin.index mysql.sock

4、查看binlog日志列表:show master logs;

mysql> show master logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 2412 | No |
| mysql-bin.000002 | 445 | No |
+------------------+-----------+-----------+
2 rows in set (0.00 sec)

5、查看最后一个binlog日志的编号名称及其最后一个操作事件pos结束点的值:show master status;

mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000002 | 445 | | | c9fba9e2-db3b-11eb-81d4-000c298d8da1:1 |
+------------------+----------+--------------+------------------+----------------------------------------+
1 row in set (0.00 sec)

注意:如果mysql没有开启GTID的话,不会有pos结束点的值,可以使用 show variables like '%gtid_mode%'; 检查是否开启。

6、flush logs 刷新日志,生成一个新编号的binlog文件:

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec) mysql> show master logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 2412 | No |
| mysql-bin.000002 | 492 | No |
| mysql-bin.000003 | 195 | No |
+------------------+-----------+-----------+
3 rows in set (0.00 sec)

每当mysqld服务重启后,会自动刷新binlog文件,mysqldump数据时也可以加-F选项来刷新binlog日志文件

7、清空所有binlog日志文件用 reset master;

8、查看binlog文件内容,使用查看工具mysqlbinlog来查看(vi/vim/cat等都打不开)

# mysqlbinlog mysql-bin.000002 | more

BEGIN
/*!*/;
# at 309
#201123 14:16:09 server id 100 end_log_pos 369 CRC32 0x73d92352 Table_map: `vfan`.`student` mapped to number 86
# at 369
#201123 14:16:09 server id 100 end_log_pos 414 CRC32 0x0e056855 Write_rows: table id 86 flags: STMT_END_F BINLOG '
qVO7XxNkAAAAPAAAAHEBAAAAAFYAAAAAAAEABHZmYW4AB3N0dWRlbnQAAwMPAQI8AAABAYACASFS
I9lz
qVO7Xx5kAAAALQAAAJ4BAAAAAFYAAAAAAAEAAgAD/wAFAAAAA0hlZxNVaAUO
'/*!*/;
# at 414
#201123 14:16:09 server id 100 end_log_pos 445 CRC32 0xfaf4f9c6 Xid = 10
COMMIT/*!*/;
# at 445
#201123 14:19:20 server id 100 end_log_pos 492 CRC32 0x95a77234 Rotate to mysql-bin.000003 pos: 4

14:16:09  —— 时间

server id 100 —— server id(my.cnf中设置的id)

end_log_pos 492  —— 结束的Pos点

9、上边的方法内容比较多,也不太容易观察,以下命令更方便查看:show binlog events in 'mysql-bin.000002';

mysql> show binlog events in 'mysql-bin.000002';
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000002 | 4 | Format_desc | 100 | 124 | Server ver: 8.0.16, Binlog ver: 4 |
| mysql-bin.000002 | 124 | Previous_gtids | 100 | 155 | |
| mysql-bin.000002 | 155 | Gtid | 100 | 234 | SET @@SESSION.GTID_NEXT= 'c9fba9e2-db3b-11eb-81d4-000c298d8da1:1' |
| mysql-bin.000002 | 234 | Query | 100 | 309 | BEGIN |
| mysql-bin.000002 | 309 | Table_map | 100 | 369 | table_id: 86 (vfan.student) |
| mysql-bin.000002 | 369 | Write_rows | 100 | 414 | table_id: 86 flags: STMT_END_F |
| mysql-bin.000002 | 414 | Xid | 100 | 445 | COMMIT /* xid=10 */ |
| mysql-bin.000002 | 445 | Rotate | 100 | 492 | mysql-bin.000003;pos=4 |
+------------------+-----+----------------+-----------+-------------+-------------------------------------------------------------------+
8 rows in set (0.00 sec)

10、指定查询

(1)从Pos点414开始查询,如下:

mysql> show binlog events in 'mysql-bin.000002' from 414;
+------------------+-----+------------+-----------+-------------+------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+------------------------+
| mysql-bin.000002 | 414 | Xid | 100 | 445 | COMMIT /* xid=10 */ |
| mysql-bin.000002 | 445 | Rotate | 100 | 492 | mysql-bin.000003;pos=4 |
+------------------+-----+------------+-----------+-------------+------------------------+
2 rows in set (0.00 sec)

(2)从Pos点155开始查询,跳过中间两行,查询后4条数据

mysql> show binlog events in 'mysql-bin.000002' from 155 limit 2,4;
+------------------+-----+------------+-----------+-------------+--------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+--------------------------------+
| mysql-bin.000002 | 309 | Table_map | 100 | 369 | table_id: 86 (vfan.student) |
| mysql-bin.000002 | 369 | Write_rows | 100 | 414 | table_id: 86 flags: STMT_END_F |
| mysql-bin.000002 | 414 | Xid | 100 | 445 | COMMIT /* xid=10 */ |
| mysql-bin.000002 | 445 | Rotate | 100 | 492 | mysql-bin.000003;pos=4 |
+------------------+-----+------------+-----------+-------------+--------------------------------+

(3)从Pos点155开始查询后四行

mysql> show binlog events in 'mysql-bin.000002' from 155 limit 4;
+------------------+-----+------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+-----+------------+-----------+-------------+-------------------------------------------------------------------+
| mysql-bin.000002 | 155 | Gtid | 100 | 234 | SET @@SESSION.GTID_NEXT= 'c9fba9e2-db3b-11eb-81d4-000c298d8da1:1' |
| mysql-bin.000002 | 234 | Query | 100 | 309 | BEGIN |
| mysql-bin.000002 | 309 | Table_map | 100 | 369 | table_id: 86 (vfan.student) |
| mysql-bin.000002 | 369 | Write_rows | 100 | 414 | table_id: 86 flags: STMT_END_F |
+------------------+-----+------------+-----------+-------------+-------------------------------------------------------------------+
4 rows in set (0.00 sec)

11、利用bin-log日志恢复mysql数据,现在有一张表student如下:

mysql> select * from student;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Goy | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
+----+------+-----+
5 rows in set (0.00 sec)

(1)先模拟全量备份,进行mysqldump备份

[root@TestCentos7 data]# mysqldump -uroot -proot1 vfan > dump1.sql

(2)由于业务需要,需要对此表进行插入(6 和 7)

mysql> select * from student;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Goy | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
| 6 | Mom | 20 |
| 7 | Lei | 21 |
+----+------+-----+
7 rows in set (0.00 sec)

(3)由于业务需要,要将id=3的name更改为Giil

mysql> UPDATE student set name='Giil' where id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from student;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Giil | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
| 6 | Mom | 20 |
| 7 | Lei | 21 |
+----+------+-----+
7 rows in set (0.01 sec)

(4)操作失误,勿将 vfan 数据库删除

mysql> drop database vfan;
Query OK, 1 row affected (0.10 sec)

(5)先进行全量恢复一下:

mysql> CREATE DATABASE vfan;
mysql> use vfan
Database changed
mysql> source /data/dump1.sql
mysql> select * from student;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Goy | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
+----+------+-----+
5 rows in set (0.00 sec)

然后通过binlog进行增量恢复,先flush logs;一下,防止再有操作写进此binlog日志中,会增加恢复难度:

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec) mysql> show master logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 2412 | No |
| mysql-bin.000002 | 492 | No |
| mysql-bin.000003 | 1219 | No |
| mysql-bin.000004 | 195 | No |
+------------------+-----------+-----------+
4 rows in set (0.00 sec)

查看mysql-bin.000003的具体信息,如下:

INSERT操作:事务的起始Pos点为274,事务提交结束点为495

UPDATE操作:事务的起始Pos点为574,事务提交结束点为886

(6)开始恢复INSERT的数据,执行:

mysqlbinlog --start-position=274 --stop-position=495 --database=vfan /var/lib/mysql/mysql-bin.000003 | mysql -uroot -proot1 -v vfan

此命令意思为mysqlbinlog读取binlog日志内容并通过管道符传给mysql命令,-v表示执行此mysql命令

我执行后有一个报错,大概是GTID_MODE的参数错误:

# mysqlbinlog --start-position=274 --stop-position=495 --database=vfan /var/lib/mysql/mysql-bin.000003 | /mysql -uroot -proot1 -v vfan
ERROR 1782 (HY000) at line 23: @@SESSION.GTID_NEXT cannot be set to ANONYMOUS when @@GLOBAL.GTID_MODE = ON.

只需将gtid_mode设置为OFF_PERMISSIVE即可

mysql> set global gtid_mode='on_permissive';
Query OK, 0 rows affected (0.01 sec) mysql> set global gtid_mode='off_permissive';
Query OK, 0 rows affected (0.12 sec) mysql> show variables like '%gtid_mode%';
+---------------+----------------+
| Variable_name | Value |
+---------------+----------------+
| gtid_mode | OFF_PERMISSIVE |
+---------------+----------------+
1 row in set (0.00 sec)

再重新执行以上mysqlbinlog命令,执行成功!

再次查看student表内数据:

mysql> select * from student ;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Goy | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
| 6 | Mom | 20 |
| 7 | Lei | 21 |
+----+------+-----+
7 rows in set (0.00 sec)

INSERT操作的数据已经恢复

(7)开始恢复UPDATE的数据

/usr/local/mysql/bin/mysqlbinlog --start-position=574 --stop-position=886 --database=vfan /var/lib/mysql/mysql-bin.000003 | /usr/local/mysql/bin/mysql -uroot -proot1 -v vfan

再次查看,UPDATE的数据也已经恢复:

mysql> select * from student ;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Giil | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
| 6 | Mom | 20 |
| 7 | Lei | 21 |
+----+------+-----+
7 rows in set (0.00 sec)

12、还有另一种可以通过时间来进行恢复:

还是将数据库误删,然后全量恢复完毕,准备增量恢复。

mysql> select * from student;
+----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | Tony | 18 |
| 2 | Any | 17 |
| 3 | Goy | 20 |
| 4 | Baly | 18 |
| 5 | Heg | 19 |
+----+------+-----+
5 rows in set (0.00 sec)

(1)先使用mysqlbinlog查看操作时间

mysqlbinlog mysql-bin.000003 | more

(2)开始恢复,直接将INSERT和UPDATE数据一并恢复

mysqlbinlog --start-datetime="2020-11-23 14:44:18" --stop-datetime="2020-11-23 14:46:28" --database=vfan /var/lib/mysql/mysql-bin.000003 | mysql -uroot -proot1 -v vfan

实战演习:mysqlbinlog恢复bin-log数据的更多相关文章

  1. MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...

  2. binlog_format不同模式下,对mysqlbinlog恢复的影响

      binlog_format='mixed' (root)[(none)]>use test; Reading table information for completion of tabl ...

  3. mysqlbinlog恢复数据-update20140820

    mysqlbinlog恢复数据 BINLOG就是一个记录SQL语句的过程,和普通的LOG一样.只是它是二进制存储,普通的是十进制存储. ================================ ...

  4. mysqlbinlog恢复数据

    操作命令: 复制代码代码如下: show binlog events in 'mysql-bin.000016' limit 10; reset master 删除所有的二进制日志flush logs ...

  5. [转]实战 SQL Server 2008 数据库误删除数据的恢复

    实战 SQL Server 2008 数据库误删除数据的恢复 关键字:SQL Server 2008, recover deleted records 今天有个朋友很着急地打电话给我,他用delete ...

  6. 使用mysqlbinlog恢复数据

    前提:mysql数据库开启了binlog日志,并且有对应的日志文件 起因:今天由于同事对数据库的误操作不小心删除了一条数据 方法一:通过binlog日志文件恢复数据 通过mysqlbinlog恢复My ...

  7. 实战 SQL Server 2008 数据库误删除数据的恢复

    SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可.但是,这个恢复需要有两个前提条件: 1. 至少有一个误删除之前的数据库完全备份. 2. 数据库的恢复模式(Recovery m ...

  8. 通过mysqlbinlog 恢复数据

    前提数据库开启了bin_log记录日志. 查看日志 刷新日志 flush logs; 再次查看 show binary logs; 向表中插入一条数据 现在执行delete误操作,删除所有的数据. d ...

  9. mysqlbinlog恢复数据注意事项【转】

    mysqlbinlog 恢复数据注意事项 前言: 上次有个有个朋友恢复 MySQL 数据,一直恢复不成功,也没有报错信息,使用的环境是 MySQL 5.7 使用了 GTID 以及 binlog 格式为 ...

随机推荐

  1. mysql之sql语句逻辑执行顺序

    1. (1)from先执行,from执行后就会将所有表(多个表时和单表所有的表)数据加载到内存中了 (2)ON执行,得到连接表用的连接条件. (3)JOIN执行,根据ON的连接条件,将from加载的所 ...

  2. ABBYY FineReader 14新增了什么

    FineReader 是一款一体化的 OCR 和PDF编辑转换器,随着版本的更新,功能的增加,FineReader 14的推出继续为用户在处理文档时提高业务生产力,该版本包含若干新特性和功能增强,包括 ...

  3. FL studio系列教程(二):水果的强大功能

    作为音乐人,在电脑上进行编曲,混音,合成是家常便饭,而市面上大家常用的音乐编曲制作软件很多,小编在这里就给大家做一个推荐. 大家常听到的音乐编曲制作软件大多是Cubase.Nuendo.Pro Too ...

  4. elasticsearch 使用同义词

    elasticsearch 使用同义词 使用环境 elasticsearch5.1.1 kibana5.1.1 同义词插件5.1.1 安装插件 下载对应的elasticsearch-analysis- ...

  5. 我给 Apache 顶级项目提了个 Bug

    这篇文章记录了给 Apache 顶级项目 - 分库分表中间件 ShardingSphere 提交 Bug 的历程. 说实话,这是一次比较曲折的 Bug 跟踪之旅.10月28日,我们在 GitHub 上 ...

  6. git原理-本地仓库认识

    项目人员使用git,几乎70%的工作都是在本地仓库完成的.由此可见本地仓库的重要性. 下面我们就通过一些基本的命令讲下git的本地仓库的结构,存储流程,数据类型,如何存储...... 仓库结构 大家都 ...

  7. Java中的单例模式最全解析

    单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式.它不但被应用在实际的工作中,而且还是面试中最常考的题目之一.通过单例模式我们可以知道此人 ...

  8. C语言常用的一些转换工具函数!

    1.字符串转十六进制 代码实现: 2.十六进制转字符串 代码实现: 或者 效果:十六进制:0x13 0xAA 0x02转为字符串:"13AAA2" 3.字符串转十进制 代码实现: ...

  9. .nnmodel to .mlmodel

    做项目时遇到.nnmodel 模型,不知道这是什么框架模型,没有头绪,抓住文件magic number是lzfse compressed, compressed tables. 在https://gi ...

  10. 2020.10.17 JZOJ 提高B组T2 导弹拦截

    2020.10.17 JZOJ 提高B组T2 导弹拦截 题目 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统. 敌国的导弹形成了立体打击,每个导弹可以抽象成一个三维空间中的 ...