与完全备份不同,增量备份没有重复数据,备份量不大,时间短;但其恢复麻烦,需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复。可以通过MySQL提供的二进制日志间接实现增量备份。
2、MySQL增量备份与恢复
二进制日志保存了所有更新或���可能更新数据库的操作。二进制日志在启动MySQL服务器后开始记录,并在文件达到二进制日志所设置的最大值或者接收到flush logs命令后重新创建新的日志文件,生成二进制文件序列,并及时把这些日志保存到安全的存储位置,即可完成一个时间段的增量备份。
要进行MySQL的增量备份,首先要开启二进制日志功能,开启MySQL的二进制日志功能的实现方法如下:
[root@centos01 ~]# vim /etc/my.cnf
<!--进入MySQL配置文件-->
....... <!--此处省略部分内容-->
log-bin=mysql-bin
<!--开启二进制日志功能-->
[root@centos01 ~]# systemctl restart mysqld <!--重启MySQL服务-->
[root@centos01 ~]# ls -l /usr/local/mysql/data/
......
<!--此处省略部分内容-->
-rw-rw---- 1 mysql mysql 27299 10月 31 00:00 mysql-bin.000001
-rw-rw---- 1 mysql mysql 1031892 10月 31 00:00 mysql-bin.000002
-rw-rw---- 1 mysql mysql
1574 10月 31 14:13 mysql-bin.000003
-rw-rw---- 1 mysql mysql 507535 11月 1 09:37 mysql-bin.000004
-rw-rw---- 1 mysql mysql 507229 11月 1 09:40 mysql-bin.000005
-rw-rw---- 1 mysql mysql
95 11月 1 09:37 mysql-bin.index
drwx------ 2 mysql mysql
4096 10月 31 00:00 performance_schema
drwxr-xr-x 2 mysql mysql
20 10月 30 23:56 test
1)增量备份
[root@centos01 ~]# mysqladmin -uroot -ppwd@123 flush-logs <!--刷新二进制日志-->
[root@centos01 ~]# ls -l /usr/local/mysql/data/
<!--查看二进制日志文件-->
...... <!--此处省略部分内容-->
-rw-rw---- 1 mysql mysql 27299 10月 31 00:00 mysql-bin.000001
-rw-rw---- 1 mysql mysql 1031892 10月 31 00:00 mysql-bin.000002
-rw-rw---- 1 mysql mysql
1574 10月 31 14:13 mysql-bin.000003
-rw-rw---- 1 mysql mysql 507535 11月 1 09:37 mysql-bin.000004
-rw-rw---- 1 mysql mysql 507272 11月 1 09:49 mysql-bin.000005
-rw-rw---- 1 mysql mysql
107 11月 1 09:49 mysql-bin.000006
-rw-rw---- 1 mysql mysql
114 11月 1 09:49 mysql-bin.index
drwx------ 2 mysql mysql
4096 10月 31 00:00 performance_schema
drwxr-xr-x 2 mysql mysql
20 10月 30 23:56 test
[root@centos01 ~]# mysql -uroot -ppwd@123 <!--登录mysql数据库-->
mysql> use benet;
<!--切换到benet数据库-->
mysql> insert into 一班学生成绩 value ('李宁','二班','20170824','92','98','105','235');
<!--录入新的数据-->
Query OK, 1 row affected (0.01 sec)
mysql> insert into 一班学生成绩 value ('陈铭','二班','20170826','111','107','96','204');
<!--录入新的数据-->
Query OK, 1 row affected (0.00 sec)
mysql> select *from 一班学生成绩; <!--查看新数据是否录入-->
+--------+--------+----------+--------+--------+--------+--------+
| 姓名 | 班级 | 学号
| 语文 | 数学 | 英语 | 理综 |
+--------+--------+----------+--------+--------+--------+--------+
| 赵六 | 一班 | 20170816 | 100 | 109 | 112 | 265 |
| 王五 | 一班 | 20170818 | 95
| 103 | 108 | 270 |
| 李四 | 一班 | 20170820 | 95
| 115 | 110 | 260 |
| 张三 | 一班 | 20170822 | 110 | 105 | 92
| 235 |
| 李宁 | 二班 | 20170824 | 92
| 98
| 105 | 235 |
| 陈铭 | 二班 | 20170826 | 111 | 107 | 96
| 204 |
+--------+--------+----------+--------+--------+--------+--------+
6 rows in set (0.00 sec)
[root@centos01 ~]# mysqladmin -uroot -ppwd@123 flush-logs
<!--刷新二进制日志-->
[root@centos01 ~]# ls -l /usr/local/mysql/data/
<!--查看二进制日志文件-->
......
<!--此处省略部分内容-->
-rw-rw---- 1 mysql mysql 27299 10月 31 00:00 mysql-bin.000001
-rw-rw---- 1 mysql mysql 1031892 10月 31 00:00 mysql-bin.000002
-rw-rw---- 1 mysql mysql
1574 10月 31 14:13 mysql-bin.000003
-rw-rw---- 1 mysql mysql 507535 11月 1 09:37 mysql-bin.000004
-rw-rw---- 1 mysql mysql 507272 11月 1 09:49 mysql-bin.000005
-rw-rw---- 1 mysql mysql
649 11月 1 09:58 mysql-bin.000006
-rw-rw---- 1 mysql mysql
107 11月 1 09:58 mysql-bin.000007
-rw-rw---- 1 mysql mysql
133 11月 1 09:58 mysql-bin.index
drwx------ 2 mysql mysql
4096 10月 31 00:00 performance_schema
drwxr-xr-x 2 mysql mysql
20 10月 30 23:56 test
[root@centos01 ~]# cp /usr/local/mysql/data/mysql-bin.000006 /root/test/
<!--复制二进制日志-->
2)模拟误操作删除一班学生成绩表
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'drop table benet.一班学生成绩;'
<!--删除一班学生成绩表-->
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'select * from benet.一班学生成绩;'
<!--查看表是否删除-->
ERROR 1146 (42S02) at line 1: Table 'benet.一班学生成绩' doesn't exist
3)恢复误删除的表
[root@centos01 ~]# mysql -uroot -ppwd@123 < ./test/benet_databases.sql
<!--恢复完全备份-->
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'select * from benet.一班学生成绩;'
<!--查看完全备份数据是否恢复-->
+--------+--------+----------+--------+--------+--------+--------+
| 姓名 | 班级 | 学号
| 语文 | 数学 | 英语 | 理综 |
+--------+--------+----------+--------+--------+--------+--------+
| 赵六 | 一班 | 20170816 | 100 | 109 | 112 | 265 |
| 王五 | 一班 | 20170818 | 95
| 103 | 108 | 270 |
| 李四 | 一班 | 20170820 | 95
| 115 | 110 | 260 |
| 张三 | 一班 | 20170822 | 110 | 105 | 92
| 235 |
+--------+--------+----------+--------+--------+--------+--------+
[root@centos01 ~]# mysqlbinlog --no-defaults /root/test/mysql-bin.000006 |mysql -u root -p
<!--恢复增量备份-->
Enter password:
<!--输入密码-->
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'select * from benet.一班学生成绩;'
<!--查看增量恢复数据是否恢复-->
+--------+--------+----------+--------+--------+--------+--------+
| 姓名 | 班级 | 学号
| 语文 | 数学 | 英语 | 理综 |
+--------+--------+----------+--------+--------+--------+--------+
| 赵六 | 一班 | 20170816 | 100 | 109 | 112 | 265 |
| 王五 | 一班 | 20170818 | 95
| 103 | 108 | 270 |
| 李四 | 一班 | 20170820 | 95
| 115 | 110 | 260 |
| 张三 | 一班 | 20170822 | 110 | 105 | 92
| 235 |
| 李宁 | 二班 | 20170824 | 92
| 98
| 105 | 235 |
| 陈铭 | 二班 | 20170826 | 111 | 107 | 96
| 204 |
+--------+--------+----------+--------+--------+--------+--------+
3、基于位置恢复
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'drop table benet.一班学生成绩;'
<!--删除一班学生成绩表-->
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'select * from benet.一班学生成绩;'
<!--查看表是否删除-->
ERROR 1146 (42S02) at line 1: Table 'benet.一班学生成绩' doesn't exist
[root@centos01 ~]# mysql -uroot -ppwd@123 < ./test/benet_databases.sql
<!--恢复完全备份-->
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'select * from benet.一班学生成绩;'
<!--查看完全备份是否恢复-->
+--------+--------+----------+--------+--------+--------+--------+
| 姓名 | 班级 | 学号
| 语文 | 数学 | 英语 | 理综 |
+--------+--------+----------+--------+--------+--------+--------+
| 赵六 | 一班 | 20170816 | 100 | 109 | 112 | 265 |
| 王五 | 一班 | 20170818 | 95
| 103 | 108 | 270 |
| 李四 | 一班 | 20170820 | 95
| 115 | 110 | 260 |
| 张三 | 一班 | 20170822 | 110 | 105 | 92
| 235 |
+--------+--------+----------+--------+--------+--------+--------+
[root@centos01 ~]# mysqlbinlog --no-defaults /root/test/mysql-bin.000006
<!--查看二进制日志文件确认恢复的位置或时间点-->
......
<!--此处省略部分内容-->
# at 176
<!--at就是我们称之为操作ID,下面紧跟的是时间标记-->
#191101 9:55:33 server id 1 end_log_pos 329 Query thread_id=9 exec_time=0 error_code=0
use benet/*!*/;
SET TIMESTAMP=1572573333/*!*/;
insert into 一班学生成绩 value ('李宁','二班','20170824','92','98','105','235')
/*!*/;
# at 329
#191101 9:55:33 server id 1 end_log_pos 356 Xid = 278
COMMIT/*!*/;
# at 356
#191101 9:55:43 server id 1 end_log_pos 425 Query thread_id=9 exec_time=0 error_code=0
SET TIMESTAMP=1572573343/*!*/;
BEGIN
/*!*/;
# at 425
<!--at就是我们称之为操作ID,下面紧跟的是时间标记-->
#191101 9:55:43 server id 1 end_log_pos 579 Query thread_id=9 exec_time=0 error_code=0
SET TIMESTAMP=1572573343/*!*/;
insert into 一班学生成绩 value ('陈铭','二班','20170826','111','107','96','204')
/*!*/;
[root@centos01 ~]# mysqlbinlog --no-defaults --stop-position='425' /root/test/mysql-bin.000006 |mysql -uroot -p
<!--基于ID恢复增量备份-->
Enter password:
<!--输入密码-->
[root@centos01 ~]# mysql -uroot -ppwd@123 -e 'select * from benet.一班学生成绩;'
<!--查看数据是否恢复-->
+--------+--------+----------+--------+--------+--------+--------+
| 姓名 | 班级 | 学号
| 语文 | 数学 | 英语 | 理综 |
+--------+--------+----------+--------+--------+--------+--------+
| 赵六 | 一班 | 20170816 | 100 | 109 | 112 | 265 |
| 王五 | 一班 | 20170818 | 95
| 103 | 108 | 270 |
| 李四 | 一班 | 20170820 | 95
| 115 | 110 | 260 |
| 张三 | 一班 | 20170822 | 110 | 105 | 92
| 235 |
| 李宁 | 二班 | 20170824 | 92
| 98
| 105 | 235 |
+--------+--------+----------+--------+--------+--------+--------+