将 Amazon RDS for MySQL 和 MariaDB 数据库导出到 Amazon S3,

将 Amazon RDS for MySQL 和 MariaDB 数据库导出到 Amazon S3,


将 Amazon RDS 的 MySQL 和 MariaDB 数据库导出至 Amazon S3 的自定义 API 方案

关键要点

数据库管理员的常见任务是备份生产环境中的数据库,并将其迁移到开发、质量保证、预发布等较低环境。本文介绍了如何利用定制的 API 结合 AWS 的多项服务如 Lambda、ECS 和 S3来实现 MySQL 和 MariaDB 的数据库备份自动化。操作团队需保持与现有本地系统一致的备份流程,并简化学习曲线。无需依赖基础设施即代码 (IaC) 来恢复快照,且操作团队可以通过 API 进行简单的备份请求。

在进行数据中心迁移的过程中,我们与客户合作,遇到了一套明确的数据库备份策略要求。此客户在将 Microsoft SQL Server 数据库迁移至云上的 Amazon Aurora MySQL、Amazon RDS for MySQL 和 RDS for MariaDB 的过程中,主要希望在迁移过程中对其运营团队的工作流造成最小影响。

他们的运营团队需要将生产环境中的数据库备份到较低环境中进行恢复,同时保持一致的备份策略,以适应新的云技术。经过深入分析,我们确定了以下需求:

保留现有的 Aurora MySQL 终端名称,以避免恢复过程中需要重新部署应用。具备将生产数据库备份刷新至开发和测试环境的能力。避免使用基础设施即代码IaC恢复来自不同 AWS 账户的快照。对于仍在学习 Aurora MySQL 的团队,保持较小的学习曲线。实现 API 友好的方法,减少连接到 Amazon EC2 实例或类似服务来发起备份请求的需要。使用 Amazon S3 和预签名 URL 使运营团队能方便地移动备份。

解决方案概述

此文将展示数据库管理员或其他进入自定义 API 的用户如何发出 MySQL 和 MariaDB 的备份请求。我们利用基础设施即代码 (IaC) 与 AWS 云开发工具包 (AWS CDK) 简化了这一部署过程。

Amazon API Gateway 提供了一个可调用以启动备份进程的 API,而 Amazon Elastic Container Service 则用于执行备份过程。备份数据存储在 Amazon S3 中,使用 Amazon Simple Notification Service 发送关于完成进程的通知。

以下图表展示了用户与解决方案的高层交互以及组件之间的运作方式。

整个过程包括以下步骤:

用户使用 bash 或 Python 调用 API Gateway 端点,发送主机名和待备份的数据库。API Gateway 接收主机名和数据库名称,并将其发送至 AWS Lambda。Lambda 函数提取主机名和数据库名称,并运行 Amazon ECS 任务命令,将这些值传递为环境变量。ECS 任务启动并读取环境变量,以获取主机名和数据库名称。任务利用 AWS Secrets Manager 获取相关数据库凭证,并从 Amazon RDS API 获取所需的 TCP 端口。通过 mysqldump 连接到指定的 MySQL 或 MariaDB 实例并开始备份。如果在 MariaDB 环境中使用该解决方案,建议从 mysqldump 切换至 mariadbdump。在运行过程中生成备份。在运行时,备份会被压缩并流到 Amazon S3,同时为该文件生成新的 Amazon S3 预签名 URL。备份文件被直接上传到 Amazon S3 标准非常规访问存储类别,这是存储备份的推荐类别。在 cdk 部署步骤中指定的 SNS 主题下,用户的电子邮件将收到通知。

前提条件

要跟进此步骤,您需要具备以下前提条件:

一个活动的 AWS 账户,且在其中至少部署有以下数据库平台中的一种:Amazon Aurora MySQL 兼容版Amazon RDS for MySQLAmazon RDS for MariaDB已安装并配置的 AWS 命令行接口 (AWS CLI)。在本地机器上设置好的 AWS CDK v2。可以参考 AWS CDK 入门 进行操作。此项目使用 TypeScript 作为编程语言,因此您还需在笔记本电脑上设置 TypeScript。本地安装 Docker,用于首次构建容器。下载至本地计算机的 GitHub 仓库,其中提供了创建 AWS 身份与访问管理 (IAM) 角色的模板。

限制与范围外内容

此文未包括数据库恢复过程的演示。

此外,此解决方案最好用于与用于备份基础架构的 AWS 区域相同的数据库。如果您有不同区域的数据库,可以单独在每个区域内部署备份解决方案。

创建数据库凭证

