Mysql开启log_bin并进行数据恢复

Mysql开启binlog

日志类型 写入日志的信息
错误日志 记录在启动,运行或停止mysqld时遇到的问题
通用查询日志 记录建立的客户端连接和执行的语句
二进制日志 记录更改数据的语句
中继日志 从复制主服务器接收的数据更改
慢查询日志 记录所有执行时间超过 long_query_time 秒的所有查询或不使用索引的查询
DDL日志(元数据日志) 元数据操作由DDL语句执行

本文主要介绍二进制日志 binlog。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
Binlog日志的两个最重要的使用场景

1.MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
2.数据恢复:通过使用 mysqlbinlog工具来使恢复数据

启用binlog,通过配置 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf

$ vim /etc/mysql/mysql.conf.d/mysqld.cnf

$ service mysql restart //重启Mysql

$ mysql -u root -p
mysql> show binary logs;
1381 - You are not using binary logging
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.15 sec)

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 154 |
+------------------+-----------+
1 row in set (0.03 sec)

mysql> delete from t_iost_2019_04; //开启binlog后删除数据库一张表的数据
Query OK, 13244 rows affected (0.30 sec)
mysql> show master status; //查看目前的binlog文件
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 2006168 | dapp | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.04 sec)

首先我们安装binlog2sql:

$ git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql
$ pip install -r requirements.txt
$ cd binlog2sql
$ ls -lht
total 64K
drwxr-xr-x 2 root root 4.0K Aug 29 17:50 binlog2sql
drwxr-xr-x 2 root root 4.0K Aug 29 17:50 example
-rw-r--r-- 1 root root 35K Aug 29 17:50 LICENSE
-rw-r--r-- 1 root root 9.3K Aug 29 17:50 README.md
-rw-r--r-- 1 root root 54 Aug 29 17:50 requirements.txt
drwxr-xr-x 2 root root 4.0K Aug 29 17:50 tests
$ pip install -r requirements.txt
$ python binlog2sql/binlog2sql.py -h 127.0.0.1 -P 3306 -u admin -p'admin' -dtest -tuser --start-file='mysql-bin.000001' --start-datetime='2019-08-26 00:00:00' --stop-datetime='2019-08-26 18:00:00' > /tmp/raw.sql ##大致范围查找


$ python binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uadmin -p'admin' -dtest -tuser --start-file='mysql-bin.000054' --start-position=257427 --stop-position=504272 -B > /tmp/rollback.sql #找到要恢复sql的起始位置

#命令解释: h 数据库ip p 数据库端口 u 账号 p 密码 d 目标库 t 表明 start-file binlog文件名 start-datetime 开始时间 stop-datetime 结束时间 > 输出到指定文件 start-position 开始位置 stop-position 结束位置 B生成回滚sql

$ mysql -h 127.0.0.1 -P 3306 -u admin < /tmp/rollback.sql //执行回滚SQL数据的恢复

mysql> select count(*) from t_iost_2019_04; #查询恢复结果
+----------+
| count(*) |
+----------+
| 13244 |
+----------+
1 row in set (0.17 sec)

如图