系统RHEL6.6
mysql-5.5.28
前言:基础原理及先前准备
先简述一下做增量备份的基础,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。InnoDB的每一个数据块都有一个日志序列号,InnoDB存储引擎会在自己内部记录当前的每一个数据块的日志序列号,如果检测到这个块上数据改变,号码就会自动加一。所以可以根据这个号码做增量备份。
注意:XtraBackup支持对InnoDB做增量备份,对MYISAM不支持,支持对MYISAM做完全备份。
备份目录为/backup
在备份的数据文件目录中,有个xtrabackup_checkpoints文件,里面主要描述了备份类型(完全备份或增量备份)、状态(是否是prepared状态)和LSN日志序列号范围信息。如下:
[root@localhost 2015-03-23_19-38-07]# cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1743274
last_lsn = 1743274
compact = 0
这里有一个名为school的数据库,并有一个student表,具体信息如下:
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
+--------------------+
4 rows in set (0.01 sec)
mysql> SELECT * FROM student;
+----+-------------------+---------------+
| ID | Name | Course |
+----+-------------------+---------------+
| 1 | xiaoming | English |
| 2 | xiaohong | Kuihuabaodian |
| 3 | www.mingxiao.info | |
+----+-------------------+---------------+
3 rows in set (0.00 sec)
步骤一:完全备份
为student表插入数据,为增量备份做基础。
mysql> INSERT INTO student (Name) VALUES ('XiaoHei1'),('XiaoHei2');
开始完全备份,备份数据目录在/backup,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。
[root@localhost /]# innobackupex --user=root /backup
步骤二:增量备份
在这里为了表述清楚我们做两次增量备份。
为student表插入数据,为增量备份做基础。
mysql> INSERT INTO student (Name) VALUES ('XiaoHei3'),('XiaoHei4');
第一次增量备份,--incremental-basedir=指的是完全备份所在的目录。
[root@localhost /]# innobackupex --incremental /backup --incremental-basedir=/backup/2015-03-23_23-19-24/
mysql> INSERT INTO student (Name) VALUES ('XiaoHei5'),('XiaoHei6');
第二次增量备份,--incremental-basedir=指的是第上一次增量备份所在的目录,这里指第一次,以此类推。
[root@localhost /]# innobackupex --incremental /backup --incremental-basedir=/backup/2015-03-23_23-21-49/
步骤三:准备完全备份和增量备份
增量备份完成,下面要准备完全备份和增量备份。
--redo-only后面是完全备份所在目录。
--incremental-dir指增量备份所在目录,若有多个,按时间先后执行多次。
[root@localhost /]# innobackupex --apply-log --redo-only /backup/2015-03-23_23-19-24/
[root@localhost /]# innobackupex --apply-log --redo-only /backup/2015-03-23_23-19-24/ --incremental-dir=/backup/2015-03-23_23-21-49/ --incremental-dir指向第一次增量备份目录
[root@localhost /]# innobackupex --apply-log --redo-only /backup/2015-03-23_23-19-24/ --incremental-dir=/backup/2015-03-23_23-22-44/ --incremental-dir指向第二次增量备份目录
步骤四:模拟mysqld故障
[root@localhost /]# service mysqld stop
Shutting down MySQL. SUCCESS!
[root@localhost /]# rm -rf /mydata/data/*
步骤五:恢复数据
[root@localhost data]# innobackupex --copy-back /backup/2015-03-23_23-19-24/
[root@localhost data]# ll
total 18472
-rw-r--r--. 1 root root 18874368 Mar 23 23:28 ibdata1
drwxr-xr-x. 2 root root 4096 Mar 23 23:28 mysql
drwxr-xr-x. 2 root root 4096 Mar 23 23:28 performance_schema
drwxr-xr-x. 2 root root 4096 Mar 23 23:28 school
-rw-r--r--. 1 root root 593 Mar 23 23:28 xtrabackup_info
注意:恢复数据后,在重启mysqld前,需要修改数据目录权限,默认是root用户,root组,需要改为mysql用户,mysql组。
[root@localhost data]# chown -R mysql.mysql ./*
service mysqld start
mysql> use school;
Database changed
mysql> select * from student;
+----+-------------------+---------------+
| ID | Name | Course |
+----+-------------------+---------------+
| 1 | xiaoming | English |
| 2 | xiaohong | Kuihuabaodian |
| 3 | www.mingxiao.info | |
| 16 | XiaoHei1 | |
| 17 | XiaoHei2 | |
| 18 | XiaoHei3 | |
| 19 | XiaoHei4 | |
| 20 | XiaoHei5 | |
| 21 | XiaoHei6 | |
+----+-------------------+---------------+
9 rows in set (0.00 sec)
可以看到所有数据都完好无损,至此,备份恢复操作都已完成。