作为前提条件,您需要创建一个具有相应权限的数据库用户来执行架构转储。在将解决方案部署到您的 AWS 账户之前,您需要在相应环境中创建相同用户。

要在您选择的数据库引擎中创建新数据库用户,请运行以下脚本:

sql 将 UserNameToBeDefined 和 PasswordToBeDefined 更换为您选择的值CREATE USER UserNameToBeDefined@ IDENTIFIED BY PasswordToBeDefinedGRANT SELECT SHOW DATABASES LOCK TABLES EVENT ON TO UserNameToBeDefined@

将 Amazon RDS for MySQL 和 MariaDB 数据库导出到 Amazon S3,

在 Secrets Manager 中存储数据库凭证

创建数据库凭证后,您需要将其存储在您的 AWS 账户中。我们在此文中使用 Secrets Manager,帮助您安全管理和检索凭证。在运行时,ECS 任务将检索这些密钥以执行数据库备份。

要创建密钥,请完成以下步骤:

在 Secrets Manager 控制台中,选择导航窗格中的 Secrets。选择 Store a new secret。对于 Secret type,输入 RDS 数据库的凭证。对于 User name,输入 NameOfUser。对于 Password,输入 PasswordOfUser。对于 Database,选择与此凭证对应的数据库实例。选择 Next。对于 Secret name,输入 backup/EndpointIdentifierName/user。对于 Aurora MySQL 实例,EndpointIdentifierName 应该是写入器或读取器终端。选择 Next。再次选择 Next。选择 Store。

您的密钥现已显示在 Secrets 页面上。

在 AWS 账户中部署解决方案

完成先决条件并设置 IAM 用户和 AWS CDK 后,您可以将解决方案部署到 AWS 账户中。

从 GitHub 仓库 下载代码并解压缩 zip 文件。导航至您下载的项目文件夹,并在此处打开终端会话。

然后,确保您连接到将要部署项目的正确 AWS 账户。

运行以下代码:

bash cdk bootstrap aws//ACCOUNTNUMBER/REGION

在初始引导成功完成后,可以将解决方案部署到 AWS 账户。在运行 cdk deploy 之前,需要指定几个重要值:

EXISTINGVPCID 指定要在其上部署解决方案的 VPC,建议选择数据库子网所在的同一 VPC 进行部署。BackupEmailReceivers 接收 Amazon SNS 发送备份完成邮件的电子邮件地址。要指定多个邮件,请用逗号分隔。例如:someemail@companycom someotheremail@companycom。若后期需要添加额外的邮件地址,请务必在后续运行的 cdk deploy 中添加新的邮件地址。ECSTaskCPU 指定运行备份任务的容器所用的 vCPU 数量。关于值的理解,请参考 任务 CPU 和内存。本文件中使用 2048,代表 2 个 vCPU。

ECSTaskMemory 指定运行备份任务的容器所用的内存MB。了解具体值请参考 任务 CPU 和内存。本文件中使用 8192,代表 8 GB 内存。

部署解决方案。

Windows 用户使用以下代码:

bash set EXISTINGVPCID=ltTheIdOfYourVPCgt cdk deploy parameters BackupEmailReceivers=someemail@companycom parameters ECSTaskCPU=2048 parameters ECSTaskMemory=8192

Ubuntu 和 MacOs 用户使用以下代码:

bash export EXISTINGVPCID=ltTheIdOfYourVPCgt cdk deploy parameters BackupEmailReceivers=someemail@companycom parameters ECSTaskCPU=2048 parameters ECSTaskMemory=8192

在此步骤中,您提供一个用于发送备份通知邮件的邮箱地址。

该解决方案部署大约需要 3045 分钟。完成后,您应看到以下输出。

部署时间可能因不同情况而异。

记下以下信息,以供后续步骤使用: exportMySqlToS3SecurityGroupIdexportMySqlToS3apiURL

授予 Amazon ECS 访问数据库安全组的权限

在您部署解决方案后,您需授权数据库安全组的权限,以允许 ECS 任务访问您的数据库并执行备份。前面截图中您已获取到了 exportMyqlToS3SecurityGroupId。

完成以下步骤:

在 Amazon RDS 控制台中,选择导航窗格中的 Databases。选择任意 RDS for MySQL 或 MariaDB 实例。在 VPC security groups 部分,选择您的安全组。

如果实例有多个安全组附加,您可以选择其中任意一个。

