MySQL自带的mysqldump工具可以实现将RDS MySQL逻辑备份文件恢复到自建数据库。本文介绍详细的逻辑备份恢复数据库操作步骤。
关于如何选择数据恢复方案,请参见数据恢复方案概览。
通过物理备份文件恢复到自建数据库请参见RDS MySQL物理备份文件恢复到自建数据库。
关于云数据库MySQL版如何备份数据,请参见备份RDS数据。
前提条件
RDS MySQL实例需满足以下条件:
大版本:8.0、5.7、5.6、5.5
系列:高可用系列
存储类型:本地SSD盘
说明您可以前往实例基本信息页面查看以上信息。
已有逻辑备份。具体操作,请参见自动备份。
演示环境
本地MySQL数据库安装在64位的Linux系统中,且与云数据库MySQL版的版本相同。本文使用CentOS 7的操作系统以及MySQL5.7版本为例进行演示。
逻辑备份恢复操作步骤
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏中,单击备份恢复。
在 列表中,找到要下载的逻辑备份,并单击其右侧的实例备份下载。
在实例备份文件下载窗口,单击复制外网地址最右侧的,获取数据备份文件外网下载地址。
重要外网下载备份在超过免费额度的情况下会额外收取外网流量费用。更多信息,请参见费用说明。
如果是相同VPC内的ECS和RDS实例,可以使用内网地址,速度更快更稳定。
登录自建数据库所在Linux系统,执行如下命令下载逻辑备份文件。
wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar
说明-c:启用断点续传模式。
-O:将下载的结果保存为指定的文件。
执行如下命令解压逻辑备份文件,包括系统默认的数据库压缩文件以及自行创建的数据库压缩文件。
tar xvf <自定义文件名>.tar -C /tmp
示例如下:
tar xvf hins123456.tar -C /tmp
说明如果解压过程中出现类似
This does not look like a tar archive
的错误提示,请确认您下载的是否为RDS逻辑备份文件。解压缩需要恢复的目标数据库压缩文件(
.sql.gz
结尾),命令如下:gzip -d /tmp/目标数据库压缩文件名称
示例如下:
gzip -d /tmp/testdata_datafull_202012101615_160xxxxxx.sql.gz
说明解压缩后的.sql文件用于在第10步进行导入。
登录数据库创建对应的空数据库。命令如下:
说明下文中的user用户需要具备能够执行.sql文件中所有SQL的权限。
mysql -u user -p<数据库密码> create database <空数据库名>; exit
使用如下命令将.sql文件导入对应数据库。
mysql -u user -p <空数据库名> < /tmp/解压缩的数据库文件
示例如下:
mysql -u user -p testdb < /tmp/testdata_datafull_202012101615_160xxxxxx.sql
说明执行整行命令后会提示您输入密码,输入后按回车即可。
如果提示Can't find master key from keyring错误,请确认是否满足本文开头的前提条件。
登录数据库后查看表,若已经显示有了数据,说明已经迁移成功。
常见问题
为什么实例没有逻辑备份?
系统发起的备份默认为物理备份,如果需要逻辑备份,需要手动发起备份。详情请参见自动备份。
为什么下载逻辑备份时,显示的备份集恢复时间点为0?
RDS MySQL的物理备份结合日志备份可以实现按时间点恢复功能,所以会显示具体的备份集恢复时间点(时间戳),而逻辑备份不是用来按时间点恢复的,所以显示为0。
报错
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
如何解决?这是由于GTID导致的问题,您可以参考如下几种方案:
开启GTID后重新执行恢复操作。
不开启GTID,可以将导入文件(
.sql
结尾)中的GTID_PURGED内容都注释掉,然后重新执行恢复操作。在没有主从同步复制的情况下,可以登录数据库后执行
reset master
命令,然后重新执行恢复操作。
报错
ERROR 3546 (HY000) at line 26: @@GLOBAL.GTID_PURGED cannot be changed: the added gtid set must not overlap with @@GLOBAL.GTID_EXECUTED
如何解决?带有GTID信息的导入文件(
.sql
结尾), 要求当前数据库中无其他GTID信息,请登录数据库后执行reset master
进行重置,然后重新执行恢复操作。为什么恢复的数据只在主库中,从库的数据没有自动同步?
您可以检查下导入文件(
.sql
结尾)中是否有SESSION.SQL_LOG_BIN= 0
,该设置会导致主库的操作不会同步到从库中。