本地环境: 操作系统版本: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)

数据已经还原到最初状态。