在 Inbound rules 部分,选择 Edit inbound rules。选择 Add rule。对于 Type,选择 MYSQL/Aurora;这将自动填充所需的 TCP 端口。如果您的实例使用自定义 TCP 端口,请选择 Custom TCP。对于 Source,输入从堆栈输出中检索到的安全组 ID。选择 Save rules。

获取 API Gateway 信息

要执行数据库备份任务,您需要 API URL。可以从之前显示的 cdk 部署输出中检索,或者使用 API Gateway 控制台。以下步骤展示如何通过 API Gateway 控制台获取信息。

在 API Gateway 控制台中,选择导航窗格中的 APIs。选择 API exporttos3restapi。选择 Stages。在阶段列表中,选择 prod。记下将用于后续步骤的调用者 URL 以调用备份任务。

我们还需要 API 密钥,以便安全地调用备份 API。

在 Secrets Manager 控制台中,找到秘密 backup/exportToS3/apiKey。在 Secret value 部分,选择 Retrieve secret value。记下 API 密钥。

免费国际服加速器

执行备份

现在,您可以使用 API URL 和 API 密钥执行备份任务。

此 API 已在私有子网中部署。这意味着无法从外部 VPC 访问。如果您的企业网络能访问部署在私有子网中的资源,或者您可以通过在同一 VPC 中部署的 堡垒主机 进行调用。

以下步骤描述了如何使用 VPC 中的堡垒主机执行备份任务:

在堡垒主机中打开终端。执行备份:

如果您使用 curl,运行以下脚本:

bash curl X GET H xapikey ApiKey H ContentType application/json https//ApiGatewayIdexecuteapieuwest1amazonawscom/prod/backuphostname=FullRDSEndpointampdbName=DatabaseName

这将产生以下结果:Container request started for /backup ECS Task is arnawsecseuwest1AwsAccountIdtask/exportMysqlToS3ecscluster/1a5b8301cfc64f30b5b319518f2e317d with the following parameters DBNAME=world HOSTNAME=database1instance1cl64px3dsqbneuwest1rdsamazonawscom

如果您使用 Python,可以运行以下脚本:

python import requests

ApiUrl = https//ApiGatewayIdexecuteapieuwest1amazonawscom/prod/backup ApiKey = YourApiKey Hostname = FullRDSEndpoint dbName = DatabaseName headers = {XAPIKEY ApiKey} ApiCall = {}hostname={}ampdbName={}format(ApiUrl Hostname dbName) response = requestsget(ApiCall headers=headers) print(responsetext)

这将产生以下结果:Container request started for /backup ECS Task is arnawsecseuwest1AwsAccountIdtask/exportMysqlToS3ecscluster/79f71052f6b240e8a23326777b1ecb2b with the following parameters DBNAME=world HOSTNAME=database1instance1cl64px3dsqbneuwest1rdsamazonawscom

完成备份并上传到 Amazon S3 后,您将收到以下电子邮件。

邮件包含以下信息:

实例标识符数据库名称S3 桶名称S3 对象名称下载 URL

有了这些信息,您可以在需要时使用下载备份文件。

系统设置了 S3 生命周期规则,24 小时后会删除文件。有关更多详细信息,请参见 管理存储生命周期。

故障排除备份失败

在此部分,我们讨论两种解决备份失败的方法:Amazon CloudWatch 和 ECS 任务日志。

CloudWatch 日志

如果出现问题,您可能需要查看 CloudWatch 日志。完成以下步骤:

在 CloudWatch 控制台中,选择导航窗格中的 Log groups。

此页面显示您正在操作的区域中存在的所有日志组的列表。

搜索 exportMySqlToS3 以检索该项目的所有日志组。

从列表中,您将在为项目部署的每个服务中找到一个 日志组。例如,如果您选择 Lambda 日志组,将看到一个 日志流,其中每个条目对应于发生的一个或多个 Lambda 函数运行。

![CloudWatch 日志流](https//d

2026-01-27 14:02:37

在 AWS reInvent 2024 上最大化您的云安全体验:安全会议的全面指南 安全博客
  • 2026-01-27 13:32:46

提升您在 AWS reInvent 2024 的云安全体验:全面的安全会议指南关键要点本指南将为您介绍 AWS reInvent 2024 的重要安全会议,助您深入了解最新的安全创新和最佳实践。本次活...

检测并修复 Amazon DocumentDB 中的低基数索引 数据库博客
  • 2026-01-27 14:32:01

检测和修复 Amazon DocumentDB 中的低基数索引重点内容在 Amazon DocumentDB 中使用低基数索引可能会导致性能问题。通过积极监测和修复低基数索引,可以提升查询效率。本文将...