RDS MySQL逻辑备份文件恢复到自建数据库

MySQL自带的mysqldump工具可以实现将RDS MySQL逻辑备份文件恢复到自建数据库。本文介绍详细的逻辑备份恢复数据库操作步骤。

说明

前提条件

  • RDS MySQL实例需满足以下条件:

    • 大版本:8.0、5.7、5.6、5.5

    • 系列:高可用系列

    • 存储类型:本地SSD盘

    说明

    您可以前往实例基本信息页面查看以上信息。

  • 已有逻辑备份。具体操作,请参见自动备份

演示环境

本地MySQL数据库安装在64位的Linux系统中,且与云数据库MySQL版的版本相同。本文使用CentOS 7的操作系统以及MySQL5.7版本为例进行演示。

逻辑备份恢复操作步骤

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏中,单击备份恢复

  3. 基础备份列表 > 数据备份列表中,找到要下载的逻辑备份,并单击其右侧的实例备份下载

    说明
    • 逻辑备份需要您手动发起备份操作,具体操作,请参见手动备份

    • 如果没有实例备份下载按钮,请确认您的实例版本是否支持下载备份

  4. 实例备份文件下载窗口,单击复制外网地址最右侧的复制图标,获取数据备份文件外网下载地址。

    重要
    • 外网下载备份在超过免费额度的情况下会额外收取外网流量费用。更多信息,请参见费用说明

    • 如果是相同VPC内的ECS和RDS实例,可以使用内网地址,速度更快更稳定。

  5. 登录自建数据库所在Linux系统,执行如下命令下载逻辑备份文件。

    wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar
    说明
    • -c:启用断点续传模式。

    • -O:将下载的结果保存为指定的文件。

  6. 执行如下命令解压逻辑备份文件,包括系统默认的数据库压缩文件以及自行创建的数据库压缩文件。

    tar xvf <自定义文件名>.tar -C /tmp

    示例如下:

    tar xvf hins123456.tar -C /tmp

    解压缩

    说明

    如果解压过程中出现类似This does not look like a tar archive的错误提示,请确认您下载的是否为RDS逻辑备份文件。

  7. 解压缩需要恢复的目标数据库压缩文件(.sql.gz结尾),命令如下:

    gzip -d /tmp/目标数据库压缩文件名称

    示例如下:

    gzip -d /tmp/testdata_datafull_202012101615_160xxxxxx.sql.gz
    说明

    解压缩后的.sql文件用于在第10步进行导入。

  8. 登录数据库创建对应的空数据库。命令如下:

    说明

    下文中的user用户需要具备能够执行.sql文件中所有SQL的权限。

    mysql -u user -p<数据库密码>
    create database <空数据库名>;
    exit
  9. 使用如下命令将.sql文件导入对应数据库。

    mysql -u user -p <空数据库名> < /tmp/解压缩的数据库文件

    示例如下:

    mysql -u user -p testdb < /tmp/testdata_datafull_202012101615_160xxxxxx.sql
    说明
    • 执行整行命令后会提示您输入密码,输入后按回车即可。

    • 如果提示Can't find master key from keyring错误,请确认是否满足本文开头的前提条件。

  10. 登录数据库后查看表,若已经显示有了数据,说明已经迁移成功。

常见问题

  • 为什么实例没有逻辑备份?

    系统发起的备份默认为物理备份,如果需要逻辑备份,需要手动发起备份。详情请参见自动备份

  • 为什么下载逻辑备份时,显示的备份集恢复时间点为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进行重置,然后重新执行恢复操作。

    restmaster

  • 为什么恢复的数据只在主库中,从库的数据没有自动同步?

    您可以检查下导入文件(.sql结尾)中是否有SESSION.SQL_LOG_BIN= 0,该设置会导致主库的操作不会同步到从库中。

    SQL_LOG_BIN