MySQL学习笔记22

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)

第二步:开启二进制日志,重启服务,然后进行全库备份。

MySQL学习笔记22_第1张图片

service mysql_3306 restart命令重启mysql。 

再确认下其中的二进制日志:

MySQL学习笔记22_第2张图片

在做增量备份的时候刷新下二进制日志。

这个场景就是刷二进制日志的一个作用。

[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数据库进行了删除。

故障开始了。

第五步:动员运维工程师开始进行数据恢复,马上把最新的二进制文件进行备份。

MySQL学习笔记22_第3张图片

把最新的二进制日志进行备份。一会儿我们要用到这个二进制日志。这个文件的大小也要关注下,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位置。

MySQL学习笔记22_第4张图片

MySQL学习笔记22_第5张图片

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)

你可能感兴趣的:(MySQL,mysql)