32

我一直在尝试从 Win2008 服务器上的常规 SQL Server 迁移到 Amazon AWS RDS 上的 SQL Server。

我认为一个简单的备份和恢复就可以了。尽管 AWS RDS 似乎无法访问文件系统,但 sql 脚本似乎都需要源服务器和目标服务器上的本地文件系统。我尝试了以下脚本

exec sp_addlinkedserver @server='test.xxxx.us-east-1.rds.amazonaws.com'

-- Verify that the servers were linked (lists linked servers)
exec sp_linkedservers

EXEC ('RESTORE DATABASE [orchard] FROM DISK = ''C:\Temp\orchard.bak'' WITH FILE = 1,  NOUNLOAD, STATS = 10')
AT [test.xxxx.us-east-1.rds.amazonaws.com]

任何的意见都将会有帮助。

4

7 回答 7

51

从CodePlex下载免费的“SQL Azure 迁移向导” ——我为此做了一个简短的博客/截屏视频。确保将向导中的“TO”设置设置为 AWS DNS 名称,然后使用“SQL Server 2008”而不是“SQL Azure”

于 2012-05-25T16:46:44.177 回答
8

我得到的 AWS 支持使用 .bak 文件迁移 SQL 数据库的官方说法是它不受支持。因此不再需要从 .bak 文件快速恢复。他们在此处为迁移现有数据库提供了官方帮助:

官方 AWS 数据库迁移指南

这也给了我一个非官方的 Azure 数据库迁移工具。只需使用它来生成架构和/或数据的脚本并针对您的 RDS 实例执行它。它是一个很好的工具。您必须先将 .bak 导入非 RDS SQL 服务器才能执行此操作。

SQL Azure 迁移工具

于 2012-10-11T16:06:09.043 回答
7

您可能会发现数据层应用程序BACPAC 格式将为您提供最方便的解决方案。您可以使用Export生成一个包含数据库架构和数据的文件。Import将创建一个新数据库,其中填充了基于该文件的数据。

备份和恢复操作相比,导出和导入不需要访问数据库服务器的文件系统。

您可以使用 SQL Server Management Studio 或通过 .Net、Powershell、MSBuild 等中的 API 处理 BACPAC 文件。

导出数据层应用程序对话框

请注意,使用此方法从 Amazon RDS 导出然后导入到 Amazon RDS 存在问题。在 RDS 上创建新数据库时,会在其中创建以下两个对象。

  • 具有 db_owner 角色成员身份的用户。
  • rds_deny_backups_trigger 触发器

rds_deny_backups_trigger 触发器

在导入过程中,BACPAC 文件中包含的对象与 RDS 自动添加的对象之间会发生冲突。这些对象都存在于 BACPAC 文件中,并在创建新数据库时由 RDS 自动创建。

如果您手边有一个非 RDS 的 SQL Server 实例,那么您可以将 BACPAC 导入该实例,删除上面的对象,然后导出数据库以创建一个新的 BACPAC 文件。这个在还原到RDS实例时不会有任何冲突。

否则,可以使用以下步骤解决此问题。

  1. 编辑 BACPAC 文件中的 model.xml 文件(BACPAC 只是 zip 文件)。
  2. 删除与上面列出的对象(由 RDS 自动添加的对象)相关的 Type 属性中具有以下值的元素。
    • SqlRoleMembership
    • SqlPermission 语句
    • SqlLogin
    • SqlUser
    • SqlDatabaseDdlTrigger
  3. 使用SHA256类的 ComputeHash 方法之一为 model.xml 文件的修改版本生成校验和。
  4. 使用BitConverter.ToString()方法将哈希转换为十六进制字符串(您需要删除分隔符)。
  5. 将 origin.xml 文件(也包含在 BACPAC 文件中)的 Checksum 元素中的现有哈希替换为新哈希。
  6. 通过使用新版本替换的 model.xml 和 origin.xml 文件压缩原始内容来创建新的 BACPAC 文件。不要为此目的使用System.IO.Compression.ZipFile,因为似乎与生成的 zip 文件存在一些冲突 - 数据不包含在导入中。我使用 7Zip 没有任何问题。
  7. 导入新的 BACPAC 文件,您不应与 RDS 自动生成的对象有任何冲突。

注意:使用 SQL Server Management Studio 将 BacPac 导入 RDS 还有另一个相关问题,我在此处进行了解释。

于 2013-04-12T15:11:14.680 回答
6

我根据 Lynn 的截屏视频编写了一些关于如何使用 SQL Azure 迁移工具将 .bak 文件还原到 RDS的分步说明。这是一种比官方说明简单得多的方法,并且对于我迁移的几个数据库都运行良好。

于 2013-04-12T12:57:43.587 回答
4

在源数据库上使用 sql server management studio 中的导出向导。右键单击数据库 > 任务 > 导出数据。有一个向导可以引导您将整个数据库发送到远程 sql 服务器。

于 2012-05-31T20:15:37.760 回答
1

AWS 设计的工具可以回答您的大部分(如果不是全部)兼容性问题 - SQL Server 架构转换工具:https ://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer .html

因为并非所有 sql server 数据库对象都受 RDS 支持,甚至因 sql server 版本而异,所以评估报告也非常值得您花时间: https ://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/ CHAP_AssessmentReport.html

最后,一定要利用数据库迁移服务: https ://aws.amazon.com/dms/

于 2018-09-26T16:45:55.737 回答
0

下面的文章讨论了如何使用数据复制数据库——生成用于将数据从一个表插入另一个表的 T-SQL 是我所需要的。

http://blog.sqlauthority.com/2009/07/29/sql-server-2008-copy-database-with-data-generate-t-sql-for-inserting-data-from-one-table-to-另一张桌子/

于 2012-05-10T02:30:29.280 回答