使用XtraBackup恢复阿里云RDS自动备份的数据库

阿里云的RDS数据库MYSQL版使用开源软件 Percona Xtrabackup 对数据库进行备份,所以可以使用该软件将云数据库MySQL的备份文件恢复到自建数据库中,本文将介绍详细的操作步骤。

一、Percona XtraBackup介绍

XtraBackup是Percona公司的开源项目,用以实现类似Innodb官方的热备份工具InnoDB Hot Backup的功能。
XtraBackup优点:
1、 支持全备、增量备份、部分备份;
2、 支持压缩备份;
3、 备份不影响数据读写、事务等。
XtraBackup缺点:
1、 不支持脱机备份;
2、 不支持直接备份到磁带设备;
3、 不支持Cloud Back;
4、 MyISAM的备份会阻塞。

注意:XtraBackup只支持Linux平台,不支持Windows平台。

二、安装XtraBackup

系统环境: centos7.4

我们这里采用源码编译方式安装。

1、 从github上下载源码
https://github.com/percona/percona-xtrabackup
2、 安装系统依赖包

1
2
3
yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf \
bison libtool ncurses-devel libgcrypt-devel libev-devel libcurl-devel \
vim-common

3、 开始编译安装

1
2
3
cmake -DBUILD_CONFIG=xtrabackup_release -DWITH_MAN_PAGES=OFF 
make
make install

4、若cmake过程报错如下:

1
2
Cmake Error at cmake/boost.cmake:81 (MESSAGE):
You can download it with –DDOWNLOAD_BOOST=1 -DWITH_BOOST=<directory>

解决办法:

1
2
3
4
mkdir -p /usr/local/boost
cd /usr/local/boost
wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz
rm boost_1_59_0.tar.gz

然后重新cmake,增加参数:

1
2
3
cmake -DBUILD_CONFIG=xtrabackup_release -DWITH_MAN_PAGES=OFF -DWITH_BOOST=/usr/local/boost
make
make install

4、 验证安装

1
/usr/local/xtrabackup/bin/innobackupex –version

如下信息表示安装完成

1
innobackupex version 2.4.7 Linux (x86_64) (revision id: 5b42862)

三、恢复阿里云备份

1、在 RDS管理控制台数据备份 标签页,下载阿里云提供的备份文件。

2、 解压已下载的数据备份文件
在阿里云上下载解压缩工具 rds_backup_extract.sh

1
bash rds_backup_extract.sh  -f  ‘<数据备份文件名>’  -C  ‘<解压到的目录>’

注意:使用阿里云的 rds_backup_extract.sh 脚本解压备份文件时已经删除了mysql的用户信息,最后启动后可以直接登陆。

如果使用系统的tar 命令解压文件,最后user表里还是线上的用户信息,
登陆的使用需要使用跳过验证的方式启动mysql:mysqld_safe –skip-grant-tables &


3、 停止恢复机器上的mysql服务,并删除原有mysql 数据目录data下的所有文件

4、 开始恢复

1
innobackupex --defaults-file=/etc/my.cnf --copy-back /root/backdata/

如果出现报错:

1
Error: datadir must be specified.

处理办法:
my.cnf配置文件里增加:

1
datadir=/usr/local/mysql5/data

再次恢复即可。

5、 恢复完成后可以看到mysql默认的数据目录里已经有文件生成了。
执行如下命令,修改文件属主,并确定文件所属为MySQL用户。

1
chown -R mysql.mysql /usr/local/mysql5/data

6、 启动mysql

1
mysqld_safe --defaults-file=/etc/my.cnf --user=mysql --datadir=/usr/local/mysql5/data &


1
/etc/init.d/mysqld start

7、 登录数据库

1
mysql -uroot

到此恢复完成。

四、XtraBackup备份恢复msql

