xtrbackup只能用于备份innodb引擎的数据库,而innobackex 既可以备份innodb引擎的数据库,也可以备份myisam引擎的数据库。备份时也可分为全量备份和增量备份

注:mysql只能5.5以上哦

一、安装innobackex

官网扩展源地址

https://www.percona.com/redir/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

自己的扩展源地址

http://d.ahaoyw.com/myrepo/centos/extension/percona-release-0.1-3.noarch.rpm

安装步骤 


1.1、安装yum拓展源percona-release

# rpm -ivh  http://d.ahaoyw.com/myrepo/centos/extension/percona-release-0.1-3.noarch.rpm

1.2、安装percona-xtrabackup

# yum install percona-xtrabackup -y

二、全量备份mysql

2.1、创建并授权备份用户

我们可以直接授权all权限,但是不符合安全原则

mysql> grant reload,lock tables,replication client on *.* to 'backupuser'@'localhost'  identified  by  'backupuser';
Query OK, 0 rows affected (0.00 sec)mysql> flush  privileges;Query OK, 0 rows affected (0.00 sec)
权限为reload,lock tables,replication client。

2.2、创建备份保存目录

# mkdir  /data/backup

2.3、备份mysql

# innobackupex   --defaults-file=/etc/my.cnf  --user=backupuser  --password='backupuser'    -S /tmp/mysql.sock  /data/backup180517 17:20:23 Executing UNLOCK TABLES
180517 17:20:23 All tables unlocked
180517 17:20:23 Backup created in directory '/data/backup/2018-05-17_17-20-21/'MySQL binlog position: filename 'mysql-bin.000001', position '366'180517 17:20:23 [00] Writing backup-my.cnf
180517 17:20:23 [00]        ...done
180517 17:20:23 [00] Writing xtrabackup_info
180517 17:20:23 [00]        ...done
xtrabackup: Transaction log of lsn (1595675) to (1595675) was copied.
180517 17:20:23 completed OK!

结尾出现 completed OK!则表示备份成功

–defaults-file=/etc/my.cnf指定配置文件位置是为了获得datadir位置,当然可以设置为--datadir=数据库存放路径

备份完成后,会在指定的保存目录中生成一个时间戳目录,该时间戳目录名称也是恢复时的apply-log。

blob.png

三、全量备份恢复

模拟故障,此时mysql的数据损毁。而之前我们已经全量备份

3.1、停止mysql服务

# /etc/init.d/mysqld  stop

3.2、删除mysql原有数据

# mv /data/mysql  /data/mysql.bak

# mkdir /data/mysql

3.3、恢复mysql

首先,需要初始化

innobackupex  --use-memory=512M  --apply-log  /备份的时间戳目录/

■–use-memory=512M指定备份时使用的内存为512M,注意单位。默认为字节

# innobackupex  --use-memory=512M  --apply-log /data/backup/2018-05-17_12-57-18/180517 
20:48:06 completed OK!

初始化完成后,进行恢复

innobackupex  --defaults-file=/etc/my.cnf  --copy-back  /备份的时间戳目录/

# innobackupex  --defaults-file=/etc/my.cnf --datadir=/data/mysql --copy-back /data/backup/2018-05-17_17-20-21/180517 
20:49:20 completed OK!

使用–copy-back参数恢复,如果my.cnf里面没有定义的话就要指定数据库存放路径

设置数据库存放目录权限

# chown   -R  mysql:mysql  /data/mysql

四、增量备份

之前我们已经进行了全量备份,经过操作,一段时间后重新全量备份的话,需要耗费的资源较多,这时我们就可以使用增量备份了。

本次实验将执行一次全量备份,两次增量备份

注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备

4.1、进行一次全量备份

增量备份是基于全量备份的,所以在增量备份操作之前我们需要先进行全量备份

#innobackupex   --defaults-file=/etc/my.cnf  --datadir=/data/mysql --user=backupuser --password='backupuser'    -S /tmp/mysql.sock  /data/backup180517 
20:52:48 completed OK!

我们全量备份的时间戳目录/data/backup/2018-05-17_12-57-18/

4.2、进行增量备份

4.2.1、进行数据库操作

#创建测试库test1_backupmysql -uroot -p  -e 'create database test1_backup;'
#导入数据mysql -uroot -p test1_backup  < /root/mysql.sql
模拟数据库数据发生改变,进行增量备份

4.2.2、进行第一次增量备份

innobackupex  --defaults-file=/etc/my.cnf   --datadir=/data/mysql  --user=backupuser --password='backupuser'  -S /tmp/mysql.sock  --incremental  /data/backup  --incremental-basedir=/data/backup/全量备份时间戳目录/

