MySQL的binlog日志是MySQL日志中非常重要的一种日志,记录了数据库所有的DML操作。通过binlog日志我们可以进行数据库的读写分离、数据增量备份以及服务器宕机时的数据恢复。
每个业务数据库必然都会定期做备份。可以在误删除或磁盘故障的时候将丢失的数据快速恢复。但是可以想想备份都是在固定时间点。不能完全恢复到最新的数据,这是不能接受的。
试想一下,在主从架构中误操作把主库的数据库直接干掉了,而备份的数据还是几个小时前的。这几个小时内插入了很多数据 这些数据怎么恢复呢? 这时候就体现binlog日志的重要性了。
实践开始
MySQL 版本
[root@docker ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.24, for linux-glibc2.12 (x86_64) using EditLine wrapper
系统版本
[root@docker ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
查看当前所有数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| devops |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
用devops库来做这次的验证
对现有数据库做个备份
# 看一下数据库有哪些数据
mysql> show tables;
+------------------+
| Tables_in_devops |
+------------------+
| ops_user |
+------------------+
1 row in set (0.00 sec)
mysql> select * from ops_user;
+----+--------------+----------+-----------------------+------+--------+------------+
| id | username | password | duties | age | gender | entry_time |
+----+--------------+----------+-----------------------+------+--------+------------+
| 2 | 贝克汉姆 | 123456 | 自动化运维 | 43 | 男 | 20190313 |
| 3 | 维多利亚 | 123456 | 自动化运维 | 43 | 女 | 20190313 |
| 4 | 罗密欧 | 123456 | 运维先生 | 28 | 男 | 20190313 |
| 5 | 朱丽叶 | 123456 | 先生情人 | 36 | 女 | 20190313 |
| 6 | 小丸子 | 123456 | 先生女友 | 18 | 女 | 20190313 |
+----+--------------+----------+-----------------------+------+--------+------------+
整库做个备份
# mysqldump -uroot -p123456 -B devops > /root/devops.sql
登录到数据库刷新binlog日志
每次刷新和服务重启的时候,都会生成一个binlog日志文件。刷新binlog日志,生成一个新的日志,那么我们之后所要操做的内容都会被记录到新的日志文件中。
# 阶段binlog日志
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
# 查看状态
mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| mysql3306-bin.000009 | 154 | | | |
+----------------------+----------+--------------+------------------+-------------------+
mysql> use devops;
# 插入一条数据 作为备份时间后期间的新增数据
mysql> insert into ops_user(username,password,duties,age,gender,entry_time) values('花木兰','123456','自动化运维','30','女','20190313');
# 检查现在的数据
mysql> select * from ops_user;
+----+--------------+----------+-----------------------+------+--------+------------+
| id | username | password | duties | age | gender | entry_time |
+----+--------------+----------+-----------------------+------+--------+------------+
| 2 | 贝克汉姆 | 123456 | 自动化运维 | 43 | 男 | 20190313 |
| 3 | 维多利亚 | 123456 | 自动化运维媳妇 | 43 | 女 | 20190313 |
| 4 | 罗密欧 | 123456 | 运维先生 | 28 | 男 | 20190313 |
| 5 | 朱丽叶 | 123456 | 先生情人 | 36 | 女 | 20190313 |
| 6 | 小丸子 | 123456 | 先生女友 | 18 | 女 | 20190313 |
| 7 | 花木兰 | 123456 | 先生情妇 | 30 | 女 | 20190313 |
+----+--------------+----------+-----------------------+------+--------+------------+
6 rows in set (0.00 sec)
直接删库
mysql> drop database devops;
Query OK, 1 row affected (0.05 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
可以看到devops库已经被删掉,在生产环境中一定要禁止这类操作,太危险了。如果发生了,立即使用备份数据进行恢复。
mysql> source /root/devops.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
......
Database changed
Query OK, 0 rows affected (0.01 sec)
......
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Query OK, 0 rows affected (0.00 sec)
......
Query OK, 0 rows affected (0.00 sec)
查看一下是否恢复成功
mysql> show databases;
+---------