Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用其他方法导入和导出 SQL Server 数据

您可以在下面找到有关使用快照将 Microsoft SQL Server 数据导入到 Amazon RDS 以及从运行 SQL Server 的 Amazon RDS 数据库实例中导出数据的信息。

如果您的方案支持此方法,则可使用本机备份和还原功能更轻松地将数据移入和移出 Amazon RDS。有关更多信息,请参阅 导入和导出 SQL Server 数据库

注意

适用于 Microsoft SQL Server 的 Amazon RDS 不支持将数据导入 msdb 数据库。

使用快照将数据导入 Amazon RDS 上的 SQL Server

使用快照将数据导入 SQL Server 数据库实例

  1. 创建数据库实例。有关更多信息,请参阅 创建运行 Microsoft SQL Server 数据库引擎的数据库实例

  2. 阻止应用程序访问目标数据库实例。

    如果您在导入数据时阻止应用程序访问数据库实例,数据传输速度会更快。此外,您无需担心在加载数据时会因其他应用程序无法写入到数据库实例而引起冲突。如果因出现问题而必须要回滚到之前的数据库快照,您丢失的更改只有已导入数据,在解决问题后您可以再次导入这些更改。

    有关控制数据库实例访问权限的信息,请参阅 使用数据库安全组 (EC2-Classic 平台)

  3. 创建目标数据库快照。

    如果目标数据库已存有数据,我们建议您先为数据库拍摄快照,然后再导入数据。如果数据导入过程出现问题或您想要放弃更改,您可以使用此快照将数据库还原到先前的状态。有关数据库快照的信息,请参阅 创建数据库快照

    注意

    获取数据库快照时,数据库的 I/O 操作会在备份进行过程中暂停大约 10 秒。

  4. 禁用目标数据库的自动备份。

    禁用目标数据库实例上的自动备份将会提高导入数据时的性能,因为 Amazon RDS 在禁用自动备份后不会记录事务。但需要考虑以下问题。执行时间点恢复时需要使用自动备份,因此,如果禁用自动备份,在导入数据期间您无法将数据库还原到指定的时间点。此外,系统会清除先前在数据库实例上创建的所有自动备份。但您仍可使用先前的快照来恢复数据库,且您拍摄的所有快照仍然可用。有关自动备份的信息,请参阅 使用备份

  5. 禁用外键约束 (如适用)。

    如果需要禁用外键约束,可以使用以下脚本。

    --Disable foreign keys on all tables DECLARE @table_name SYSNAME; DECLARE @cmd NVARCHAR(MAX); DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables; OPEN table_cursor; FETCH NEXT FROM table_cursor INTO @table_name; WHILE @@FETCH_STATUS = 0 BEGIN SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' NOCHECK CONSTRAINT ALL'; EXEC (@cmd); FETCH NEXT FROM table_cursor INTO @table_name; END CLOSE table_cursor; DEALLOCATE table_cursor; GO
  6. 删除索引 (如果适用)。

  7. 禁用触发器 (如果适用)。

    如果您需要禁用触发器,则可使用以下脚本执行此操作。

    --Disable triggers on all tables DECLARE @enable BIT = 0; DECLARE @trigger SYSNAME; DECLARE @table SYSNAME; DECLARE @cmd NVARCHAR(MAX); DECLARE trigger_cursor CURSOR FOR SELECT trigger_object.name trigger_name, table_object.name table_name FROM sysobjects trigger_object JOIN sysobjects table_object ON trigger_object.parent_obj = table_object.id WHERE trigger_object.type = 'TR'; OPEN trigger_cursor; FETCH NEXT FROM trigger_cursor INTO @trigger, @table; WHILE @@FETCH_STATUS = 0 BEGIN IF @enable = 1 SET @cmd = 'ENABLE '; ELSE SET @cmd = 'DISABLE '; SET @cmd = @cmd + ' TRIGGER dbo.'+QUOTENAME(@trigger)+' ON dbo.'+QUOTENAME(@table)+' '; EXEC (@cmd); FETCH NEXT FROM trigger_cursor INTO @trigger, @table; END CLOSE trigger_cursor; DEALLOCATE trigger_cursor; GO
  8. 查询源 SQL Server 实例,获取要导入到目标数据库实例的所有登录名。

    SQL Server 将登录名和密码存储在 master 数据库中。由于 Amazon RDS 未授予访问 master 数据库的权限,因此您无法直接将登录名和密码导入目标数据库实例。您必须改为在源 SQL Server 实例上查询 master 数据库并生成包括以下信息的数据定义语言 (DDL) 文件:要添加到目标数据库实例的所有登录名和密码,以及要传输的角色成员资格和权限。

    有关查询 master 数据库的信息,请参阅 Microsoft 知识库中的如何在 SQL Server 2005 和 SQL Server 2008 的实例之间传输登录名和密码

    该脚本输出是可在目标数据库实例上运行的另一个脚本。知识库文章中的脚本包含以下代码:

    p.type IN

    p.type 出现的所有位置,改用以下代码:

    p.type = 'S'
  9. 使用导入数据中的方法导入数据。

  10. 授予应用程序访问目标数据库实例的权限。

    完成数据导入后,您可以向导入期间被阻止的应用程序授予访问数据库实例的权限。有关控制数据库实例访问权限的信息,请参阅 使用数据库安全组 (EC2-Classic 平台)

  11. 启用目标数据库实例的自动备份。

    有关自动备份的信息,请参阅 使用备份

  12. 启用外键约束。

    如果您之前禁用了外键约束,现在可通过以下脚本重新启用。

    --Enable foreign keys on all tables DECLARE @table_name SYSNAME; DECLARE @cmd NVARCHAR(MAX); DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables; OPEN table_cursor; FETCH NEXT FROM table_cursor INTO @table_name; WHILE @@FETCH_STATUS = 0 BEGIN SELECT @cmd = 'ALTER TABLE '+QUOTENAME(@table_name)+' CHECK CONSTRAINT ALL'; EXEC (@cmd); FETCH NEXT FROM table_cursor INTO @table_name; END CLOSE table_cursor; DEALLOCATE table_cursor;
  13. 启用索引 (如果适用)。

  14. 启用触发器 (如果适用)。

    如果您之前禁用了触发器,现在可以通过以下脚本启用触发器。

    --Enable triggers on all tables DECLARE @enable BIT = 1; DECLARE @trigger SYSNAME; DECLARE @table SYSNAME; DECLARE @cmd NVARCHAR(MAX); DECLARE trigger_cursor CURSOR FOR SELECT trigger_object.name trigger_name, table_object.name table_name FROM sysobjects trigger_object JOIN sysobjects table_object ON trigger_object.parent_obj = table_object.id WHERE trigger_object.type = 'TR'; OPEN trigger_cursor; FETCH NEXT FROM trigger_cursor INTO @trigger, @table; WHILE @@FETCH_STATUS = 0 BEGIN IF @enable = 1 SET @cmd = 'ENABLE '; ELSE SET @cmd = 'DISABLE '; SET @cmd = @cmd + ' TRIGGER dbo.'+QUOTENAME(@trigger)+' ON dbo.'+QUOTENAME(@table)+' '; EXEC (@cmd); FETCH NEXT FROM trigger_cursor INTO @trigger, @table; END CLOSE trigger_cursor; DEALLOCATE trigger_cursor;