# innobackupex  --defaults-file=/etc/my.cnf   --datadir=/data/mysql  --user=backupuser --password='backupuser'  -S /tmp/mysql.sock  --incremental  /data/backup  --incremental-basedir=/data/backup/2018-05-17_12-57-18/180517 
13:02:11 completed OK!

–incremental表示增量备份,–incremental-basedir指定全量备份时间戳目录,因为本次增量备份是基于全量备份

本次增量备份的时间戳目录为/data/backup/2018-05-17_13-02-09/

blob.png

4.2.3、进行数据库操作

#创建测试库test2_backupmysql -uroot -p  -e 'create database test2_backup;'
#导入数据mysql -uroot -p test2_backup  <  /root/mysql.sql

4.2.4、进行第二次增量备份

innobackupex  --defaults-file=/etc/my.cnf   --datadir=/data/mysql  --user=backupuser --password='backupuser'  -S /tmp/mysql.sock  --incremental  /data/backup  --incremental-basedir=/data/backup/第一次增量备份时间戳目录/

# innobackupex  --defaults-file=/etc/my.cnf   --datadir=/data/mysql  --user=backupuser --password='backupuser'  -S /tmp/mysql.sock  --incremental  /data/backup  --incremental-basedir=/data/backup/2018-05-17_13-02-09/180517 13:09:10 completed OK!

本次增量备份的时间戳目录为/data/backup/2018-05-17_13-09-07/

经过以上操作,我们的增量备份就完成了

4.3、增量备份指定的INCREMENTAL-BASEDIR如何确定

在上面的实验中,我们进行增量操作时。第一次增量的incremental-basedir是全量备份时间戳目录,第二次增量的incremental-basedir是第一次增量备份的时间戳目录,这是为什么呢?

在每个备份的时间戳目录下面都有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:

blob.png

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

5.2、删除mysql原有数据

# mv /data/mysql  /data/mysql.bak

# mkdir /data/mysql

5.3、增量备份合并步骤

1、先初始化全量

innobackupex --apply-log --redo-only  /data/backup/全量备份目录

# innobackupex --apply-log --redo-only  /data/backup/2018-05-17_12-57-18180517 13:21:19 completed OK!

2、初始化第一次增量

innobackupex --apply-log --redo-only  /data/backup/全量备份目录 --incremental-dir=/data/backup/第一次增量备份目录

# innobackupex --apply-log --redo-only  /data/backup/2018-05-17_12-57-18 --incremental-dir=/data/backup/2018-05-17_13-02-09180517 13:21:42 completed OK!

3、innobackupex --apply-log   /data/backup/全量备份目录 --incremental-dir=/data/backup/第二次增量备份目录

#innobackupex --apply-log   /data/backup/2018-05-17_12-57-18 --incremental-dir=/data/backup/2018-05-17_13-09-07180517 13:21:55 completed OK!

4、再初始化一次全量

innobackupex --apply-log   /data/backup/2018-05-17_12-57-18
180517 13:22:14 completed OK!

–redo-only参数是增量备份必须的参数,第一步和最后一步初始化都是初始化全量备份,但是最后一步不需要–redo-only参数。(因为全部数据都在最后一步的全量目录中)

除了第一步和最后一步,其余步骤都是初始化增量备份,最后一次增量备份也不需要–redo-only参数

使用–use-memory可以设置执行时使用的内存大小

5.4、增量备份恢复

进行初始化,执行恢复时与全量备份恢复一样,都是指定全量备份目录

innobackupex --copy-back  --datadir=/data/mysql /data/backup/全量备份目录

#innobackupex --copy-back  --datadir=/data/mysql  /data/backup/2018-05-17_12-57-18180517 13:24:36 completed OK!

#为了避免权限问题,导致mysql无法启动,需要设置下权限

# chown -R mysql:mysql  /data/mysql

增量备份恢复在本次实验的步骤如下

#停止mysql服务/etc/init.d/mysqld stop
#模拟数据库损毁mv /data/mysql  /data/mysql.bakmkdir /data/mysql
chown  mysql:mysql   /data/mysql
#初始化全局innobackupex --apply-log --redo-only  /data/backup/2018-05-17_12-57-18
#初始化第一次增量innobackupex --apply-log   /data/backup/2017-08-24_23-05-09  --incremental-dir=/data/backup/2018-05-17_13-02-09
#初始化第二次增量,这是最后一次增量,所以不需要--redo-only参数
innobackupex --apply-log   /data/backup/2017-08-24_23-05-09  --incremental-dir=/data/backup/2018-05-17_13-09-07
#再初始化全量,不使用--redo-onlyinnobackupex --apply-log   /data/backup/2018-05-17_12-57-18
#恢复mysqlinnobackupex --copy-back   /data/backup/2018-05-17_12-57-18
#设置权限,避免启动mysql出错chown -R mysql:mysql  /data/mysql

5.5、查看是否成功

blob.png

启动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/全量备份目录