xtrbackup只能用于备份innodb引擎的数据库,而innobackex 既可以备份innodb引擎的数据库,也可以备份myisam引擎的数据库。备份时也可分为全量备份和增量备份
1.2、安装percona-xtrabackup
1、yum install percona-xtrabackup
二、全量备份mysql
2.1、创建并授权备份用户
我们可以直接授权all权限,但是不符合安全原则
mysql -uroot -pallen
grant reload,lock tables,replication client on . to 'backupuser'@'localhost' identified by 'allen';
flush privileges;
//权限为reload,lock tables,replication client。
2.2、创建备份保存目录
1、mkdir /data/backup
2.3、备份mysql
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='allen' -S /tmp/mysql.sock /data/backup
//–defaults-file=/etc/my.cnf指定配置文件位置是为了获得datadir位置
//备份完成后,会在指定的保存目录中生成一个时间戳目录,该时间戳目录名称也是恢复时的apply-log。
备份时出现的错误:
//出现该错误时,我们需要检查是否mysqld服务没有运行,或者sock文件位置不对
三、全量备份恢复
模拟故障,此时mysql的数据损毁。而之前我们已经全量备份。
3.1、停止mysql服务
/etc/init.d/mysqld stop
ps aux |grep "mysqld"
#不允许mysql进程存在
3.2、删除mysql原有数据
mv /data/mysql /data/mysql.bak
mkdir /data/mysql
3.3、恢复mysql
首先,需要初始化(初始化的叫法不够严谨)
innobackupex --use-memory=512M --apply-log /备份的时间戳目录/
#innobackupex --use-memory=512M --apply-log /data/backup/2017-08-23_10-24-06/
// –use-memory=512M指定备份时使用的内存为512M,注意单位。默认为字节
初始化完成后,进行恢复
innobackupex --defaults-file=/etc/my.cnf --copy-back /备份的时间戳目录/
#innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2017-08-23_10-24-06/
//使用–copy-back参数恢复
设置权限
chown -R mysql:mysql /data/mysql
四、增量备份
之前我们已经进行了全量备份,经过操作,一段时间后重新全量备份的话,需要耗费的资源较多,这时我们就可以使用增量备份了。
本次实验将执行一次全量备份,两次增量备份
4.1、进行一次全量备份
增量备份是基于全量备份的,所以在增量备份操作之前我们需要先进行全量备份
innobackupex --defaults-file=/etc/my.cnf --user=backuser --password='allen' -S /tmp/mysql.sock /data/backup
//data/backup/2018-09-29_23-12-38就是我们第二次进行全量备份的时间戳目录
4.2、进行增量备份
4.2.1、进行数据库操作
#创建测试库test1_backup
mysql -uroot -pallen -e 'create database test1_backup;'
#导入数据
mysql -uroot -pallen test1_backup < /tmp/1.sql
模拟数据库数据发生改变,进行增量备份
4.2.2、进行第一次增量备份
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='allen' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/全量备份时间戳目录/
//–incremental表示增量备份,–incremental-basedir指定全量备份时间戳目录,因为本次增量备份是基于全量备份。
//本次增量备份的时间戳目录为/data/backup/2018-09-29_23-20-02
//可以看到该目录比全量备份的目录小很多
4.2.3、进行数据库操作
#创建测试库test2_backup
mysql -uroot -pallen -e 'create database test2_backup;'
#导入数据
mysql -uroot -pallen test2_backup < /tmp/1.sql
4.2.4、进行第二次增量备份
innobackupex --defaults-file=/etc/my.cnf --user=backupuser --password='allen' -S /tmp/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/第一次增量备份时间戳目录/
//–incremental-basedir指定第一次增量备份时间戳目录,因为本次增量备份是基于第一次增量备份。
//本次增量备份的时间戳目录为/data/backup/2018-09-29_23-22-33
经过以上操作,我们的增量备份就完成了
4.3、增量备份指定的INCREMENTAL-BASEDIR如何确定
在上面的实验中,我们进行增量操作时。第一次增量的incremental-basedir是全量备份时间戳目录,第二次增量的incremental-basedir是第一次增量备份的时间戳目录,这是为什么呢?
在每个备份的时间戳目录下面都有一个文件xtrabackup_checkpoints,里面记录了本次备份的检查点。
//from_lsn为起始检查点,to_lsn为终止检查点
//全量备份的from_lsn为0,to_lsn为第一次增量备份的from_lsn,而第一次增量备份的to_lsn为第二次增量备份的from_lsn。刚好组成0-1863060。
//如果上面的检查点不是依次连续的,那么在后面的增量恢复时容易出现错误。
//如果每一次都是使用全量备份时间戳目录作为incremental-basedir,那么会出现以下情况:
//第二次增量备份的to_lsn会覆盖第一次增量备份的to_lsn。
//如果是这样,那么我们在恢复时只需要初始化全量备份和第二次增量备份的时间戳目录
五、增量备份恢复
模拟故障,此时mysql的数据损毁。而之前我们已经进行全量和增量备份。
5.1、停止mysql服务
/etc/init.d/mysqld stop
ps aux |grep "mysqld"
#不允许mysql进程存在
5.2、删除mysql原有数据
mv /data/mysql /data/mysql.bak
mkdir /data/mysql
5.3、增量备份合并步骤
1、先初始化全量
innobackupex --apply-log --redo-only /data/backup/全量备份目录
2、初始化第一次增量
innobackupex --apply-log --redo-only /data/backup/全量备份目录 --incremental-dir=/data/backup/第一次增量备份目录
3、innobackupex --apply-log /data/backup/全量备份目录 --incremental-dir=/data/backup/第二次增量备份目录
4、再初始化一次全量
innobackupex --apply-log /data/backup/全量备份目录
//–redo-only参数是增量备份必须的参数,第一步和最后一步初始化都是初始化全量备份,但是最后一步不需要–redo-only参数。(因为全部数据都在最后一步的全量目录中)
//除了第一步和最后一步,其余步骤都是初始化增量备份,最后一次增量备份也不需要–redo-only参数
使用–use-memory可以设置执行时使用的内存大小
5.4、增量备份恢复
进行初始化,执行恢复时与全量备份恢复一样,都是指定全量备份目录
innobackupex --copy-back /bakdir/全量备份目录
#为了避免权限问题,导致mysql无法启动
chown -R mysql:mysql /data/mysql
所以,增量备份恢复在本次实验的步骤如下。
1、#停止mysql服务
/etc/init.d/mysqld stop
2、#模拟数据库损毁
3、mv /data/mysql /data/mysql.bak
4、mkdir /data/mysql
5、chown mysql:mysql /data/mysql
6、#初始化全局
innobackupex --apply-log --redo-only /data/backup/2017-08-24_23-05-09
7、#初始化第一次增量
innobackupex --apply-log /data/backup/2017-08-24_23-05-09 --incremental-dir=/data/backup/2017-08-24_23-21-16
8、#初始化第二次增量,这是最后一次增量,所以不需要--redo-only参数
innobackupex --apply-log /data/backup/2017-08-24_23-05-09 --incremental-dir=/data/backup/2017-08-24_23-21-16
9、#再初始化全量,不使用--redo-only
innobackupex --apply-log /data/backup/2017-08-24_23-05-09
10、#恢复mysql
innobackupex --copy-back /data/backup/2017-08-24_23-05-09
11、#设置权限,避免启动mysql出错
chown -R mysql:mysql /data/mysql
5.5、查看是否成功
启动test1_backup和test2_backup是做完全量备份才创建的测试库,说明恢复成功
ps:在进行增量备份时,每一次的–incremental-basedir都指定全量备份时间戳。那么在恢复时,只需要初始化全量备份时间戳目录和最后一次增量备份的时间戳目录 。
1、先初始化全量
innobackupex --apply-log --redo-only /data/backup/全量备份目录
2、初始化最后一次增量
innobackupex --apply-log /data/backup/全量备份目录 --incremental-dir=/data/backup/最后一次增量备份目录
3、再初始化一次全量,不需要--redo-only
innobackupex --apply-log /data/backup/全量备份目录
4、恢复
innobackupex --copy-back /data/backup/全量备份目录