系统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)


可以看到所有数据都完好无损,至此,备份恢复操作都已完成。