阿里云 RDS for MySQL 备份文件恢复至自建数据库

 Technique  comment

为线上项目搭建测试平台,需要使用 RDS 中的部分真实数据,为了防止污染及损坏,因此将线上数据库恢复至自建数据库中供测试平台使用。

阿里云的备份策略分为两种。

不同之处在于,物理备份使用 Percona Xtrabackup 工具对物理层存储文件进行备份,是一种物理级的备份操作,因此备份速度较快,但是移植性(兼容性)较差;逻辑备份使用 MySQL 自带的 mysqldump 工具对数据库逻辑层语句进行备份,是一种对象级的备份操作。因此备份效率和恢复效率较低,但是兼容性高。

物理备份

使用阿里云内的自动物理备份文件进行恢复,现系统环境为 CentOS 7 和 MySQL 5.7 版本进行恢复操作。

下载备份

登陆 RDS管理控制台 ,选择正确的实例所在区域,例如:华北2(北京),点击想要恢复的实例,在左侧导航栏中选择备份恢复。在数据备份标签中可以看到本实例的全部备份文件信息。

找到想要恢复的时间点或者点击右上角的备份实例,选择备份方式为物理备份,然后耐心等待备份完成,待任务完成后点击下载按钮。

若恢复的机器为阿里云且在一个内网中,可以使用内网地址,否则请使用外网地址

在 Linux 中执行命令下载备份文件

# wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar.gz

小贴士:命令中的 -c 参数推荐不要省略,作用为启用断点续传模式。-O 表示将下载的文件输出至新的文件名。

目前阿里云的备份文件有 3 种格式:

小贴士:2019年2月20日后创建的 MySQL 5.6 实例,数据备份文件的格式为 xbstream 文件包(_qp.xb 后缀)。

解压备份

对于 tar 压缩包(.tar.gz 后缀)文件,使用命令:

# tar -izxvf <数据备份文件名>.tar.gz -C /home/mysql/data

对于 xbstream 压缩包(.xb.gz 后缀),使用命令:

# gzip -d -c <数据备份文件名>.xb.gz | xbstream -x -v -C /home/mysql/data

对于 xbstream 文件包(_qp.xb 后缀),使用命令:

# cat <数据备份文件名>_qp.xb | xbstream -x -v -C /home/mysql/data
# innobackupex --decompress --remove-original /home/mysql/data

检查解压的备份文件

[root@localhost ~]# ls -l /home/mysql/data
total 204842
-rw-r--r-- 1 root root         297 Dec 24 11:28 backup-my.cnf
-rw-r--r-- 1 root root 20444145145 Dec 24 22:34 ibdata1
drwxr-xr-x 1 root root        4096 Dec 24 18:20 mysql
drwxr-xr-x 1 root root        4096 Dec 24 18:20 performance_schema
drwxr-xr-x 1 root root        4096 Dec 24 18:20 test
drwxr-xr-x 1 root root        4096 Dec 24 18:20 beijinghx

恢复数据

# innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data

若返回以下类似结果则为恢复成功,数值大小与备份数据量大小相关。

InnoDB: Shutdown completed; log sequence number 1953213
150428 22:08:00  innobackupex: completed OK!

配置更改

为了防止出现跨版本问题,需要修改配置文件参数。

# vi /home/mysql/data/backup-my.cnf

注释掉以下参数

名称 操作
#innodb_fast_checksum -
#innodb_page_size -
#innodb_log_block_size -

若恢复库使用 MyISAM 引擎,请注释掉以下参数后并增加新参数。

名称 操作
#innodb_log_checksum_algorithm=strict_crc32 -
#redo_log_version=1 -
skip-grant-tables +

修改文件属组

# chown -R mysql:mysql /home/mysql/data

启动数据库

# mysqld_safe --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &

登陆数据库

# mysql -uroot -p<数据库密码>

若登陆成功无报错提示即为成功。

逻辑备份

下载备份

登陆 RDS管理控制台 ,选择正确的实例所在区域,例如:华北2(北京),点击想要恢复的实例,在左侧导航栏中选择备份恢复。在数据备份标签中可以看到本实例的全部备份文件信息。

找到想要恢复的时间点或者点击右上角的备份实例,选择备份方式为逻辑备份,然后耐心等待备份完成,待任务完成后点击下载按钮。

若恢复的机器为阿里云且在一个内网中,可以使用内网地址,否则请使用外网地址

在 Linux 中执行命令下载备份文件

# wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar

小贴士:命令中的 -c 参数推荐不要省略,作用为启用断点续传模式。-O 表示将下载的文件输出至新的文件名。

解压备份

解包

# tar xf <数据备份文件名>.tar

解压

# gzip -d <数据库压缩文件名>.gz

恢复数据

登陆数据库创建对应的空数据库

# mysql -uroot -p
Enter password: 
mysql> CREATE DATABASE <库名>;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye

导入数据

# mysql -uroot -p <创建的空数据库名> < ./<解压缩后数据库名>.sql

小贴士:请注意修改最后的文件路径为解压后的文件实际路径。

若无报错信息即为成功。

附录

参考链接

回复