导入数据

Microsoft SQL Server Management Studio 是一种包含在所有 Microsoft SQL Server 版本 (Express 版除外) 中的图像化 SQL Server 客户端。您可以从 Microsoft 上免费下载 SQL Server Management Studio Express。要找到此下载,请访问 Microsoft 网站

注意

SQL Server Management Studio 应用程序只能在 Windows 环境中运行。

SQL Server Management Studio 包括能够帮助将数据导入 SQL Server 数据库实例的以下工具:

  • 生成和发布脚本向导

  • 导入和导出向导

  • 批量复制

生成和发布脚本向导

生成和发布脚本向导可创建一个包含数据库架构或数据本身,或兼具两者的脚本。如果您在本地 SQL Server 部署中为数据库生成了脚本,则可以运行此脚本,从而将脚本中包含的信息传输到 Amazon RDS 数据库实例。

注意

对于 1 GB 或更大的数据库,更有效的方法是,仅为数据库架构编写脚本,然后使用 SQL Server 的导入和导出向导或批量复制功能传输数据。

有关生成和发布脚本向导的详细信息,请参阅 Microsoft SQL Server 文档

在此向导中,请特别注意 Set Scripting Options 页面中的高级选项,确保已选中脚本需要包含的所有选项。例如,默认情况下,脚本不包含数据库触发器。