1、Xtrabackup常用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
--user=USER
指定备份用户,不指定的话为当前系统用户
--password=PASSWD
指定备份用户密码
--port=PORT
指定数据库端口
--defaults-group=GROUP-NAME
在多实例的时候使用
--host=HOST
指定备份的主机,可以为远程数据库服务器
--apply-log
回滚日志
--database
指定需要备份的数据库,多个数据库之间以空格分开
--defaults-file
指定MYSQL的配置文件
--copy-back
将备份数据复制回原始位置
--incremental
增量备份,后面跟要增量备份的路径
--incremental-basedir=DIRECTORY
增量备份时使用指向上一次的增量备份所在的目录
--incremental-dir=DIRECTORY
增量备份还原的时候用来合并增量备份到全量,用来指定全备路径
--redo-only
对增量备份进行合并
--rsync
加快本地文件传输,适用于NON-INNODB数据库引擎。不与--STREAM共用
--no-timestamp
生成的备份文件不以时间戳为目录.
--slave-info
该选项表示对SLAVE进行备份的时候使用,打印出MASTER的名字和BINLOGPOS,同样将这些信息以CHANGE MASTER的命令写入XTRABACKUP_SLAVE_INFO文件。可以通过基于这份备份启动一个从库。
--safe-slave-backup
该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到SHOW STATUS中的SLAVE_OPEN_TEMP_TABLES为0的时候开始备份,如果没有打开临时表,BAKCUP会立刻开始,否则SQL线程启动或者关闭知道没有打开的临时表。如果SLAVE_OPEN_TEMP_TABLES在--SAFE-SLAVE-BACKUP-TIMEOUNT(默认300秒)秒之后不为0,从库SQL线程会在备份完成的时候重启。
--defaults-file
如果使用–DEFAULTS-FILE选项,则必须在第一位
--parallel
此参数用于开启多个子进程并发备份多个数据文件(注意,一个数据文件只会有一个进程完成备份)。可以加快备份速度。但是在服务器资源不足时,谨慎使用。
--throttle
此参数用于限制备份过程中每秒的IO次数。

2、全量备份

执行命令:

1
innobackupex --no-timestamp --parallel=4 --user=root --password=xxx /root/xtrabackup/

执行完成后输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
180920 13:57:37 Finished backing up non-InnoDB tables and files
180920 13:57:37 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '1649644'
xtrabackup: Stopping log copying thread.
.180920 13:57:37 >> log scanned up to (1649644)

180920 13:57:37 Executing UNLOCK TABLES
180920 13:57:37 All tables unlocked
180920 13:57:37 Backup created in directory '/root/xtrabackup/'
180920 13:57:37 [00] Writing /root/xtrabackup/backup-my.cnf
180920 13:57:37 [00] ...done
180920 13:57:37 [00] Writing /root/xtrabackup/xtrabackup_info
180920 13:57:37 [00] ...done
xtrabackup: Transaction log of lsn (1649644) to (1649644) was copied.
180920 13:57:38 completed OK!

查看备份目录生成的文件:

1
2
3
4
5
6
7
8
9
10
11
12
[root@WR3RGqSL ~]# ll xtrabackup/
total 532520
-rw-r----- 1 root root 481 Sep 20 13:57 backup-my.cnf
drwxr-x--- 2 root root 4096 Sep 20 13:57 edu
-rw-r----- 1 root root 545259520 Sep 20 13:57 ibdata1
drwxr-x--- 2 root root 4096 Sep 20 13:57 mysql
drwxr-x--- 2 root root 4096 Sep 20 13:57 performance_schema
drwxr-x--- 2 root root 20 Sep 20 13:57 test
-rw-r----- 1 root root 113 Sep 20 13:57 xtrabackup_checkpoints
-rw-r----- 1 root root 456 Sep 20 13:57 xtrabackup_info
-rw-r----- 1 root root 2560 Sep 20 13:57 xtrabackup_logfile
drwxr-x--- 2 root root 8192 Sep 20 13:57 yimiao

创建备份后并不能直接用于恢复.需要先 prepareprepare的目的是跑一下 redo,将未提交的 rollback 回滚,跑出一个一致性的备份。

1
innobackupex --apply-log /root/xtrabackup/

