本文介绍如何将RDS MySQL的物理备份文件恢复到自建数据库。
- 关于如何选择数据恢复方案,请参见数据恢复方案概览。
- 本文恢复方案用于恢复备份文件中的全部数据。如仅需恢复部分库表,请参见RDS MySQL逻辑备份文件恢复到自建数据库。
- 由于软件限制,目前仅支持将云数据库MySQL的备份文件恢复到安装在Linux系统中的自建MySQL数据库中。Windows系统下的备份恢复请参见使用mysqldump迁移MySQL数据。
前提条件
- RDS MySQL实例需满足以下条件:
- 大版本:8.0、5.7、5.6、5.5
- 系列:高可用版
- 存储类型:本地SSD盘
说明- 您可以前往实例基本信息页面查看以上信息。
- 仅如上版本的实例支持下载物理备份。对于基础版实例,请参见基础版实例的备份怎么恢复或迁移。
- RDS实例中的表未通过TDE加密。
说明
- 实例中如果存在加密过的表,会导致恢复过程出错,请先在下载备份文件前,对已加密的表执行解密操作。
- 您可在RDS控制台目标实例 页面查看TDE开启状况。
- RAM账号需要具备下载备份文件的权限。如需为RAM账号授权,请参见添加下载备份文件权限给只读子账号。
- MySQL自建库版本与RDS MySQL版本必须相同(例如都是5.7)。
说明 请确保该MySQL服务上没有运行其他业务。
- 自建库所在服务器中必须根据不同MySQL实例安装对应版本的Percona XtraBackup。
- 对于MySQL 5.7、5.6或5.5实例:下载及安装Percona XtraBackup 2.4,具体请参见Percona XtraBackup 2.4。
- 对于MySQL 8.0实例:下载及安装Percona XtraBackup 8.0,具体请参见Percona XtraBackup 8.0。
- 自建库所在服务器中必须已安装解压工具qpress。安装方法:
## 下载可执行文件的tar包 wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar" ## 解压下载的tar包,取出可执行文件 tar xvf qpress-11-linux-x64.tar ## 设置qpress文件的执行权限 chmod 775 qpress ## 拷贝qpress到/usr/bin中 cp qpress /usr/bin
一、下载备份
二、解压和恢复备份
- 在Linux服务器上,创建一个目录(本文示例目录为/home/mysql/data)用于存放解压后的文件。
mkdir /home/mysql/data
- 解压压缩包。根据压缩包的后缀选择解压命令。
说明
- 请先参考前提条件,在自建库所在服务器中安装Percona XtraBackup和qpress后,再执行以下解压命令。若不安装,后续执行如下命令将失败。
- 执行以下解压命令时,请将test1和/home/mysql/data替换为实际的文件名和路径。
表 1. 解压压缩包命令 备份文件类型 解压命令 tar 压缩包 (.tar.gz 后缀) tar -izxvf test1.tar.gz -C /home/mysql/data
xbstream 压缩包 (.xb.gz 后缀) gzip -d -c test1.xb.gz | xbstream -x -v -C /home/mysql/data
xbstream 文件包(_qp.xb 后缀) ## 步骤一:解包 cat test1_qp.xb | xbstream -x -v -C /home/mysql/data ## 步骤二:解压 ### 对于MySQL 5.6/5.7 innobackupex --decompress --remove-original /home/mysql/data ### 对于MySQL 8.0 xtrabackup --decompress --remove-original --target-dir=/home/mysql/data
xbstream qpress压缩包(_xb.qp后缀) qpress -do test1_xb.qp | xbstream -x -v -C /home/mysql/data
- 执行如下命令,查询解压后生成的文件。
ls -l /home/mysql/data
系统会返回如下结果,其中蓝色字体为备份文件包含的数据库。 - 执行如下命令,恢复解压好的备份文件。
## MySQL 5.6/5.7 innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data ## MySQL 8.0 ## xtrabackup工具备份前的准备操作 xtrabackup --prepare --target-dir=/home/mysql/data ## 执行备份还原命令 xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/home/mysql/data
表 2. 参数含义 参数 含义 --defaults-file
通过传入文件设置MySQL默认选项。 备份集解压后会有backup-my.cnf,一般传入该文件。
--apply-log
应用此目录下的事务日志文件 xtrabackup_logfile
到备份集解压后的路径中。--prepare
xtrabackup工具备份前的准备命令,与后续备份恢复有关。 --datadir
源数据库数据所在路径。与MySQL服务的位置有关。 说明 该路径与步骤3中启动MySQL进程命令中--datadir的路径一致。--target-dir
备份集解压后的路径。 恢复时请耐心等待,若系统返回如下类似结果,则说明备份文件已成功恢复到自建数据库:常见恢复报错:- 若系统返回
xtrabackup: Unknown error 3613
,请将Percona XtraBackup更新到最新版本后再次尝试。 - 若系统返回如下报错,可以用
rm -rf /var/lib/mysql
命令清空文件夹内文件,然后用chown -R mysql:mysql /var/lib/mysql
修改权限。 - 若系统返回如下报错,请参见前提条件中的第2项说明。
说明 请确保您的Percona XtraBackup版本正确:- MySQL 5.7、5.6以及之前的版本需要安装 Percona XtraBackup 2.4,安装指导请参见官方文档Percona XtraBackup 2.4。
- MySQL 8.0版本需要安装 Percona XtraBackup 8.0,安装指导请参见官方文档Percona XtraBackup 8.0。
- 若系统返回
三、启动MySQL
- 为避免版本问题,您需要修改backup-my.cnf文件,具体操作步骤如下。
- 执行如下命令,以文本方式编辑backup-my.cnf文件。
vi /home/mysql/data/backup-my.cnf
- 添加如下参数:
lower_case_table_names=1
- 注释掉如下自建数据库不支持的参数,若不注释会导致报错:
#innodb_log_checksum_algorithm #innodb_fast_checksum #innodb_log_block_size #innodb_doublewrite_file #innodb_encrypt_algorithm #rds_encrypt_data #redo_log_version #master_key_id #server_uuid
说明 如果自建数据库使用的是MyISAM引擎,由于无法兼容MySQL的InnoDB引擎,则需要多注释掉如下参数并增加skip-grant-tables参数:#innodb_log_checksum_algorithm=strict_crc32 #redo_log_version=1 skip-grant-tables
- 按Esc键,然后输入
:wq
并回车进行保存。
- 执行如下命令,以文本方式编辑backup-my.cnf文件。
- 执行如下命令,修改文件属性,并确定文件所属为MySQL用户。
chown -R mysql:mysql /home/mysql/data
- 执行如下命令,启动MySQL进程。
mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/var/lib/mysql &
常见错误
如果Ubuntu操作系统报如下错误,是Ubuntu自带安全程序AppArmor导致的,请使用
apt install -y apparmor-utils
和aa-complain /usr/sbin/mysqld
命令修改AppArmor设置。 - 执行如下命令,登录MySQL数据库以验证进程启动成功。
mysql -u<源RDS MySQL实例账号> -p<对应密码>
说明- 若执行以上命令出现
Access denied for user 'XXX'
提示,请检查RDS MySQL实例账号或密码是否正确。 - 该登录命令仅为了验证恢复成功。若仅需查看某些表数据,则登录账号及密码无需为高权限,仅确认有查询对应表的权限即可。
- 若忘记账号或密码,请在步骤3执行启动MySQL进程命令时,传入
--skip-grant-tables
参数,进程启动后会忽略权限检查,从而此步骤无需账户密码就可登录数据库。您可在登录成功后重新再修改账号和密码。 - 您也可以通过外部第三方工具或客户端、命令行连接数据库。
- 若执行以上命令出现
- (可选步骤)您也可以执行
show databases;
命令查看数据库,确认是否恢复成功。
常见问题
- Q:如何恢复指定时间段的数据到自建库?
A:可以在控制台下载指定时间段的日志备份数据恢复到自建库。如何下载日志备份,请参见下载备份。
- Q:为什么阿里云物理备份还原到自建MySQL上以后,数据的时间字段和本地时间不一致?怎样才能保持时间一致?
A:如果自建库的时区与RDS实例的时区不一致,则需要修改自建库的time_zone参数,使其与RDS实例的time_zone参数一致。如果RDS实例的time_zone参数值为system,则需查看RDS实例所在的地域,并将自建库的time_zone设置为该地域的时区。
- Q:恢复完成后,无法启动自建库或在使用自建库的过程中遇到
error 1105 Unknown error
错误怎么办?A:执行如下SQL语句转换数据库存储引擎即可:
use mysql; alter table proc engine=myisam; alter table event engine=myisam; alter table func engine=myisam;
- Q:除了下载备份文件恢复之外,还有其他方法可以将实例的数据快速恢复到自建数据库吗?
A:您可以使用DTS将RDS MySQL迁移至自建MySQL。
- Q:为什么下载数据备份文件会报错?
A:使用
wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar.gz
命令下载时请用2个英文单引号(')将下载地址包含起来,便于程序识别具体的地址,防止出错。 - Q:已下载的备份文件发现存在TDE加密的数据,导致恢复数据出错,有什么解决办法?
A:该情况下无法基于已下载的加密的备份文件进行恢复。RDS实例中如果存在加密过的表,会导致恢复过程出错。请参见本文前提条件先对已加密的表执行解密操作,然后重新根据本文操作指引进行恢复。
- Q:下载的备份文件解压缩报错怎么办?
A:请根据如下步骤检查或处理报错:
- 确认您下载的文件是否为物理备份文件。
- 请确认压缩文件保存的名称后缀是否正确(使用URL中包含的文件名后缀 .tar.gz 、.xb.gz 或 _qp.xb)。
- 针对不同格式的压缩文件,请使用正确的解压命令。详情请参见二、解压和恢复备份中的第2步,请注意需将解压命令中
test1
和/home/mysql/data
替换为实际的文件名和路径。
解压压缩包时常见报错及解决方法如下:- 出现报错:备份文件类型为xbstream文件包(_qp.xb 后缀),执行cat解包命令出现
can't change to dir to xx( errorcode:no such file or directory)
报错。解决方法:报错原因可能是命令中文件名或路径错误引起,请将解压命令中
test1
和/home/mysql/data
替换为实际的文件名和路径。 - 出现报错:备份文件类型为xbstream文件包(_qp.xb 后缀),执行解压命令出现innobackupex未找到。
解决方法:请参考本文前提条件确认您自建库所在服务器中是否已安装Percona XtraBackup。
- 出现报错:执行解压命令出现
sh: qpress: command not found
报错。解决方法:请参考本文前提条件确认您自建库所在服务器中是否已安装解压工具qpress。
- Q:基础版实例的备份怎么恢复或迁移呢?
A:基础版实例仅支持快照备份,您可以使用以下方法:
- 使用mysqldump迁移MySQL数据
- 用DTS将数据从RDS导出到本地
- Q:下载的备份能恢复到另一个RDS MySQL实例上吗?
A:暂不支持此操作。建议您使用DTS迁移RDS实例数据到另一个RDS实例上。