MySQL基于日志还原数据

简介

Binlog日志,即二进制日志文件,用于记录用户对数据库操作的SQL语句信息,当发生数据误删除的时候我们可以通过binlog日志来还原已经删除的数据,还原数据的方法分为传统二进制文件还原数据和基于GTID的二进制文件还原数据

传统二进制日志还原数据

1.修改配置文件

[root@localhost ~]# vi /etc/my.cnf
server-id=1
log-bin=binlog

#重启数据库服务
[root@localhost ~]# systemctl restart mysqld
2.操作数据库

mysql> create database mydb charset utf8mb4;
mysql> use mydb;
mysql> create table test(id int)engine=innodb charset=utf8mb4;
mysql> insert into test values(1);
mysql> insert into test values(2);
mysql> insert into test values(3);
mysql> insert into test values(4);
mysql> commit;
mysql> update test set id=10 where id=4;
mysql> commit;
mysql> select * from test;
±-----+
| id |
±-----+
| 1 |
| 2 |
| 3 |
| 10 |
±-----+
4 rows in set (0.00 sec)
mysql> drop database mydb;
3.查看二进制日志信息

mysql> show master status\G;
*************************** 1. row ***************************
File: binlog.000001
Position: 1960
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

#查找创库和删库的点,为219和1868
mysql> show binlog events in ‘binlog.000001’;
±--------------±-----±---------------±----------±------------±-------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
±--------------±-----±---------------±----------±------------±-------------------------------------------------------------------+
| binlog.000001 | 219 | Query | 1 | 329 | create database mydb charset utf8mb4 |
| binlog.000001 | 1868 | Query | 1 | 1960 | drop database mydb |
±--------------±-----±---------------±----------±------------±-------------------------------------------------------------------+
4.另存为二进制日志信息

[root@localhost ~]# mysqlbinlog --start-position=219 --stop-position=1868 /var/lib/mysql/binlog.000001 > /tmp/binlog.sql
5.恢复数据

#临时关闭二进制日志记录以免重复记录
mysql> set sql_log_bin=0;
#恢复数据
mysql> source /tmp/binlog.sql
#重启二进制日志记录
mysql> set sql_log_bin=1;
6.查看数据恢复情况

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mydb |
| mysql |
| performance_schema |
| sys |
±-------------------+
5 rows in set (0.00 sec)

mysql> use mydb;
Database changed
mysql> select * from test;
±-----+
| id |
±-----+
| 1 |
| 2 |
| 3 |
| 10 |
±-----+
4 rows in set (0.00 sec)、
基于GTID二进制日志还原数据

1.修改配置文件

[root@localhost ~]# vi /etc/my.cnf
server-id=1
log-bin=binlog
gtid_mode=ON
enforce_gtid_consistency=true
log_slave_updates=1

#重启数据库服务
[root@localhost ~]# systemctl restart mysqld
2.操作数据库

mysql> create database mydb1;
mysql> use mydb1;
Database changed
mysql> create table t1(id int)engine=innodb charset=utf8mb4;
mysql> insert into t1 values(1);
mysql> insert into t1 values(2);
mysql> insert into t1 values(3);
mysql> insert into t1 values(11);
mysql> insert into t1 values(12);
mysql> commit;
mysql> select * from t1;
±-----+
| id |
±-----+
| 1 |
| 2 |
| 3 |
| 11 |
| 12 |
±-----+
5 rows in set (0.00 sec)
mysql> drop database mydb1;
3.查看二进制日志信息

mysql> show master status\G;
*************************** 1. row ***************************
File: binlog.000003
Position: 1944
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 51d3db57-bf69-11ea-976c-000c2911a022:1-8
1 row in set (0.00 sec)

mysql> show binlog events in ‘binlog.000003’;
±--------------±-----±---------------±----------±------------±------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
±--------------±-----±---------------±----------±------------±------------------------------------------------------------------+
| binlog.000003 | 154 | Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= ‘51d3db57-bf69-11ea-976c-000c2911a022:1’ |
| binlog.000003 | 219 | Query | 1 | 316 | create database mydb1 |
| binlog.000003 | 1784 | Gtid | 1 | 1849 | SET @@SESSION.GTID_NEXT= ‘51d3db57-bf69-11ea-976c-000c2911a022:8’ |
| binlog.000003 | 1849 | Query | 1 | 1944 | drop database mydb1 |
±--------------±-----±---------------±----------±------------±------------------------------------------------------------------+
4.另存为二进制日志信息

#8号事务记录为删除数据库,因此只需恢复1-7号事务记录即可
[root@localhost ~]# mysqlbinlog --skip-gtids --include-gtids=‘51d3db57-bf69-11ea-976c-000c2911a022:1-7’ /var/lib/mysql/binlog.000003 > /tmp/gtid.sql

参数说明:
–include-gtids:包含事务
–exclude-gtids:排除事务
–skip-gtids:跳过事务
5.恢复数据

mysql> set sql_log_bin=0;
mysql> source /tmp/gtid.sql
mysql> set sql_log_bin=1;
6.查看数据恢复情况

mysql> show databases;
±-------------------+
| Database |
±-------------------+
| information_schema |
| mydb |
| mydb1 |
| mysql |
| performance_schema |
| sys |
±-------------------+
6 rows in set (0.00 sec)

mysql> use mydb1;
Database changed
mysql> select * from t1;
±-----+
| id |
±-----+
| 1 |
| 2 |
| 3 |
| 11 |
| 12 |
±-----+
5 rows in set (0.00 sec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值