您可能会发现数据层应用程序BACPAC 格式将为您提供最方便的解决方案。您可以使用Export生成一个包含数据库架构和数据的文件。Import将创建一个新数据库,其中填充了基于该文件的数据。
与备份和恢复操作相比,导出和导入不需要访问数据库服务器的文件系统。
您可以使用 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 自动添加的对象)相关的 Type 属性中具有以下值的元素。
- SqlRoleMembership
- SqlPermission 语句
- SqlLogin
- SqlUser
- SqlDatabaseDdlTrigger
- 使用SHA256类的 ComputeHash 方法之一为 model.xml 文件的修改版本生成校验和。
- 使用BitConverter.ToString()方法将哈希转换为十六进制字符串(您需要删除分隔符)。
- 将 origin.xml 文件(也包含在 BACPAC 文件中)的 Checksum 元素中的现有哈希替换为新哈希。
- 通过使用新版本替换的 model.xml 和 origin.xml 文件压缩原始内容来创建新的 BACPAC 文件。不要为此目的使用System.IO.Compression.ZipFile,因为似乎与生成的 zip 文件存在一些冲突 - 数据不包含在导入中。我使用 7Zip 没有任何问题。
- 导入新的 BACPAC 文件,您不应与 RDS 自动生成的对象有任何冲突。
注意:使用 SQL Server Management Studio 将 BacPac 导入 RDS 还有另一个相关问题,我在此处进行了解释。