查看perpare后的目录,多出了 id 开头的4个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@WR3RGqSL ~]# ll xtrabackup/
total 651308
-rw-r----- 1 root root 481 Sep 20 13:57 backup-my.cnf
drwxr-x--- 2 root root 4096 Sep 20 13:57 edu
-rw-r----- 1 root root 545259520 Sep 20 14:10 ibdata1
-rw-r----- 1 root root 50331648 Sep 20 14:10 ib_logfile0
-rw-r----- 1 root root 50331648 Sep 20 14:10 ib_logfile1
-rw-r----- 1 root root 12582912 Sep 20 14:10 ibtmp1
drwxr-x--- 2 root root 4096 Sep 20 13:57 mysql
drwxr-x--- 2 root root 4096 Sep 20 13:57 performance_schema
drwxr-x--- 2 root root 20 Sep 20 13:57 test
-rw-r--r-- 1 root root 25 Sep 20 14:10 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root 113 Sep 20 14:10 xtrabackup_checkpoints
-rw-r----- 1 root root 456 Sep 20 13:57 xtrabackup_info
-rw-r----- 1 root root 8388608 Sep 20 14:10 xtrabackup_logfile
-rw-r--r-- 1 root root 1 Sep 20 14:10 xtrabackup_master_key_id
drwxr-x--- 2 root root 8192 Sep 20 13:57 yimiao

3、全量恢复

a、将备份生成的xtrabackup打包,传输到异机mysql服务器的某一目录下并解压。
b、关闭mysql服务。
c、清空mysql的data目录文件,若binlog在data目录下,则不能删除binlog,删除data数据的原因是因为copy-back时不会覆盖原来的数据。
d、执行恢复

1
innobackupex --copy-back /root/xtrabackup

e、修改mysql数据目录权限
执行恢复完成后mysql的数据目录就生成了文件,此时需要修改目录权限

1
chown -R mysql.mysql /usr/local/mysql5/data

f、启动mysql

1
service mysqld start

4、增量备份

增量备份目录1:/root/xtrabackup_inc1
增量备份目录2:/root/xtrabackup_inc2

第一次增量备份
执行命令:

1
innobackupex --user=root --password=xxx --incremental /root/xtrabackup_inc1 --incremental-basedir=/root/xtrabackup

注意:
--incremental-basedir 第一次增量备份时指的是完全备份所在的目录。
此命令执行结束后,innobackupex 命令会在 /data/backup 目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。
另外,在执行过增量备份之后再一次进行增量备份时,其 --incremental-basedir 应该指向上一次的增量备份所在的目录。
需要注意的是,增量备份仅能应用于 InnoDBXtraDB 表,对于 MyISAM 表而言,执行增量备份时其实进行的是完全备份。

第二次增量备份
执行命令:

1
innobackupex --defaults-file=/etc/my.cnf --user=root --password=xxx --incremental /root/xtrabackup_inc2 --incremental-basedir=/root/xtrabackup_inc1/2018-09-20_14-50-20/

此处的 --incremental-basedir 目录指向的是第一次增量备份的目录,意思是针对第一次增量备份来进行此次备份。

5、增量恢复

只有一次增量备份
1、合并增量备份到全量,并处理备份集
如果需要恢复的话需要先执行如下操作,将第一次增量备份数据合并到全量备份。

1
2
3
innobackupex --apply-log --redo-only /root/xtrabackup

innobackupex --apply-log --redo-only /root/xtrabackup --incremental-dir=/root/xtrabackup_inc1/2018-09-20_14-50-20/

参数说明:

1
2
3
4
5
6
-incremental-dir=DIRECTORY 
增量备份还原的时候用来合并增量备份到全量,用来指定增量路径
--redo-only
对增量备份进行合并
--apply-log
处理未提交事物,回滚日志

2、执行恢复
删除数据文件以及停掉mysql,参考全量恢复

1
nnobackupex --copy-back /root/xtrabackup

3、修改数据文件权限,启动mysql。

两次增量备份
1、合并增量备份到全量,并处理备份集
如果需要恢复的话需要先执行如下操作,将第一次增量备份数据合并到全量备份。

1
2
3
innobackupex --apply-log --redo-only /root/xtrabackup

innobackupex --apply-log --redo-only /root/xtrabackup --incremental-dir=/root/xtrabackup_inc1/2018-09-20_14-50-20/

如果存在多次增量备份的话,就多次执行如下命令。
此处执行针对的是第二次增量备份,将第二次增量备份数据合并到全量备份:

1
innobackupex --apply-log --redo-only /root/xtrabackup --incremental-dir=/root/xtrabackup_inc2/2018-09-20_15-17-46/

2、执行恢复
删除数据文件以及停掉mysql,参考全量恢复

1
nnobackupex --copy-back /root/xtrabackup

3、修改数据文件权限,启动mysql。