MySQL备份与恢复详述(3)

与完全备份不同,增量备份没有重复数据,备份量不大,时间短;但其恢复麻烦,需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复。可以通过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 | +--------+--------+----------+--------+--------+--------+--------+

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/44c56de148e8139e8ed80cc90b9ebcaf.html