AWS Database Migration Service
用户指南 (版本 API Version 2016-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 Microsoft SQL Server 数据库作为 AWS DMS 源

您可以使用 AWS DMS (AWS DMS) 从一个或多个 Microsoft SQL Server 数据库中迁移数据。将 SQL Server 数据库作为源时,您可以将数据迁移到另一个 SQL Server 数据库或其他支持的数据库。

AWS DMS 支持将本地和 Amazon EC2 实例上的 Microsoft SQL Server 版本 2005、2008、2008R2、2012、2014 和 2016 数据库作为源。支持 Enterprise、Standard、Workgroup 和 Developer 版。不支持 Web 和 Express 版本。

AWS DMS 支持将 Amazon RDS 数据库实例上的 SQL Server 版本 2008R2、2012、2014 和 2016 数据库作为源。这包括 Enterprise 和 Standard 版。对于 Enterprise Edition,所有版本都支持 CDC。对于 Standard Edition,只有版本 2016 SP1 和更高版本支持 CDC。不支持 Web、Workgroup、Developer 和 Express 版本。

您可以将源 SQL Server 数据库安装在您网络中的任意计算机上。还需要具有一个 SQL Server 账户以用于 AWS DMS,该账户具有与选定任务类型对应的源数据库访问权限。

AWS DMS 支持从 SQL Server 的命名实例中迁移数据。当您创建源终端节点时,您可以在服务器名称中使用以下表示法。

IPAddress\InstanceName

例如,以下是正确的源终端节点服务器名称。在这里,名称的第一部分是服务器的 IP 地址,第二部分是 SQL Server 实例名称 (本例中为 SQLTest)。

10.0.0.25\SQLTest

可以使用 SSL 加密 SQL Server 终端节点与复制实例之间的连接。有关将 SSL 用于 SQL Server 终端节点的更多信息,请参阅将 SSL 与 AWS Database Migration Service 配合使用

要从源 SQL Server 数据库捕获更改,必须为完整备份配置数据库,并且必须为 Enterprise、Developer 或 Standard 版。

有关使用 SQL Server 源数据库和 AWS DMS 的其他详细信息,请参阅以下内容。

将 SQL Server 用作 AWS DMS 的源的限制

将 SQL Server 数据库作为 AWS DMS 源时,存在以下限制:

  • 列的身份属性不迁移到目标数据库列。

  • 在 2.4.x 版之前的 AWS DMS 引擎版本中,无法正确处理对所含信息超过 8000 字节(含标题和映射信息)的行的更改。出现此问题是因为 SQL Server TLOG 缓冲区大小的限制。要避免此问题,请使用最新版本的 AWS DMS。

  • SQL Server 终端节点不支持使用稀疏表。

  • 不支持 Windows 身份验证。

  • 不复制对 SQL Server 中计算字段的更改。

  • 不支持临时表。

  • 不支持 SQL Server 分区切换。

  • 源上的集群索引将在目标上创建为非集群索引。

  • 在使用 WRITETEXT 和 UPDATETEXT 实用工具时,AWS DMS 不捕获对源数据库应用的事件。

  • 不支持以下数据操作语言 (DML) 模式:

    SELECT <*> INTO <new_table> FROM <existing_table>
  • 在将 SQL Server 用作源时,不支持列级别加密。

  • 由于 SQL Server 2008 和 SQL Server 2008 R2 的已知问题,AWS DMS 在作为源的 SQL Server 2008 或 SQL Server 2008 R2 上不支持服务器级别审核。例如,运行以下命令将导致 AWS DMS 失败。

    USE [master] GO ALTER SERVER AUDIT [my_audit_test-20140710] WITH (STATE=on) GO

在 SQL Server 源中使用持续复制 (CDC)

您可以针对本地或 Amazon EC2 上的自管理 SQL Server 数据库或者 Amazon RDS 上的 Amazon 托管数据库使用持续复制(更改数据捕获 (CDC))。

AWS DMS 对以下 SQL Server 配置支持持续复制:

  • 对于在本地或 Amazon EC2 上的源 SQL Server 实例,AWS DMS 对 SQL Server Enterprise、Standard 和 Developer Edition 支持持续复制。

  • 对于在 Amazon RDS 上运行的源 SQL Server 实例,AWS DMS 对 SQL Server Enterprise 到 SQL Server 2016 SP1 支持持续复制。除了此版本,AWS DMS 还对 SQL Server Enterprise 和 Standard 版本支持 CDC。

如果希望 AWS DMS 自动设置持续复制,则用于连接到源数据库的 AWS DMS 用户账户必须具有 sysadmin 固定服务器角色。如果不想将 sysadmin 角色分配给所用的用户账户,则仍可使用持续复制。可通过执行以下讨论的一系列手动步骤来完成此操作。

尤其在对作为 AWS DMS 源的 SQL Server 数据库使用持续复制时,存在以下要求:

  • 必须配置 SQL Server 进行完整备份,并且您必须在开始复制数据之前先进行一次备份。

  • 恢复模式必须设置为 Bulk loggedFull

  • 不支持 SQL Server 备份到多个磁盘。如果定义备份以将数据库备份写入到不同磁盘上的多个文件中,则 AWS DMS 无法读取数据并且 AWS DMS 任务失败。

  • 对于自管理 SQL Server 源,请注意,在您删除任务时,DMS CDC 任务中使用的源数据库的 SQL Server Replication Publisher 定义不会被删除。SQL Server 系统管理员必须从 SQL Server 删除为自管理源这些定义。

  • 在 CDC 期间,AWS DMS 需要查找 SQL Server 事务日志备份以读取更改。AWS DMS 不支持使用通过第三方备份软件创建的 SQL Server 事务日志备份。

  • 对于自管理 SQL Server 源,请注意,在新创建的表发布前,SQL Server 不会捕获对它们的更改。在将表添加到 SQL Server 源后,AWS DMS 将管理创建发布。但是,该过程可能需要几分钟时间。不会将在该延迟期间对新创建的表执行的操作捕获或复制到目标中。

  • AWS DMS 更改数据捕获要求在 SQL Server 中启用 FULLOGGING。要在 SQL Server 中启用 FULLLOGGING,请启用 MS-REPLICATION 或 CHANGE DATA CAPTURE (CDC)。

  • 在处理更改之前,您无法重用 SQL Server tlog

  • 内存优化表上不支持 CDC 操作。该限制适用于 SQL Server 2014 (在此版本中首次引入该功能) 和更高版本。

捕获 SQL Server 的数据更改

对于自管理 SQL Server 源,AWS DMS 使用以下内容:

  • MS-Replication,用于捕获具有主键的表的更改。您可以通过在源 SQL Server 实例上向 AWS DMS 终端节点用户提供 sysadmin 权限来自动配置此项。或者,也可以按照本部分中提供的步骤操作,准备源并针对 AWS DMS 终端节点使用非 sysadmin 用户。

  • MS-CDC,用于捕获不带主键的表的更改。MS-CDC 必须在数据库级别上启用,而且分别适用于各个表。

对于在 Amazon RDS 上运行的 SQL Server 源,AWS DMS 使用 MS-CDC 捕获带或不带主键的表的更改。MS-CDC 必须在数据库级别上启用,而且分别适用于各个表(使用本节所述特定于 Amazon RDS 的存储过程)。

您可以通过以下几种方式使用 SQL Server 数据库进行持续复制 (CDC):

  • 使用 sysadmin 角色设置持续复制。(这仅适用于自管理 SQL Server 源。)

  • 将持续复制设置为不使用 sysadmin 角色。(这仅适用于自管理 SQL Server 源。)

  • 为 Amazon RDS for SQL Server 数据库实例设置持续复制。

使用 sysadmin 角色设置持续复制

对于带主键的表,AWS DMS 可以在源上配置所需的项目。对于不带主键的表,您需要设置 MS-CDC。

首先,您必须运行以下命令为数据库启用 MS-CDC。使用分配了 sysadmin 角色的账户。

use [DBname] EXEC sys.sp_cdc_enable_db

接下来,运行以下命令来为每个源表启用 MS-CDC。

EXECUTE sys.sp_cdc_enable_table @source_schema = N'MySchema', @source_name = N'MyTable', @role_name = NULL;

有关为特定表设置 MS-CDC 的更多信息,请参阅 SQL Server 文档

在未分配 sysadmin 角色的情况下设置持续复制

您可以为不需要用户账户具有 sysadmin 权限的 SQL Server 数据库源设置持续复制。

在不使用 sysadmin 角色的情况下设置 SQL Server 数据库源进行持续复制

  1. 使用 SQL Server Management Studio (SSMS) 创建采用密码身份验证的新 SQL Server 账户。在此示例中,我们使用一个名为 dmstest 的账户。

  2. 在 SSMS 的 User Mappings (用户映射) 部分中,选择 MSDB 和 MASTER 数据库 (将提供公有权限),然后为您要使用持续复制的数据库分配 DB_OWNER 角色。

  3. 打开新帐户的上下文 (右键单击) 菜单,选择 Security (安全性),然后显式授予 Connect SQL 权限。

  4. 运行以下授权命令。

    GRANT SELECT ON FN_DBLOG TO dmstest; GRANT SELECT ON FN_DUMP_DBLOG TO dmstest; GRANT VIEW SERVER STATE TO dmstest; use msdb; GRANT EXECUTE ON MSDB.DBO.SP_STOP_JOB TO dmstest; GRANT EXECUTE ON MSDB.DBO.SP_START_JOB TO dmstest; GRANT SELECT ON MSDB.DBO.BACKUPSET TO dmstest; GRANT SELECT ON MSDB.DBO.BACKUPMEDIAFAMILY TO dmstest; GRANT SELECT ON MSDB.DBO.BACKUPFILE TO dmstest;
  5. 在 SSMS 中,打开复制文件夹的上下文 (右键单击) 菜单,然后选择配置分发。按照所有默认步骤操作并且针对分发配置此 SQL Server 实例。在数据库下创建分发数据库。

  6. 使用以下过程创建发布。

  7. 使用您创建的用户账户创建具有作为源终端节点的 SQL Server 的新 AWS DMS 任务。

注意

此过程中的步骤仅适用于带主键的表。您仍需要为不带主键的表启用 MS-CDC。

为持续复制创建 SQL Server 发布

要将 CDC 与 SQL Server 结合使用,您必须为参与持续复制中的每个表创建发布。

为 SQL Server 持续复制创建发布

  1. 使用 SYSADMIN 用户账户登录 SSMS。

  2. 展开 Replication (复制)

  3. 打开 Local Publications (本地发布) 的上下文(右键单击)菜单。

  4. New Publication Wizard (新发布向导) 中,选择 Next (下一步)

  5. 选择要在其中创建发布的数据库。

  6. 选择 Transactional publication (事务性发布),然后选择 Next (下一步)

  7. 展开 Tables (表),选择具有 PK 的表(即要发布的表)。选择 Next (下一步)

  8. 选择 Next (下一步),然后选择 Next (下一步),因为您无需创建筛选器或快照代理。

  9. 选择 Security Settings (安全设置),然后选择 Run under the SQL Server Agent service account (在 SQL Server Agent 服务账户下运行)。确保为发布者连接选择 By impersonating the process account (通过模拟流程账户)。选择 OK

  10. 选择 Next (下一步)

  11. 选择 Create the publication (创建发布)

  12. 提供采用 AR_PUBLICATION_000<DBID> 格式的发布名称。

    例如,可将发布命名为 AR_PUBLICATION_00018。您还可以在 SQL Server 中使用 DB_ID 函数。有关 DB_ID 函数的更多信息,请参阅 SQL Server 文档

在 Amazon RDS for SQL Server 数据库实例上设置持续复制。

Amazon RDS for SQL Server 为 Amazon RDS for SQL Server Enterprise 所有版本(最高为 SQL Server 2016 SP1)支持 MS-CDC。SQL Server 2016 SP1 的标准版本和更高版本支持 MS-CDC for Amazon RDS for SQL Server。

不同于自管理 SQL Server 源,Amazon RDS for SQL Server 不支持 MS-Replication。因此,AWS DMS 需要对带或不带主键的表使用 MS-CDC。

Amazon RDS 未授予设置复制项目的 sysadmin 权限,AWS DMS 使用该权限在源 SQL Server 实例中进行持续更改。您必须在以下过程中使用主用户权限在 Amazon RDS 实例上启用 MS-CDC。

在 RDS for SQL Server 数据库实例上启用 MS-CDC

  1. 在数据库级别运行以下查询。

    exec msdb.dbo.rds_cdc_enable_db '<DB instance name>'
  2. 对于具有主键的每个表,运行以下查询以启用 MS-CDC。

    exec sys.sp_cdc_enable_table @source_schema = N'db_name', @source_name = N'table_name', @role_name = NULL, @supports_net_changes = 1 GO

    对于具有唯一键但没有主键的每个表,运行以下查询以启用 MS-CDC。

    exec sys.sp_cdc_enable_table @source_schema = N'db_name', @source_name = N'table_name', @index_name = N'unique_index_name' @role_name = NULL, @supports_net_changes = 1 GO

    对于既没有主键又没有唯一键的每个表,运行以下查询以启用 MS-CDC。

    exec sys.sp_cdc_enable_table @source_schema = N'db_name', @source_name = N'table_name', @role_name = NULL GO
  3. 使用以下命令设置要在源上可用的更改的保留周期。

    EXEC sys.sp_cdc_change_job @job_type = 'capture' ,@pollinginterval = 86400

    参数 @pollinginterval 按秒计。上述命令保留更改一天。AWS 建议在结合使用 MS-CDC 和 AWS DMS 时使用为期一天的保留周期。

支持的压缩方法

下表列出了 AWS DMS 在每个 SQL Server 版本中支持的压缩方法。

SQL Server 版本

行/页压缩 (在分区级别)

Vardecimal 存储格式

2005

2008

2012 年

2014

注意

不支持稀疏列和列式结构压缩。

使用 SQL Server AlwaysOn 可用性组

SQL Server AlwaysOn 可用性组配有高可用性和灾难恢复解决方案,提供数据库镜像的企业级替代功能。

要将 AlwaysOn 可用性组作为 AWS DMS 中的源,请执行以下操作:

  • 在您的可用性副本中的所有 SQL Server 实例上启用分发选项。

  • 在 AWS DMS 控制台中,打开 SQL Server 源数据库设置。对于服务器名称,请指定为可用性组侦听器配置的域名服务 (DNS) 名称或 IP 地址。

在首次启动 AWS DMS 任务时,可能需要比平常更长的时间。这种缓慢是因为可用性组服务器正在复制表项目的创建。

将 SQL Server 数据库配置为 AWS DMS 复制源

您可以将 SQL Server 数据库配置为 AWS DMS (AWS DMS) 复制源。如需最完整地对更改进行复制,我们建议您使用 SQL Server 的 Enterprise、Standard 或 Developer 版。必须使用这些版本之一,因为只有这些版本才包含 MS-Replication (EE、SE) 和 MS-CDC (EE、DEV)。源 SQL Server 还必须配置为完整备份。此外,AWS DMS 还必须使用某个用户(SQL Server 实例登录名)进行连接,该用户在您连接到的 SQL Server 数据库上具有 sysadmin 固定服务器角色。

您可以在下面找到有关将 SQL Server 配置为 AWS DMS 复制源的信息。

将 SQL Server 作为 AWS DMS 源时的额外连接属性

您可以使用额外的连接属性配置 SQL Server 源。在创建源终端节点时,您可以指定这些设置。如果您具有多个连接属性设置,请用分号将它们彼此分开,并且不需要额外的空格。

下表显示了将 SQL Server 作为源时可使用的额外连接属性:

名称 描述

safeguardPolicy

为实现最佳性能,AWS DMS 尝试从活动事务日志 (TLOG) 捕获所有未读取的更改。不过,有时由于截断,有效的 TLOG 可能未包含所有未读取的更改。在出现此情况时,AWS DMS 将访问备份日志以捕获缺少的更改。为了最大程度地减小访问备份日志的需求,AWS DMS 使用下列方法之一阻止截断:

1.在数据库中启动事务:这是默认方法。在使用此方法时,AWS DMS 通过模仿数据库中的事务来阻止 TLOG 截断。只要打开此类事务,事务开始后出现的更改就会被截断。如果您需要在数据库中启用 Microsoft Replication,则必须选择该方法。

2. 在单个任务中独占使用 sp_repldone:在使用该方法时,AWS DMS 读取更改,然后使用 sp_repldone 将 TLOG 事务标记为可以截断。虽然此方法不涉及任何事务性活动,但只能在 Microsoft Replication 未运行时使用它。此外,在使用此方法时,仅一个 AWS DMS 任务可在任意给定时间访问数据库。因此,如果需要对同一数据库运行并行 AWS DMS 数据库,请使用默认方法。

默认值:RELY_ON_SQL_SERVER_REPLICATION_AGENT

有效值:{EXCLUSIVE_AUTOMATIC_TRUNCATIONRELY_ON_SQL_SERVER_REPLICATION_AGENT}

示例:safeguardPolicy=RELY_ON_SQL_SERVER_REPLICATION_AGENT;

readBackupOnly

当此参数设置为 Y 时,AWS DMS 在持续复制期间仅从事务日志备份中读取更改,而不从活动事务日志文件中读取。通过将此参数设置为 Y,可以在完全加载和持续复制任务期间控制活动事务日志文件的增长。但是,它会向持续复制添加一些源延迟。

有效值:NY.默认为 N

示例:readBackupOnly=Y;

SQL Server 的源数据类型

将 SQL Server 作为 AWS DMS 源的数据迁移支持大多数 SQL Server 数据类型。下表列出了使用 AWS DMS 时支持的 SQL Server 源数据类型以及来自 AWS DMS 数据类型的默认映射。

有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。

有关 AWS DMS 数据类型的其他信息,请参阅AWS Database Migration Service 的数据类型

SQL Server 数据类型

AWS DMS 数据类型

BIGINT

INT8

BIT

BOOLEAN

DECIMAL

NUMERIC

INT

INT4

MONEY

NUMERIC

NUMERIC (p,s)

NUMERIC

SMALLINT

INT2

SMALLMONEY

NUMERIC

TINYINT

UINT1

REAL

REAL4

FLOAT

REAL8

DATETIME

DATETIME

DATETIME2 (SQL Server 2008 和更高版本)

DATETIME

SMALLDATETIME

DATETIME

DATE

DATE

TIME

TIME

DATETIMEOFFSET

WSTRING

CHAR

STRING

VARCHAR

STRING

VARCHAR (max)

CLOB

TEXT

要将此数据类型用于 AWS DMS,必须允许对特定任务使用 CLOB 数据类型。

对于 SQL Server 表,AWS DMS 将为 UPDATE 语句更新目标中的 LOB 列,但不更改 SQL Server 中的 LOB 列的值。

在 CDC 期间,AWS DMS 仅在包含主键的表中支持 CLOB 数据类型。

NCHAR

WSTRING

NVARCHAR (length)

WSTRING

NVARCHAR (max)

NCLOB

NTEXT

要将此数据类型用于 AWS DMS,必须允许对特定任务使用 NCLOB 数据类型。

对于 SQL Server 表,AWS DMS 将为 UPDATE 语句更新目标中的 LOB 列,但不更改 SQL Server 中的 LOB 列的值。

在 CDC 期间,AWS DMS 仅在包含主键的表中支持 CLOB 数据类型。

BINARY

BYTES

VARBINARY

BYTES

VARBINARY (max)

BLOB

IMAGE

对于 SQL Server 表,AWS DMS 将为 UPDATE 语句更新目标中的 LOB 列,但不更改 SQL Server 中的 LOB 列的值。

要将此数据类型用于 AWS DMS,必须允许对特定任务使用 BLOB 数据类型。

AWS DMS 仅在包含主键的表中支持 BLOB 数据类型。

TIMESTAMP

BYTES

UNIQUEIDENTIFIER

STRING

HIERARCHYID

在复制到 SQL Server 目标终端节点时,使用 HIERARCHYID。

在复制到所有其他目标终端节点时,使用 WSTRING (250)。

XML

NCLOB

对于 SQL Server 表,AWS DMS 将为 UPDATE 语句更新目标中的 LOB 列,但不更改 SQL Server 中的 LOB 列的值。

要将此数据类型用于 AWS DMS,必须允许对特定任务使用 NCLOB 数据类型。

在 CDC 期间,AWS DMS 仅在包含主键的表中支持 NCLOB 数据类型。

GEOMETRY

在复制到支持此数据类型的目标终端节点时,使用 GEOMETRY。

在复制到不支持此数据类型的目标终端节点时,使用 CLOB。

GEOGRAPHY

在复制到支持此数据类型的目标终端节点时,使用 GEOGRAPHY。

在复制到不支持此数据类型的目标终端节点时,使用 CLOB。

AWS DMS 不支持包含以下数据类型的字段的表:

  • CURSOR

  • SQL_VARIANT

  • TABLE

注意

根据用户定义的数据类型的基类型来支持这些类型。例如,基于 DATETIME 的用户定义的数据类型将作为 DATETIME 数据类型进行处理。