binlog的简单数据恢复

1. 环境准备

1)在/etc/my.cnf文件中的服务器端开启二进制功能

log_bin=/data/binlog/mysql-bin

2)确认二进制记录方式

binlog_format=row

此处选用DML语句的RBR模式,特点是记录数据行的变化,日志量大,可读性低,需要借助工具分析,但足够严谨。
SMR模式则原封不动的记录语句,日志量小,可读性强,但不够严谨。

3)取消自动提交功能

autocommit=0

4)查看日志开启情况

3306 [(none)]>show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/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.01 sec)

2. 模拟数据丢失

3306 [(none)]>create database binlog charset utf8;
Query OK, 1 row affected (0.01 sec)

3306 [(none)]>use binlog;
Database changed
3306 [binlog]>create table t1(id int);
Query OK, 0 rows affected (0.04 sec)

3306 [binlog]>insert into t1 values(1);
Query OK, 1 row affected (0.57 sec)

3306 [binlog]>commit;
Query OK, 0 rows affected (0.01 sec)

3306 [binlog]>insert into t1 values(2);
Query OK, 1 row affected (0.02 sec)

3306 [binlog]>commit;
Query OK, 0 rows affected (0.01 sec)

3306 [binlog]>insert into t1 values(3);
Query OK, 1 row affected (0.00 sec)

3306 [binlog]>commit;
Query OK, 0 rows affected (0.03 sec)

3306 [binlog]>drop database binlog;
Query OK, 1 row affected (0.79 sec)

3. 进行数据恢复

1)查看是哪个二进制日志文件

3306 [(none)]>show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1432 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

2)查看日志内容的事件

3306 [(none)]>show binlog events in 'mysql-bin.000002';
+------------------+------+----------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos  | Event_type     | Server_id | End_log_pos | Info                                  |
+------------------+------+----------------+-----------+-------------+---------------------------------------+
| mysql-bin.000002 |    4 | Format_desc    |         6 |         123 | Server ver: 5.7.26-log, Binlog ver: 4 |
| mysql-bin.000002 |  123 | Previous_gtids |         6 |         154 |                                       |
| mysql-bin.000002 |  154 | Anonymous_Gtid |         6 |         219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 |  219 | Query          |         6 |         332 | create database binlog charset utf8   |
| mysql-bin.000002 |  332 | Anonymous_Gtid |         6 |         397 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 |  397 | Query          |         6 |         498 | use `binlog`; create table t1(id int) |
| mysql-bin.000002 |  498 | Anonymous_Gtid |         6 |         563 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 |  563 | Query          |         6 |         637 | BEGIN                                 |
| mysql-bin.000002 |  637 | Table_map      |         6 |         684 | table_id: 108 (binlog.t1)             |
| mysql-bin.000002 |  684 | Write_rows     |         6 |         724 | table_id: 108 flags: STMT_END_F       |
| mysql-bin.000002 |  724 | Xid            |         6 |         755 | COMMIT /* xid=11 */                   |
| mysql-bin.000002 |  755 | Anonymous_Gtid |         6 |         820 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 |  820 | Query          |         6 |         894 | BEGIN                                 |
| mysql-bin.000002 |  894 | Table_map      |         6 |         941 | table_id: 108 (binlog.t1)             |
| mysql-bin.000002 |  941 | Write_rows     |         6 |         981 | table_id: 108 flags: STMT_END_F       |
| mysql-bin.000002 |  981 | Xid            |         6 |        1012 | COMMIT /* xid=13 */                   |
| mysql-bin.000002 | 1012 | Anonymous_Gtid |         6 |        1077 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 | 1077 | Query          |         6 |        1151 | BEGIN                                 |
| mysql-bin.000002 | 1151 | Table_map      |         6 |        1198 | table_id: 108 (binlog.t1)             |
| mysql-bin.000002 | 1198 | Write_rows     |         6 |        1238 | table_id: 108 flags: STMT_END_F       |
| mysql-bin.000002 | 1238 | Xid            |         6 |        1269 | COMMIT /* xid=15 */                   |
| mysql-bin.000002 | 1269 | Anonymous_Gtid |         6 |        1334 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS'  |
| mysql-bin.000002 | 1334 | Query          |         6 |        1432 | drop database binlog                  |
+------------------+------+----------------+-----------+-------------+---------------------------------------+
23 rows in set (0.00 sec)

3)截取出从建库到删库的position区间

根据日志文件内容,可以看出建库的起始点pos是219;删库的pos起始位置是1334和1432,我们只需要删库前的pos即可,即1334。

4)在命令行恢复导出sql文件

[root@bff8617b4afc tools]# mysqlbinlog --start-position=219 --stop-position=1334 /data/binlog/mysql-bin.000002 >/tmp/bin.sql

5)在数据库恢复数据

3306 [(none)]>source /tmp/bin.sql

6)检查是否恢复成功

3306 [binlog]>select * from binlog.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.03 sec)

4. 总结:

1.首先确保参数开启。
二进制开启;
取消自动提交;
启用RBR行记录模式。

2.确认是哪个二进制文件。

3.确认需要的position号,即恢复数据的起始位置。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值