生成并保存脚本后,您可以使用 SQL Server Management Studio 连接数据库实例,然后运行脚本。

导入和导出向导

导入和导出向导工具可创建一种特殊的集成服务包,您可以使用此集成服务包将数据从本地 SQL Server 数据库复制到目标数据库实例。此向导可筛选要将哪些表格甚至是表格内的哪些元组复制到目标数据库实例。

注意

导入和导出向导在用于大型数据集时非常有效,但是就从本地部署中远程导出数据而言,这可能不是最快的方式。要采用更快的方式,请考虑 SQL Server 批量复制功能。

有关导入和导出向导的详细信息,请参阅 Microsoft SQL Server 文档

在此向导中,请在 Choose a Destination 页面上执行以下操作:

  • 对于 Server Name,键入数据库实例的终端节点名称。

  • 对于服务器身份验证模式,请选择 Use SQL Server Authentication

  • 对于 User namePassword,请键入您为数据库实例创建的主用户凭证。

批量复制

SQL Server 批量复制功能是一种将数据从源数据库复制到您的数据库实例的高效工具。批量复制可将指定的数据写入一个数据文件,如 ASCII 文件。然后您可以再次运行批量复制,将此文件内容写入目标数据库实例。

本部分使用了 bcp 实用工具,所有版本的 SQL Server 都包含此工具。有关批量导入和导出操作的详细信息,请参阅 Microsoft SQL Server 文档

注意

使用批量复制前,您必须先将数据库架构导入目标数据库实例。本主题前面介绍的生成和发布脚本向导这一工具非常适合用于此操作。

以下命令用于连接本地 SQL Server 实例,并在您现有 SQL Server 部署的 C:\ 根目录中生成指定表的制表符定界文件。指定表时需使用完全限定名,文本文件的名称与复制的表相同。

bcp dbname.schema_name.table_name out C:\table_name.txt -n -S localhost -U username -P password -b 10000

上述代码包含以下选项:

  • -n 指定,批量复制将使用待复制数据的本机数据类型。

  • -S 指定 bcp 实用工具要连接的 SQL Server 实例。

  • -U 指定 SQL Server 实例登录账户的用户名。

  • -P-U 指定的用户指定密码。

  • -b 指定每批导入数据的行数。

注意

可能有对导入情况来说很重要的其他参数。例如,您可能需要与身份值有关的 -E 参数。有关更多信息,请参阅 Microsoft SQL Server 文档中的 bcp 实用工具的命令行语法的完整说明。

例如,假设某一数据库名为 store,使用了默认架构 dbo 且包含一个名为 customers 的表。密码为 insecure 的用户账户 admin 要将 customers 表中共计 10000 行的数据复制到名为 customers.txt 的文件中。

bcp store.dbo.customers out C:\customers.txt -n -S localhost -U admin -P insecure -b 10000

生成数据文件后,如果您已在目标数据库实例上创建了数据库和架构,则可以使用类似的命令将数据上传到数据库实例。在此情况下,您需要使用 in 参数指定输入文件,而不是使用 out 指定输出文件。您需要指定数据库实例的终端节点,而不是使用本地主机指定本地 SQL Server 实例。如果您使用的端口不是 1433 端口,也需要执行该指定操作。用户名和密码是数据库实例的主用户名和密码。语法如下所示。

bcp dbname.schema_name.table_name in C:\table_name.txt -n -S endpoint,port -U master_user_name -P master_user_password -b 10000

为继续上述示例,我们假设主用户名是 admin,密码为 insecure。数据库实例的终端节点是 rds.ckz2kqd4qsn1.us-east-1.rds.amazonaws.com,且您使用端口 4080。命令如下所示。

