迁移到Amazon SQL Server RDS

时间:2012-05-09 12:29:35

标签: sql-server amazon-rds

我一直在尝试从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]

任何建议都会有所帮助。

7 个答案:

答案 0 :(得分:51)

CodePlex下载免费的“SQL Azure迁移向导” - 我对此进行了简短的blog/screencast。确保将向导中的“TO”设置设置为AWS DNS名称,然后使用“SQL Server 2008”和“SQL Azure”

答案 1 :(得分:8)

我使用.bak文件迁移SQL数据库时获得AWS支持的官方消息是它不受支持。所以不再从.bak文件中快速恢复。他们在此提供了迁移现有数据库的官方帮助:

Official AWS database migration guide

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

SQL Azure migration tool

答案 2 :(得分:6)

我使用基于Lynn的截屏视频的SQL Azure迁移工具在how to restore a .bak file to RDS上写了一些分步说明。这是比官方说明更简单的方法,它适用于我迁移的几个数据库。

答案 3 :(得分:6)

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

Backup and Restore操作相比,导出和导入不需要访问数据库服务器的文件系统。

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

Export Data-tier Application Dialog

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

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

The rds_deny_backups_trigger Trigger

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

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

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

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

答案 4 :(得分:3)

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

答案 5 :(得分: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-another-table/

答案 6 :(得分:0)

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

由于RDS并不支持所有的sql服务器数据库对象,甚至跨sql服务器版本也有所不同,因此评估报告也非常值得您花时间: https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_AssessmentReport.html

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