将备份还原到 Amazon RDS for MySQL 数据库实例
Amazon RDS 支持使用备份文件导入 MySQL 数据库。您可以创建数据库的备份,将备份文件存储在 Amazon S3 上,然后将该备份文件还原到运行 MySQL 的新 Amazon RDS 数据库实例上。Amazon RDS 支持在所有 AWS 区域中从 Amazon S3 导入备份文件。
本节中介绍的方案将还原本地数据库的备份。只要数据库可供访问,您就可以将此技术用于其它位置(例如 Amazon EC2 或其它云服务)中的数据库。
下图显示了支持的方案。

如果在创建、复制和还原备份文件时,您的本地数据库可能处于脱机状态,则我们建议您使用备份文件将数据库导入到 Amazon RDS。如果数据库无法脱机,则可以使用以下方法之一:
-
二进制日志:首先,将备份文件从 Amazon S3 导入到 Amazon RDS,如本主题所述。然后,使用二进制日志(binlog)复制来更新数据库。有关更多信息,请参阅 配置与外部源实例之间的二进制日志文件位置复制。
-
AWS Database Migration Service:使用 AWS Database Migration Service 将数据库迁移到 Amazon RDS。有关更多信息,请参阅什么是 AWS Database Migration Service?
将备份文件从 Amazon S3 导入到 Amazon RDS 的设置概述
要将备份文件从 Amazon S3 导入到 Amazon RDS,您需要以下组件:
用于存储备份文件的 Amazon S3 存储桶。
如果您已有一个 Amazon S3 存储桶,则可以使用该存储桶。如果没有 Amazon S3 存储桶,请创建一个新的存储桶。有关更多信息,请参阅创建存储桶。
Percona XtraBackup 创建的本地数据库备份。
有关更多信息,请参阅 创建数据库备份。
-
AWS Identity and Access Management(IAM)角色,支持 Amazon RDS 访问 S3 存储桶。
如果您已有 IAM 角色,则可以使用该角色并向其附加信任和权限策略。有关更多信息,请参阅 手动创建 IAM 角色。
如果您没有 IAM 角色,则有两个选项:
-
您可以手动创建新的 IAM 角色。有关更多信息,请参阅 手动创建 IAM 角色。
-
您可以选择让 Amazon RDS 为您创建新的 IAM 角色。如果您希望 Amazon RDS 为您创建新的 IAM 角色,请按照将数据从 Amazon S3 导入到新的 MySQL 数据库实例一节中使用 AWS Management Console的过程进行操作。
-
创建数据库备份
可以使用 Percona XtraBackup 软件创建备份。建议您使用最新的 Percona XtraBackup 版本。您可以通过 Percona 网站上的 Software Downloads
警告
创建数据库备份时,XtraBackup 可能会将凭证保存在 xtrabackup_info 文件中。务必确认 xtrabackup_info 文件中的 tool_command
设置不包含任何敏感信息。
您使用的 Percona XtraBackup 版本取决于您要备份的 MySQL 版本。
-
MySQL 8.4:使用 Percona XtraBackup 版本 8.4。
-
MySQL 8.0:使用 Percona XtraBackup 版本 8.0。
注意
Percona XtraBackup 8.0.12 及更高版本支持迁移所有 MySQL 8.0 版本。如果要迁移到 RDS for MySQL 8.0.32 或更高版本,则必须使用 Percona XtraBackup 8.0.12 或更高版本。
-
MySQL 5.7:使用 Percona XtraBackup 版本 2.4。
您可以使用 Percona XtraBackup 来创建 MySQL 数据库文件的完整备份。或者,如果已使用 Percona XtraBackup 备份 MySQL 数据库文件,您可以上传现有的完整和增量备份目录和文件。
有关使用 Percona XtraBackup 备份数据库的更多信息,请参阅 Percona 网站上的 Percona XtraBackup - Documentation
使用 Percona XtraBackup 创建完整备份
要为 Amazon RDS 可从 Amazon S3 中还原的 MySQL 数据库文件创建完整备份,请使用 Percona XtraBackup 实用程序 (xtrabackup
)。
例如,以下命令创建 MySQL 数据库备份,并将这些文件存储在 /on-premises/s3-restore/backup
文件夹中。
xtrabackup --backup --user=
myuser
--password=password
--target-dir=/on-premises/s3-restore/backup
如果您想将备份压缩到单个文件中(如果需要,您可以稍后将其拆分为多个文件),可以根据 MySQL 版本将备份保存为以下格式之一:
Gzip (.gz):适用于 MySQL 5.7 及更低版本
tar (.tar):适用于 MySQL 5.7 及更低版本
Percona xbstream (.xbstream):适用于所有 MySQL 版本
注意
Percona XtraBackup 8.0 及更高版本仅支持使用 Percona xbstream 进行压缩。
MySQL 5.7 及更低版本
以下命令为您的 MySQL 数据库创建一个拆分成多个 Gzip 文件的备份。将值替换为您自己的信息。
xtrabackup --backup --user=
my_user
--password=password
--stream=tar \ --target-dir=/on-premises/s3-restore/backup
| gzip - | split -d --bytes=500MB \ -/on-premises/s3-restore/backup/backup
.tar.gz
MySQL 5.7 及更低版本
以下命令为您的 MySQL 数据库创建一个拆分成多个 tar 文件的备份。将值替换为您自己的信息。
xtrabackup --backup --user=
my_user
--password=password
--stream=tar \ --target-dir=/on-premises/s3-restore/backup
| split -d --bytes=500MB \ -/on-premises/s3-restore/backup/backup
.tar
所有 MySQL 版本
以下命令为您的 MySQL 数据库创建一个拆分成多个 xbstream 文件的备份。将值替换为您自己的信息。
xtrabackup --backup --user=
myuser
--password=password
--stream=xbstream \ --target-dir=/on-premises/s3-restore/backup
| split -d --bytes=500MB \ -/on-premises/s3-restore/backup/backup
.xbstream
注意
如果您看到以下错误,则可能是由于命令中混用了文件格式所致:
ERROR:/bin/tar: This does not look like a tar archive
通过 Percona XtraBackup 使用增量备份
如果您已使用 Percona XtraBackup 对 MySQL 数据库文件进行完整备份和增量备份,则无需创建完整备份和将备份文件上传到 Amazon S3。相反,为了节省时间,请将现有的备份目录和文件复制到 Amazon S3 存储桶中。有关使用 Percona XtraBackup 创建增量备份的更多信息,请参阅 Percona 网站上的 Create an incremental backup
在将现有的完整备份和增量备份文件复制到 Amazon S3 存储桶时,您必须以递归方式复制基目录的内容。这些内容同时包括完整备份以及所有增量备份目录和文件。此副本必须在 Amazon S3 存储桶中保留目录结构。Amazon RDS 将循环访问所有文件和目录。Amazon RDS 使用每个增量备份中包含的 xtrabackup-checkpoints
文件来标识基本目录,并按日志序列号(LSN)范围对增量备份进行排序。
Percona XtraBackup 的备份注意事项
Amazon RDS 根据文件名使用您的备份文件。根据文件格式使用相应的文件扩展名来命名备份文件。例如,使用 .xbstream
来表示使用 Percona xbstream 格式存储的文件。
Amazon RDS 按照字母顺序以及自然数字顺序使用您的备份文件。为确保按正确的顺序写入和命名备份文件,请在发出 xtrabackup
命令时使用 split
选项。
Amazon RDS 不支持使用 Percona XtraBackup 创建的部分备份。在备份数据库的源文件时,不能使用以下选项创建部分备份:
-
--tables
-
--tables-exclude
-
--tables-file
-
--databases
-
--databases-exclude
-
--databases-file
手动创建 IAM 角色
如果您没有 IAM 角色,则可以手动创建一个新的角色。但是,如果您使用 AWS Management Console还原数据库,我们建议您选择让 Amazon RDS 为您创建这个新的 IAM 角色。要让 Amazon RDS 为您创建此角色,请按照将数据从 Amazon S3 导入到新的 MySQL 数据库实例一节中的过程进行操作。
要手动创建新的 IAM 角色以从 Amazon S3 导入数据库,请创建一个角色,以便将权限从 Amazon RDS 委托给 Amazon S3 存储桶。在创建 IAM 角色时,可附加信任和权限策略。要从 Amazon S3 中导入备份文件,请使用类似于以下示例的信任和权限策略。有关创建角色的更多信息,请参阅创建将权限委派给 AWS 服务的角色。
信任和权限策略要求您提供 Amazon Resource Name (ARN)。有关 ARN 格式的更多信息,请参阅 Amazon Resource Name (ARN) 和 AWS 服务命名空间。
例 用于从 Amazon S3 导入的信任策略
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": "rds.amazonaws.com"}, "Action": "sts:AssumeRole" }] }
例 用于从 Amazon S3 导入的权限策略 – IAM 用户权限
在以下示例中,将 iam_user_id
替换为您自己的值。
{ "Version":"2012-10-17", "Statement": [ { "Sid":"AllowS3AccessRole", "Effect":"Allow", "Action":"iam:PassRole", "Resource":"arn:aws:iam::
iam_user_id
:role/S3Access" } ] }
例 用于从 Amazon S3 导入的权限策略 – 角色权限
在以下示例中,将 amzn-s3-demo-bucket
和 prefix
替换为您自己的值。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket", "s3:GetBucketLocation" ], "Resource": "arn:aws:s3:::
amzn-s3-demo-bucket
" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::amzn-s3-demo-bucket
/prefix
*" }, { // If your bucket is encrypted, include the following permission. This permission allows decryption of your AWS KMS key. "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": [ "arn:aws:kms:region
:customer_id
:key/key_id
*" ] } ] }
注意
如果包含文件名前缀,请在前缀后面包含星号 (*)。如果您不想指定前缀,请仅指定星号。
将数据从 Amazon S3 导入到新的 MySQL 数据库实例
您可以使用AWS Management Console、AWS CLI 或 RDS API 将数据从 Amazon S3 导入到新的 MySQL 数据库实例。
将数据从 Amazon S3 导入到新的 MySQL 数据库实例
-
登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/
。 -
在 Amazon RDS 控制台的右上角,选择要在其中创建数据库实例的 AWS 区域。选择与包含数据库备份的 Amazon S3 桶相同的 AWS 区域。
-
在导航窗格中,选择数据库。
-
选择从 S3 还原。
此时将显示通过从 S3 还原创建数据库页面。
-
在 S3 源下:
-
选择包含备份的 S3 桶。
-
(可选)对于 S3 前缀,输入存储在 Amazon S3 存储桶中的文件的文件路径前缀。
如果未指定前缀,则 Amazon RDS 使用 S3 存储桶的根文件夹中的所有文件和文件夹创建数据库实例。如果的确指定了前缀,则 Amazon RDS 使用 S3 存储桶中文件路径以指定前缀开头的文件和文件夹来创建数据库实例。
例如,您将备份文件存储在 S3 上名为 backups 的子文件夹中,并且具有多组备份文件,每个文件位于其自己的目录(gzip_backup1、gzip_backup2,依此类推)中。在这种情况下,要从 gzip_backup1 文件夹中的文件进行还原,请指定前缀 backups/gzip_backup1。
-
-
在引擎选项下:
-
对于引擎类型,选择 MySQL。
-
对于源引擎版本,请选择源数据库的 MySQL 主版本。
-
对于引擎版本,选择您所在AWS 区域中 MySQL 主要版本的默认次要版本。
在AWS Management Console中,仅默认的次要版本可用。完成导入后,您可以升级数据库实例。
-
-
对于 IAM 角色,创建或选择具有所需信任策略和权限策略的 IAM 角色,即允许 Amazon RDS 访问您的 Amazon S3 存储桶。执行以下操作之一:
(推荐)选择创建新角色,然后输入 IAM 角色名称。选择此选项后,Amazon RDS 会自动为您创建具有信任策略和权限策略的角色。
选择现有 IAM 角色。确保此角色符合手动创建 IAM 角色中的所有条件。
-
指定数据库实例信息。有关每项设置的信息,请参阅 数据库实例的设置。
注意
确保为新的数据库实例分配足够的存储空间,以便成功进行还原操作。
要支持未来自动增长,请在其他存储配置下选择启用存储自动扩缩。
-
根据需要选择其他设置。
-
选择创建数据库。
要使用 AWS CLI 将数据从 Amazon S3 导入新的 MySQL 数据库实例,请使用以下选项运行 restore-db-instance-from-s3 命令。有关每项设置的信息,请参阅 数据库实例的设置。
注意
确保为新的数据库实例分配足够的存储空间,以便成功进行还原操作。
要启用存储自动扩缩并支持未来自动增长,请使用 --max-allocated-storage
选项。
--allocated-storage
--db-instance-identifier
--db-instance-class
--engine
--master-username
--manage-master-user-password
--s3-bucket-name
--s3-ingestion-role-arn
--s3-prefix
--source-engine
--source-engine-version
例
对于 Linux、macOS 或 Unix:
aws rds restore-db-instance-from-s3 \ --allocated-storage
250
\ --db-instance-identifiermy_identifier
\ --db-instance-classdb.m5.large
\ --enginemysql
\ --master-usernameadmin
\ --manage-master-user-password \ --s3-bucket-nameamzn-s3-demo-bucket
\ --s3-ingestion-role-arnarn:aws:iam::account-number:role/rolename
\ --s3-prefixbucket_prefix
\ --source-enginemy_sql
\ --source-engine-version8.0.32
\ --max-allocated-storage1000
对于 Windows:
aws rds restore-db-instance-from-s3 ^ --allocated-storage
250
^ --db-instance-identifiermy_identifier
^ --db-instance-classdb.m5.large
^ --enginemysql
^ --master-usernameadmin
^ --manage-master-user-password ^ --s3-bucket-nameamzn-s3-demo-bucket
^ --s3-ingestion-role-arnarn:aws:iam::account-number:role/rolename
^ --s3-prefixbucket_prefix
^ --source-enginemysql
^ --source-engine-version8.0.32
^ --max-allocated-storage1000
要使用 Amazon RDS API 将数据从 Amazon S3 导入新的 MySQL 数据库实例,请调用 RestoreDBInstanceFromS3 操作。
将备份文件从 Amazon S3 导入到 Amazon RDS 的限制和注意事项
以下限制和注意事项适用于将备份文件从 Amazon S3 导入到 RDS for MySQL 数据库实例:
-
您只能将数据迁移到新的数据库实例,而不能迁移到现有的数据库实例。
-
您必须使用 Percona XtraBackup 将数据备份到 Amazon S3。有关更多信息,请参阅 创建数据库备份。
-
Amazon S3 存储桶和 RDS for MySQL 数据库实例必须在同一个 AWS 区域中。
-
您无法从以下来源进行还原:
-
到 Amazon S3 的数据库实例快照导出。您也无法将数据从数据库实例快照导出迁移到 Amazon S3 存储桶。
-
加密的源数据库。但是,您可以加密正在迁移的数据。您也可以在迁移过程中不加密数据。
-
MySQL 5.5 或 5.6 数据库。
-
-
RDS for MySQL 不支持将 Percona Server for MySQL 用作源数据库,因为它可能在
mysql schema
中包含compression_dictionary*
表。 -
RDS for MySQL 不支持主要版本或次要版本的反向迁移。例如,您无法从 MySQL 版本 8.0 迁移到 RDS for MySQL 5.7,也无法从 MySQL 版本 8.0.32 迁移到 RDS for MySQL 版本 8.0.26。
-
Amazon RDS 不支持从 Amazon S3 中的 db.t2.micro 数据库实例类上进行导入。不过,您可以还原到不同的数据库实例类,然后更改该数据库实例类。有关实例类的更多信息,请参阅数据库实例类的硬件规格。
-
Amazon S3 将上传到 Amazon S3 存储桶的文件大小限制为 5 TB。如果备份文件超过 5 TB,则必须将备份文件拆分为较小的文件。
-
Amazon RDS 将上传到 Amazon S3 存储桶的文件数限制为一百万个。如果数据库的备份数据 (包括所有完整和增量备份) 超过 100 万个文件,请使用 Gzip (.gz)、tar (.tar.gz) 或 Percona xbstream (.xbstream) 文件将完整和增量备份文件存储在 Amazon S3 存储桶中。Percona XtraBackup 8.0 仅支持使用 Percona xbstream 进行压缩。
-
要为每个数据库实例提供管理服务,Amazon RDS 会在创建数据库实例时创建
rdsadmin
用户。由于rdsamin
是 Amazon RDS 中的保留用户,因此以下限制适用:-
Amazon RDS 不导入以
'rdsadmin'@'localhost'
作为定义者的函数、过程、视图、事件和触发器。有关更多信息,请参阅以 'rdsamin'@'localhost' 作为定义者的存储对象和主用户账户权限。 -
创建数据库实例时,Amazon RDS 会创建一个具有最大受支持权限的主用户。从备份还原时,Amazon RDS 会自动移除分配给正在导入的用户的任何不受支持的权限。
要识别可能受此影响的用户,请参阅具有不支持的权限的用户账户。有关 RDS for MySQL 中支持的权限的更多信息,请参阅 RDS for MySQL 的基于角色的权限模型。
-
-
Amazon RDS 不会迁移
mysql
架构中用户创建的表。 -
您必须仅通过一个使用默认数据文件名
ibdata1:12M:autoextend
的数据文件来配置innodb_data_file_path
参数。可以使用此方法迁移具有两个数据文件或具有不同名称的数据文件的数据库。以下示例是 Amazon RDS 不支持的文件名:
-
innodb_data_file_path=ibdata1:50M
-
ibdata2:50M:autoextend
-
innodb_data_file_path=ibdata01:50M:autoextend
-
-
您无法从在默认 MySQL 数据目录外部定义表的源数据库中迁移。
-
使用此方法的未压缩备份支持的最大大小限制为 64 TiB。对于压缩的备份,考虑到解压缩空间的需求,此限制会降低。在此类情况下,支持的最大备份大小为
64 TiB - compressed backup size
。有关 RDS for MySQL 支持的最大数据库大小的信息,请参阅通用型 SSD 存储和预置 IOPS SSD 存储。
-
Amazon RDS 不支持导入 MySQL 以及其它外部组件和插件。
-
Amazon RDS 不会从您的数据库中还原所有内容。我们建议您从源 MySQL 系统数据库保存数据库架构以及以下项目的值,然后将这些内容添加到已还原的 RDS for MySQL 数据库实例(在创建该实例后):
-
用户账户
-
函数
-
存储过程
-
时区信息。从 RDS for MySQL 数据库实例的本地操作系统中加载时区信息。有关更多信息,请参阅 MySQL 数据库实例的本地时区。
-
以 'rdsamin'@'localhost' 作为定义者的存储对象
Amazon RDS 不导入以 'rdsadmin'@'localhost'
作为定义者的函数、过程、视图、事件和触发器。
您可以在源 MySQL 数据库上使用以下 SQL 脚本来列出具有不受支持的定义程序的存储对象。
-- This SQL query lists routines with `rdsadmin`@`localhost` as the definer. SELECT ROUTINE_SCHEMA, ROUTINE_NAME FROM information_schema.routines WHERE definer = 'rdsadmin@localhost'; -- This SQL query lists triggers with `rdsadmin`@`localhost` as the definer. SELECT TRIGGER_SCHEMA, TRIGGER_NAME, DEFINER FROM information_schema.triggers WHERE DEFINER = 'rdsadmin@localhost'; -- This SQL query lists events with `rdsadmin`@`localhost` as the definer. SELECT EVENT_SCHEMA, EVENT_NAME FROM information_schema.events WHERE DEFINER = 'rdsadmin@localhost'; -- This SQL query lists views with `rdsadmin`@`localhost` as the definer. SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.views WHERE DEFINER = 'rdsadmin@localhost';
具有不支持的权限的用户账户
如果用户账户的权限不受 RDS for MySQL 支持,则在导入这些账户时将不包含这些不受支持的权限。有关支持的权限列表,请参阅RDS for MySQL 的基于角色的权限模型。
可以在源数据库上运行以下 SQL 查询,以列出具有不受支持的权限的用户账户。
SELECT user, host FROM mysql.user WHERE Shutdown_priv = 'y' OR File_priv = 'y' OR Super_priv = 'y' OR Create_tablespace_priv = 'y';