bcp store.dbo.customers in C:\customers.txt -n -S rds.ckz2kqd4qsn1.us-east-1.rds.amazonaws.com,4080 -U admin -P insecure -b 10000

从 Amazon RDS 上的 SQL Server 中导出数据

您可以选择以下选项之一来从 Amazon RDS SQL 数据库实例中导出数据:

SQL Server 导入和导出向导

您可以使用 SQL Server 导入和导出向导将一个或多个表、视图或查询从您的 Amazon RDS SQL 数据库实例复制到另一个数据存储。如果目标数据存储不是 SQL Server,这将是最佳选择。有关更多信息,请参阅 SQL Server 文档中的 SQL Server 导入和导出向导

SQL Server 导入和导出向导将作为 Microsoft SQL Server Management Studio (它是 Microsoft SQL Server Express Edition 之外的所有 Microsoft SQL Server 版本中包含的图形 SQL Server 客户端) 的一部分提供。SQL Server Management Studio 应用程序只能在 Windows 环境中运行。您可以从 Microsoft 上免费下载 SQL Server Management Studio Express。要找到此下载,请访问 Microsoft 网站

使用 SQL Server 导入和导出向导来导出数据

  1. 在 SQL Server Management Studio 中,连接到 Amazon RDS SQL 数据库实例。有关如何执行此操作的详细信息,请参阅连接运行 Microsoft SQL Server 数据库引擎的数据库实例

  2. Object Explorer 中,展开 Databases,打开源数据库的上下文 (右键单击) 菜单,选择 Tasks,然后单击 Export Data。此时将显示向导。

  3. Choose a Data Source 页面上,执行以下操作:

    1. 对于 Data source,选择 SQL Server Native Client 11.0

    2. 确认 Server name 框中显示 Amazon RDS SQL 数据库实例的终端节点。

    3. 选择 Use SQL Server Authentication。对于 User namePassword,键入您的 Amazon RDS SQL 数据库的主用户名和密码。

    4. 确认 Database 框中显示要从中导出数据的数据库。

    5. 选择 Next

  4. Choose a Destination 页面上,执行以下操作:

    1. 对于 Destination,选择 SQL Server Native Client 11.0

      注意

      提供了其他目标数据源,包括 .NET Framework 数据提供商、OLE DB 提供商、SQL Server 本地客户端提供商、ADO.NET 提供商、Microsoft Office Excel、Microsoft Office Access 以及平面文件源。如果您选择以这些数据源之一为目标,请跳过步骤 4 的剩余部分并参阅 SQL Server 文档中的选择目标以了解要提供的连接信息。

    2. 对于 Server name,键入目标 SQL Server 数据库实例的服务器名称。

    3. 选择适当的身份验证类型。如有必要,键入用户名和密码。

    4. 对于 Database,选择目标数据库的名称,或选择 New 以创建一个包含已导出数据的新数据库。

      如果选择 New,请参阅 SQL Server 文档中的创建数据库以了解要提供的数据库信息。

    5. 选择 Next

  5. Table Copy or Query 页面上,选择 Copy data from one or more tables or viewsWrite a query to specify the data to transfer。选择 Next

  6. 如果您选择 Write a query to specify the data to transfer,则将看到 Provide a Source Query 页面。键入或贴入 SQL 查询,然后选择 Parse 以进行验证。在验证查询后,选择 Next

  7. Select Source Tables and Views 页面上,执行以下操作:

    1. 选择要导出的表和视图,或确认已选择您提供的查询。

    2. 选择 Edit Mappings 并指定数据库和列映射信息。有关详细信息,请参阅 SQL Server 文档中的列映射

    3. (可选) 若要查看要导出的数据的预览,请选择表、视图或查询,然后选择 Preview

    4. 选择 Next

  8. Run Package 页面上,确认已选择 Run immediately。选择 Next

  9. Complete the Wizard 页面上,确认数据导出详细信息是预期的详细信息。选择 Finish

  10. The execution was successful 页面上,单击 Close

