本地环境:
操作系统版本:centos 7.7
MariaDB版本:
[root@controller ~]# mysql --version
mysql Ver 15.1 Distrib 5.5.65-MariaDB, for Linux (x86_64) using readline 5.1
简介:
在实际生产环境中有时会出现误删数据的情况,Binlog日志,即二进制日志文件,用于记录用户对数据库操作的SQL语句信息,当发生数据误删除的时候我们可以通过binlog日志来还原已经删除的数据,还原数据的方法分为传统二进制文件还原数据。
配置:
1.Binlog日志还原数据
修改my.cnf文件:
[root@controller ~]# cp /etc/my.cnf /etc/my.cnf.bak #备份做好回退
[root@controller ~]# vim /etc/my.cnf
添加以下内容:
server-id=1
log-bin=binlog
重启数据库:
[root@controller ~]# systemctl restart mariadb
登录数据库:
[root@controller ~]# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.65-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
创建mysdb数据库:
MariaDB [(none)]> create database mysdb charset utf8mb4;
Query OK, 1 row affected (0.03 sec)
进入mysdb数据库:
MariaDB [(none)]> use mysdb;
Database changed
创建user表:
MariaDB [mysdb]> create table user(id int)engine=innodb charset=utf8mb4;
Query OK, 0 rows affected (0.04 sec)
在user表中插入数据:
MariaDB [mysdb]> insert into user values(1);
Query OK, 1 row affected (0.01 sec)
MariaDB [mysdb]> insert into user values(2);
Query OK, 1 row affected (0.00 sec)
MariaDB [mysdb]> insert into user values(3);
Query OK, 1 row affected (0.01 sec)
MariaDB [mysdb]> insert into user values(4);
Query OK, 1 row affected (0.00 sec)
提交:
MariaDB [mysdb]> commit;
Query OK, 0 rows affected (0.00 sec)
查看user表信息:
*MariaDB [mysdb]> select from user;**
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.00 sec)
删除数据:
MariaDB [mysdb]> drop database mysdb;
查看数据库信息:
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| keystone |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.01 sec)
查看日志:
MariaDB [(none)]> show master status\G;
1. row
File: binlog.000001
Position: 1291
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
ERROR: No query specified
扩展:
二进制日志记录模式,分为三种:row,statement,mixed
(1)row:
简介:日志中记录每一行被修改的记录。
优点:记录每行数据修改的记录,不需要太注重sql执行的上下文(即sql执行的顺序,但是只是不太需要注意,很多时候还是需要注意的),日志清晰容易理解,不会出现因为存储过程、某些函数或者触发器从而导致数据无法恢复的问题。
缺点:因为记录的是每行被修改的日志,这样容易使日志的内容大大增加,比如:一句批量修改的sql,如果有1行满足修改的条件那完全能接受,如果是100万条呢,如果在row模式下,就会产生100万条的记录,想想就可怕。如果执行的是修改表结构的sql产生的日志就更是一个惊人的数量。
(2)statement:
简介:记录的是每条执行的sql。
优点:不需要记录每一行数据的变化,只记录每条执行的sql,减少了 bin-log 日志量,节省 I/O 以及存储资源,提高性能。
缺点:必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,保证sql执行的顺序。
(3)mixed:根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。
查看binlog日志信息:
MariaDB [(none)]> show binlog events in 'binlog.000001';
+---------------+------+-------------+-----------+-------------+---------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+------+-------------+-----------+-------------+---------------------------------------------------------------------+
| binlog.000001 | 4 | Format_desc | 1 | 245 | Server ver: 5.5.65-MariaDB, Binlog ver: 4 |
| binlog.000001 | 245 | Query | 1 | 346 | create database mysdb charset utf8mb4 |
| binlog.000001 | 346 | Query | 1 | 464 | use mysdb
; create table user(id int)engine=innodb charset=utf8mb4 |
| binlog.000001 | 464 | Query | 1 | 533 | BEGIN |
| binlog.000001 | 533 | Query | 1 | 623 | use mysdb
; insert into user values(1) |
| binlog.000001 | 623 | Xid | 1 | 650 | COMMIT / xid=16 / |
| binlog.000001 | 650 | Query | 1 | 719 | BEGIN |
| binlog.000001 | 719 | Query | 1 | 809 | use mysdb
; insert into user values(2) |
| binlog.000001 | 809 | Xid | 1 | 836 | COMMIT / xid=17 / |
| binlog.000001 | 836 | Query | 1 | 905 | BEGIN |
| binlog.000001 | 905 | Query | 1 | 995 | use mysdb
; insert into user values(3) |
| binlog.000001 | 995 | Xid | 1 | 1022 | COMMIT / xid=18 / |
| binlog.000001 | 1022 | Query | 1 | 1091 | BEGIN |
| binlog.000001 | 1091 | Query | 1 | 1181 | use mysdb
; insert into user values(4) |
| binlog.000001 | 1181 | Xid | 1 | 1208 | COMMIT / xid=19 / |
| binlog.000001 | 1208 | Query | 1 | 1291 | drop database mysdb |
+---------------+------+-------------+-----------+-------------+---------------------------------------------------------------------+
16 rows in set (0.00 sec)
退出数据库。
将数据还原到/tmp/binlog.sql:
[root@controller ~]# mysqlbinlog --start-position=245 --stop-position=1208 /var/lib/mysql/binlog.000001 > /tmp/binlog.sql
重新登录数据库:
[root@controller ~]# mysql -uroot -p
临时关闭二进制日志记录以免重复记录:
MariaDB [(none)]> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
还原数据:
MariaDB [(none)]> source /tmp/binlog.sql;
开启二进制日志记录:
MariaDB [mysdb]> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)
查看数据库信息:
MariaDB [mysdb]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| keystone |
| mysdb |
| mysql |
| performance_schema |
| test |
+--------------------+
6 rows in set (0.01 sec)
查看user表信息:
MariaDB [mysdb]> use mysdb;
Database changed
*MariaDB [mysdb]> select from user;**
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
4 rows in set (0.00 sec)