mysqldump+binlog实现增量备份:
1、什么是增量备份的核心思路?
1):先有全量备份;
2):继续有增删改数据;
3):再次需要备份的时候,不需要进行全量备份,只需要备份binlog日志文件即可。(因为binlog日志记录了增删改操作的所有SQL语句。)
增量备份的实验步骤:
第一步:准备数据;
第二步:开启二进制日志,然后做全库备份;
第三步:继续对数据库进行增删改操作;
第四步:突然发生了硬件故障,数据库丢失;
第五步:恢复全量备份导出的数据(数据不完整,可能只有90%)
第六步:备份二进制日志,根据其信息(导入剩余的10%的数据)恢复数据。
增量备份的具体实现:
第一步:准备数据:
use db_itheima;
create table tb_student (
id int not null auto_increment,
name varchar(20),
age tinyint unsigned default 0,
gender enum('male','female'),
subject enum('ui','java','yunwei','python'),
primary key(id)
)engine=innodb default charset=utf8;
insert into tb_student values (null,'刘备',33,'male','java');
insert into tb_student values (null,'关羽',32,'male','yunwei');
insert into tb_student values (null,'张飞',30,'male','python');
insert into tb_student values (null,'貂蝉',18,'female','ui');
insert into tb_student values (null,'大乔',18,'female','ui');
mysql> select * from tb_student;
+----+--------+------+--------+---------+
| id | name | age | gender | subject |
+----+--------+------+--------+---------+
| 1 | 刘备 | 33 | male | java |
| 2 | 关羽 | 32 | male | yunwei |
| 3 | 张飞 | 30 | male | python |
| 4 | 貂蝉 | 18 | female | ui |
| 5 | 大乔 | 18 | female | ui |
+----+--------+------+--------+---------+
5 rows in set (0.00 sec)
第二步:开启二进制日志,重启服务,然后进行全库备份。
service mysql_3306 restart命令重启mysql。
再确认下其中的二进制日志:
在做增量备份的时候刷新下二进制日志。
这个场景就是刷二进制日志的一个作用。
[root@mysql-server data]# rm -rf /tmp/sqlbak/*
[root@mysql-server data]# mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > /tmp/sqlbak/all.sql -p
Enter password:
[root@mysql-server data]# ll /tmp/sqlbak
total 872
-rw-r--r-- 1 root root 890067 Sep 29 07:04 all.sql
第三步:继续对数据库进行增删改操作:
mysql> use db_itheima;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into tb_student values(null, '小乔', 16, 'female', 'ui');
Query OK, 1 row affected (0.01 sec)
mysql>
mysql> delete from tb_student where id=3;
Query OK, 1 row affected (0.00 sec)
mysql> select * from tb_student;
+----+--------+------+--------+---------+
| id | name | age | gender | subject |
+----+--------+------+--------+---------+
| 1 | 刘备 | 33 | male | java |
| 2 | 关羽 | 32 | male | yunwei |
| 4 | 貂蝉 | 18 | female | ui |
| 5 | 大乔 | 18 | female | ui |
| 6 | 小乔 | 16 | female | ui |
+----+--------+------+--------+---------+
5 rows in set (0.00 sec)
第四步:突然发现了硬件故障,数据库丢失了。
[root@mysql-server data]# mysql -e "drop database db_itheima;" -p
Enter password:
把db_itheima数据库进行了删除。
故障开始了。
第五步:动员运维工程师开始进行数据恢复,马上把最新的二进制文件进行备份。
把最新的二进制日志进行备份。一会儿我们要用到这个二进制日志。这个文件的大小也要关注下,915B,有内容的。
[root@mysql-server data]# cp binlog.000005 /tmp/sqlbak/
[root@mysql-server data]# cd /tmp/sqlbak
[root@mysql-server sqlbak]# ll
total 876
-rw-r--r-- 1 root root 890067 Sep 29 07:04 all.sql
-rw-r----- 1 root root 915 Sep 29 07:14 binlog.000005
现在已经保护了现场。
实际生产环境中,建议将所有的二进制日志进行备份拷贝。
第六步: 先进行一个全库的恢复。
[root@mysql-server sqlbak]# mysql < /tmp/sqlbak/all.sql -p
Enter password:
mysql> select * from tb_student;
+----+--------+------+--------+---------+
| id | name | age | gender | subject |
+----+--------+------+--------+---------+
| 1 | 刘备 | 33 | male | java |
| 2 | 关羽 | 32 | male | yunwei |
| 3 | 张飞 | 30 | male | python |
| 4 | 貂蝉 | 18 | female | ui |
| 5 | 大乔 | 18 | female | ui |
+----+--------+------+--------+---------+
5 rows in set (0.00 sec)
也可以使用在mysql数据库中使用source命令进行数据库的导入操作。
这个时候,我们看下,是全库备份点的数据。其完整度并不高,其中没有小乔,张飞应该被删除掉的,张飞还在。那这个应该是二进制日志中的内容。
第七步:通过binlog二进制日志的增量备份还原数据到100%。(关键)
学会读二进制日志文件,必须通过专业的工具mysqlbinlog
[root@mysql-server ~]# mysqlbinlog /tmp/sqlbak/binlog.000005
重点找事故的临界点。如drop database这个临界点。确认at位置。
at 805这个临界点,正好就是故障点。我们可以恢复到740这个位置。
[root@mysql-server ~]# mysqlbinlog --start-position=4 --stop-position=740 /tmp/sqlbak/binlog.000005 |mysql -p
Enter password:
[root@mysql-server ~]#
最后,我们再做下检查。
mysql> select * from tb_student;
+----+--------+------+--------+---------+
| id | name | age | gender | subject |
+----+--------+------+--------+---------+
| 1 | 刘备 | 33 | male | java |
| 2 | 关羽 | 32 | male | yunwei |
| 4 | 貂蝉 | 18 | female | ui |
| 5 | 大乔 | 18 | female | ui |
| 6 | 小乔 | 16 | female | ui |
+----+--------+------+--------+---------+
5 rows in set (0.00 sec)