SQL Server 生成和发布脚本向导与 bcp 实用工具

您可以使用 SQL Server 生成和发布脚本向导来为整个数据库或仅为所选对象创建脚本。可在目标 SQL Server 数据库实例上运行这些脚本以重新创建已编写脚本的对象。然后,可以使用 bcp 实用工具将选定对象的数据批量导出到目标数据库实例。若要在两个 SQL Server 数据库实例之间移动整个数据库 (包括表以外的对象) 或大量数据,这将是最佳选择。有关 bcp 命令行语法的完整说明,请参阅 Microsoft SQL Server 文档中的 bcp 实用工具

SQL Server 生成和发布脚本向导将作为 Microsoft SQL Server Management Studio (它是 Microsoft SQL Server Express Edition 之外的所有 Microsoft SQL Server 版本中包含的图形 SQL Server 客户端) 的一部分提供。SQL Server Management Studio 应用程序只能在 Windows 环境中运行。您可以从 Microsoft 上免费下载 SQL Server Management Studio Express。

使用 SQL Server 生成和发布脚本向导与 bcp 实用工具来导出数据

  1. 在 SQL Server Management Studio 中,连接到 Amazon RDS SQL 数据库实例。有关如何执行此操作的详细信息,请参阅连接运行 Microsoft SQL Server 数据库引擎的数据库实例

  2. Object Explorer 中,展开 Databases 节点并选择要编写脚本的数据库。

  3. 按照 SQL Server 文档中的生成和发布脚本向导中的说明操作来创建脚本文件。

  4. 在 SQL Server Management Studio 中,连接到目标 SQL Server 数据库实例。

  5. Object Explorer 中选择目标 SQL Server 数据库实例后,在 File 菜单上选择 Open,选择 File,然后打开脚本文件。

  6. 如果您为整个数据库编写了脚本,请查看脚本中的 CREATE DATABASE 语句,以确保在所需位置使用所需参数创建数据库。有关更多信息,请参阅 SQL Server 文档中的 CREATE DATABASE

  7. 如果在脚本中创建数据库用户,请检查目标数据库实例中是否有这些用户的服务器登录名。如果没有登录名,请为这些用户创建登录名;否则,用于创建数据库用户的脚本命令将失败。有关更多信息,请参阅 SQL Server 文档中的创建登录名

  8. 选择 SQL 编辑器菜单上的 !Execute 以执行脚本文件并创建数据库对象。完成脚本后,验证是否存在预期的所有数据库对象。

  9. 使用 bcp 实用工具将数据从 Amazon RDS SQL 数据库实例导出到文件。打开命令提示符并键入以下命令。

    bcp database_name.schema_name.table_name out data_file -n -S aws_rds_sql_endpoint -U username -P password

    上述代码包含以下选项:

    • table_name 是您已在目标数据库中重新创建且现在需要填充数据的某个表的名称。

    • data_file 是要创建的数据文件的完整路径和名称。

    • -n 指定,批量复制将使用待复制数据的本机数据类型。

    • -S 指定要从中导出数据的 SQL Server 数据库实例。

    • -U 指定在连接到 SQL Server 数据库实例时要使用的用户名。

    • -P-U 指定的用户指定密码。

    下面显示了示例命令。

    bcp world.dbo.city out C:\Users\JohnDoe\city.dat -n -S sql-jdoe.1234abcd.us-west-2.rds.amazonaws.com,1433 -U JohnDoe -P ClearTextPassword

    重复此步骤,直到您获得要导出的所有表的数据文件。

  10. 通过按照 SQL Server 文档中的批量导入数据的基本指南中的说明操作,准备目标数据库实例以便批量导入数据。

  11. 在考虑 SQL Server 文档中的关于批量导入和批量导出操作中讨论的性能和其他问题后,决定要使用的批量导入方法。

  12. 按照 SQL Server 文档中的使用 bcp 实用工具导入和导出批量数据使用 BULK INSERT 或 OPENROWSET(BULK...) 导入批量数据中的说明操作,从使用 bcp 实用工具创建的数据文件中批量导入数据,具体取决于您在步骤 11 中所做的决定。

相关主题