迁移到 Amazon SQL Server RDS
Posted
技术标签:
【中文标题】迁移到 Amazon SQL Server RDS【英文标题】:Migrate to Amazon SQL Server RDS 【发布时间】:2012-05-17 23:16:50 【问题描述】:我一直在尝试从 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]
任何建议都会有所帮助。
【问题讨论】:
您只是传输数据库架构还是需要传输数据? 它是 Amazon RDS 的事实并没有考虑到这一点。您必须记住,每次访问本地文件系统时,都是针对运行 T-SQL 的数据库引擎。在这种情况下,您尝试从 Amazon 实例的 C 驱动器恢复文件。那个文件在那里不存在。如果可能的话,以某种方式将您的文件上传到那里,或者放到可以通过 UNC 访问它的服务器上。但是,如果 RDS 无法做到这一点,我不会感到惊讶。 【参考方案1】:下面的文章讨论如何使用数据复制数据库 - 生成 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/
【讨论】:
【参考方案2】:从CodePlex 下载免费的“SQL Azure 迁移向导”——我为此做了一个简短的blog/screencast。请务必将向导中的“TO”设置设置为 AWS DNS 名称,然后使用“SQL Server 2008”和not“SQL Azure”
【讨论】:
我猜亚马逊不想在他们的文档上链接到这个,但迁移的方式比他们建议的要容易得多(我以前浪费了好几个小时) 有人在此论坛/投诉底部的参考中偷偷摸摸:forums.aws.amazon.com/message.jspa?messageID=442219#442219 明确地说,您是说此工具适用于将 SQL Azure 数据库迁移到 RDS?情况似乎并非如此。源下拉列表仅允许 SQL Server,如果您尝试连接到 SQL Azure 实例,它会失败。【参考方案3】:在源数据库上使用 sql server management studio 中的导出向导。右键单击数据库 > 任务 > 导出数据。有一个向导可以引导您将整个数据库发送到远程 sql 服务器。
【讨论】:
这很痛苦,因为默认选项无法为您提供工作数据库。您至少需要进入 SMS Tools->Options->SQL Server Object Explorer->Scripting 并将“为依赖对象生成脚本”和“脚本索引”设置为 true,然后再进行导出。【参考方案4】:我得到的关于 AWS 支持使用 .bak 文件迁移 SQL 数据库的官方说法是它不受支持。因此不再需要从 .bak 文件快速恢复。他们在这里提供了迁移现有数据库的官方帮助:
Official AWS database migration guide
这也让我对 Azure 数据库迁移工具有所了解。只需使用它来生成架构和/或数据的脚本并针对您的 RDS 实例执行它。它是一个很好的工具。您必须先将 .bak 导入非 RDS SQL 服务器才能执行此操作。
SQL Azure migration tool
【讨论】:
您现在可以从 .bak 文件恢复到 RDS - docs.aws.amazon.com/AmazonRDS/latest/UserGuide/…【参考方案5】:我使用基于 Lynn 截屏视频的 SQL Azure 迁移工具在 how to restore a .bak file to RDS 上编写了一些分步说明。这个方法比官方说明简单多了,对我迁移的几个数据库都很好用。
【讨论】:
这实际上是我遇到的最好的方法之一 - 亚马逊不支持正确导入/导出压缩的本机备份真是太可惜了。我们在亚马逊的客户经理很清楚这个问题,知道它确实惹恼了人们 - 但我们不清楚是否/何时会支持它:( 我通过谷歌搜索看到了你的帖子。它工作得很好。出乎意料的完美。谢谢!【参考方案6】:您可能会发现Data-tier Applications BACPAC 格式将为您提供最方便的解决方案。您可以使用Export 生成一个包含数据库架构和数据的文件。 Import 将创建一个新数据库,其中填充了基于该文件的数据。
与Backup and Restore 操作相比,导出和导入不需要访问数据库服务器的文件系统。
您可以使用 SQL Server Management Studio 或通过 .Net、Powershell、MSBuild 等中的 API 处理 BACPAC 文件。
请注意,使用此方法从 Amazon RDS 导出然后导入到 Amazon RDS 存在问题。在 RDS 上创建新数据库时,会在其中创建以下两个对象。
具有 db_owner 角色成员身份的用户。 rds_deny_backups_trigger 触发器在导入过程中,BACPAC 文件中包含的对象与 RDS 自动添加的对象之间会发生冲突。这些对象都存在于 BACPAC 文件中,并在创建新数据库时由 RDS 自动创建。
如果您手边有一个非 RDS 的 SQL Server 实例,那么您可以将 BACPAC 导入该实例,删除上面的对象,然后导出数据库以创建一个新的 BACPAC 文件。这个在还原到RDS实例时不会有任何冲突。
否则,可以使用以下步骤解决此问题。
-
编辑 BACPAC 文件中的 model.xml 文件(BACPAC 只是 zip 文件)。
删除与上面列出的对象(由 RDS 自动添加的对象)相关的类型属性中具有以下值的元素。
SqlRoleMembership
SqlPermissionStatement
SqlLogin
SqlUser
SqlDatabaseDdlTrigger
使用SHA256 类上的一种ComputeHash 方法为model.xml 文件的修改版本生成校验和。
使用BitConverter.ToString() 方法将哈希转换为十六进制字符串(您需要删除分隔符)。
将 origin.xml 文件(也包含在 BACPAC 文件中)的 Checksum 元素中的现有哈希替换为新哈希。
通过压缩原始内容创建一个新的 BACPAC 文件,并将 model.xml 和 origin.xml 文件替换为新版本。不要为此目的使用System.IO.Compression.ZipFile,因为似乎与生成的 zip 文件存在一些冲突 - 数据不包含在导入中。我使用 7Zip 没有任何问题。
导入新的 BACPAC 文件,您应该不会与 RDS 自动生成的对象有任何冲突。
注意:使用 SQL Server Management Studio 将 BacPac 导入 RDS 时还有另一个相关问题,我对此进行了解释 here。
【讨论】:
【参考方案7】: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/
【讨论】:
以上是关于迁移到 Amazon SQL Server RDS的主要内容,如果未能解决你的问题,请参考以下文章
「数据库选型」卫报从MongoDB迁移到Amazon RDS上的PostgreSQL
Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库