亚马逊AWS官方博客

使用 SQLServer 备份文件.bak 还原至 RDS

任何形式的数据损坏都有可能导致数据的丢失,宕机。对于DBA来讲是一个不小的打击。云中托管的数据库无论从数据库的管理、高可用或灾难恢复上来讲都是DBA的一个很好的选择。如何利用传统的SQL Server的备份文件还原到AWS托管的SQL Server数据库是用户们普遍关心的问题。下面我将介绍:如何使用备份文件将MS_SQL Server还原数据库到RDS SQL Server.

步骤:

  1. 创建一台管理主机
  2. 创建RDS SQL Server
  3. 修改安全组和关联选项组
  4. 将已经备份的数据上传到S3上
  5. 创建并配置选项组
  6. 使用SSMS将S3上的.bak还原到RDS上

步骤一:创建一台管理主机

创建EC2虚拟机做为管理主机,目的是出于安全角度考虑使用跳板机连接数据库,而不是将SQL Server的Endpoint暴露在公网上。
创建一台EC2虚拟机并安装SQL Server Management Studio,不再赘述。
SSMS工具下载地址:https://docs.microsoft.com/zh-tw/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017

步骤二:创建RDS SQL Server

创建一台SQL Server Standard Edition,

可以选择生产(Production)或开发/测试(Dev/Test)

生产环境也就是多可用区部署:

多可用区部署为数据库实例提供了更高的可用性、数据持久性和容错能力。在进行计划的数据维护或发生未计划的服务中断时,Amazon RDS 会自动故障转移到最新的辅助数据库实例。

开发和测试环境就是单实例,会有单点故障。

步骤三:修改安全组和关联选项组

修改RDS安全组,目的是让刚创建的管理主机与RDS建立连接,如下图:

在RDS的安全组中的Source修改成EC2的安全组ID:

返回到管理主机上,使用SSMS测试连通性

连接成功

步骤四:将已经备份的数据上传到S3上

一般而言,如果你的文件大小达到100MB,你应该考虑使用分段上传。使用AWS的s3 cp命令和s3 sync等命令可以自动对要上传的大文件分片,然后上传。如果你对命令不熟悉可以参考这篇blog中的5. 使用AWS CLI的自动分段上传

步骤五:创建并配置选项组

下面就是要创建和配置选项组,目的是添加S3的路径将S3上的.bak文件还原到RDS上。

在创建选项组之前要确认一下RDS的Engine 版本号,先记下来。

创建 Option Group

这里可能会问到,我的RDS SQL server 对应 Engine是什么?如下图:

我的RDS用的是SQL Server Standard Edition 所用选择 sqlserver-se

根据前面RDS instance的截图,Major engine version 就是14.00。

Add Option:

选择Add option,选项如下图:

修改RDS实例并关联选项组

Change Option Group 为我们创建的Option Group

modifying这个状态大概会持续30-60秒,刷新一下

步骤六:使用SSMS将S3上的bak还原到RDS上

回到SSMS工具的EC2管理主机上执行还原脚本:

例 未加密

exec msdb.dbo.rds_restore_database

        @restore_db_name='database_name',

        @s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name_and_extension';

例 带加密

exec msdb.dbo.rds_restore_database

        @restore_db_name='database_name',

        @s3_arn_to_restore_from='arn:aws:s3:::bucket_name/file_name_and_extension',

        @kms_master_key_arn='arn:aws:kms:region:account-id:key/key-id';

这里执行未加密的脚本:

exec msdb.dbo.rds_restore_database

        @restore_db_name='adventurerestore',

        @s3_arn_to_restore_from='arn:aws:s3:::sqlbakfilestest/AdventureWorks2017.bak';

执行脚本,开始还原。

执行exec msdb.dbo.rds_task_status;查看任务状态 complete 100 代表完成。

刷新数据库 还原的adventurestore已经建立好。

验证数据:

Trouble Shooting:

以下是使用本地备份和还原时可能会遇到的问题。

问题 问题排查建议
Access Denied

备份或恢复流程无法访问备份文件。这通常由类似于以下的问题导致:

·         引用不正确存储桶。使用不正确的格式引用存储桶。引用文件名但未使用 ARN。

·         存储桶文件的权限不正确。例如,如果文件由正在尝试访问它的其他账户创建,请添加正确的权限。

·         IAM 策略不正确或不完整。您的 IAM 角色必须包含所有的必要元素,例如,包括正确的版本。导入和导出 SQL Server 数据库中重点介绍了这些内容。

BACKUP DATABASE WITH COMPRESSION is not supported on <edition_name> Edition

仅 Microsoft SQL Server Enterprise Edition 和 Standard Edition 支持压缩备份文件。

有关更多信息,请参阅 压缩备份文件

Database <database_name> cannot be restored because there is already an existing database with the same family_guid on the instance

您无法将一个备份文件还原到已用于创建该备份文件的同一数据库实例。而是应将该备份文件还原到新的数据库实例。

您也无法将同一备份文件多次还原到一个数据库实例。也就是说,您无法将备份文件还原到已包含您正在还原的数据库的数据库实例。而是应将该备份文件还原到新的数据库实例。

Key <ARN> does not exist

您已尝试还原一个加密备份,但未提供有效的加密密钥。检查您的加密密钥并重试。

有关更多信息,请参阅 还原数据库

Please specify a bucket that is in the same region as RDS instance

您无法备份到与您的 Amazon RDS 数据库实例不同的 AWS 区域中的 Amazon S3 存储桶或从中进行还原。您可以使用 Amazon S3 复制将备份文件复制到正确的区域。

有关更多信息,请参阅 Amazon S3 文档中的跨区域复制

The specified bucket does not exist

验证您使用正确格式为存储桶和文件提供了正确的 ARN。

有关更多信息,请参阅 使用本机备份和还原

总结:

我们在迁移和还原的过程中就可以发现,AWS对于服务的访问,数据库的连接,网络端口等等都会有非常详细的安全准则。数据库的安全是云中数据安全的非常重要的一部分。另外,对于数据库的高可用和安全,我们都可以通过这个博客了解。除此之外,Amazon Relational Database Service (Amazon RDS) 让用户能够在云中更轻松地设置、操作和扩展关系数据库。支持您已熟悉的数据库产品:MySQL、MariaDB、PostgreSQL、Oracle 和 Microsoft SQL Server。最后,打个广告,具有高性能并且与MySQL 和 PostgreSQL 兼容的完全托管的关系数据库引擎——Aurora不仅具有商用数据库的速度和可靠性,同时还具有开源数据库的简单性和成本效益。您可以通过DMS工具来进行同构或异构数据库的迁移。https://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html

本篇作者

李强

AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在物联网和微软的技术栈有着广泛的设计和实践经验。在加入AWS之前,曾在东芝中国负责系统开发和运维工作,在微软中国负责中小企业的技术咨询和方案设计工作。