使用 PowerShell 管理 AWS DMS 数据库博客
- 14
使用 PowerShell 管理 AWS DMS
关键要点
在进行数据库迁移到 AWS 的规划和实施过程中,数据迁移是一个重要阶段,通常需要使用数据迁移与复制工具,比如 AWS 数据库迁移服务AWS DMS。AWS DMS 是一项云服务,能够实时迁移关系数据库、数据仓库、NoSQL 数据库等数据存储类型,简化了迁移过程,自动化了架构转换、数据复制和保持数据一致性。使用 PowerShell 自动化 AWS DMS 数据库迁移具有许多优势,包括原生支持 Windows 操作系统以及跨平台支持 Linux 和 MacOS。
在本文中,我们将探讨如何使用 PowerShell 和 AWS Tools for PowerShell 自动创建 AWS DMS 实例及任务,以便将数据库迁移到 AWS。我们将讨论如何设置必要的资源、配置 AWS DMS 复制实例和任务、监控迁移进程以及使用 PowerShell 命令进行故障排查。
解决方案概述
在本文章中,我们使用 PowerShell 自动将数据库迁移到 Amazon RDS for SQL Server。下图展示了解决方案的架构概况。
该过程包括以下步骤:
从 GitHub 仓库 下载 PowerShell 脚本到本机工作站。在 AWS DMS 中运行 PowerShell 脚本以创建必要资源,如:安全组复制子网复制实例数据库端点迁移任务由自动化脚本调用 AWS DMS 迁移任务,将数据加载到目标数据库实例中。使用 PowerShell 脚本通过 Amazon CloudWatch 进行故障排查 AWS DMS 迁移任务失败的情况。前提条件
要跟随本文进行操作,您必须具备以下前提条件:
一个已激活的 AWS 账户,并已部署一个 RDS 实例。有关支持的引擎的详细信息,请参见 Amazon RDS 功能。在将运行脚本的工作站上安装 Microsoft PowerShell 31 至 51,或 PowerShell Core 60 或更高版本。安装 AWSPowerShell。在 AWS 目标账户中配置一个 AWS 身份与访问管理IAM用户,权限包括实现和管理以下资源:AWS DMSCloudWatch 仪表盘及警报在 PowerShell 控制台中设置 IAM 凭证。运行 Microsoft SQL Server 实例,可能是在本地或 Amazon Elastic Compute CloudAmazon EC2。在 AWS 上运行的 RDS for SQL Server 实例。已将 AdventureWorks2016 数据库恢复在源环境中。已在目标环境中创建 AdventureWorks2016 数据库架构。源和目标数据库实例已按以下文档描述的方式配置,以供 AWS DMS 使用:数据迁移源数据迁移目标虽然解决方案使用 Amazon RDS for SQL Server 作为目标平台,但本文所述的步骤也适用于其他受支持的端点,仅需稍作修改。
创建所需的 AWS DMS 角色
由于您首次使用 PowerShell 来准备 AWS DMS 资源,您需要创建两个 IAM 角色,名称为 dmsvpcrole 和 dmscloudwatchlogsrole。建议使用这些角色名称。 这些角色允许 AWS DMS 代表您创建和管理 AWS 账户中的资源。
要创建这些角色,请运行以下脚本,或者从 GitHub 仓库运行 createiamroleps1 脚本:
powershell[string]dmsAssumeRolePolicyDocument = { Version 20121017 Statement [ { Effect Allow Principal { Service dmsamazonawscom } Action stsAssumeRole } ] }
try{DMSVpcRoleName = dmsvpcrole
NewIAMRole RoleName DMSVpcRoleName AssumeRolePolicyDocument dmsAssumeRolePolicyDocumentStartSleep Seconds 5
RegisterIAMRolePolicy RoleName DMSVpcRoleName PolicyArn arnawsiamawspolicy/servicerole/AmazonDMSVPCManagementRole}catch {WriteError }
try{DMSCloudWatchRoleName = dmscloudwatchlogsrole
NewIAMRole RoleName DMSCloudWatchRoleName AssumeRolePolicyDocument dmsAssumeRolePolicyDocument
StartSleep Seconds 5RegisterIAMRolePolicy RoleName DMSCloudWatchRoleName PolicyArn arnawsiamawspolicy/servicerole/AmazonDMSCloudWatchLogsRole
}catch {WriteError }
您应获得以下输出:
plaintextPS CTempAWS Bloggt CTempAWS Blogcreateiamroleps1
Path RoleName RoleId CreateDate Description / dmsvpcrole AROA3L4QBF7IAPKWYEXEC 01/03/2024 141555 / dmscloudwatchlogsrole AROA3L4QBF7IMWL7XJAN4 01/03/2024 141601
部署新的 AWS DMS 复制实例
AWS DMS 复制实例是数据库迁移的核心组件之一。当您首次部署 AWS DMS 时,复制实例会在 VPC 中创建。您将使用此复制实例来执行数据库迁移。
创建复制子网组
复制子网组是您所选 VPC 中两个或多个可用子网的逻辑组合。在部署 AWS DMS 实例之前,最好创建一个新的复制子网组,并仅包括您希望用于 AWS DMS 流量的子网。如果已经存在复制子网组,您可以跳过此步骤,从而节省时间和精力。
要创建新的复制子网组,请运行以下脚本,或从 GitHub 仓库运行 createdmsreplicationsubnetgroupps1 脚本:
powershell
复制子网的名称
ReplicationSubnetGroupIdentifier = dmsreplicationsubnetgroupReplicationSubnetGroupDescription = DMS 子网组
您希望作为 DMS 复制子网组的一部分包含的子网 ID
AWSSubnets = @(YourSubnetId1 YourSubnetId2) if (!(GetDMSReplicationSubnetGroup WhereObject {ReplicationSubnetGroupIdentifier eq ReplicationSubnetGroupIdentifier})){ # 创建新的 DMS 复制子网组。 NewDMSReplicationSubnetGroup ReplicationSubnetGroupIdentifier ReplicationSubnetGroupIdentifier ReplicationSubnetGroupDescription ReplicationSubnetGroupDescription SubnetId AWSSubnets}
命令的输出返回创建的复制子网组的属性。请注意 ReplicationSubnetGroupIdentifier,因为您会在后面的步骤中使用它。
plaintextPS CTempAWS Bloggt CTempAWS Blogcreatedmsreplicationsubnetgroupps1
ReplicationSubnetGroupDescription DMS Subnet GroupReplicationSubnetGroupIdentifier dmsreplicationsubnetgroupSubnetGroupStatus CompleteSubnets {AmazonDatabaseMigrationServiceModelSubnet AmazonDatabaseMigrationServiceModelSubnet}VpcId vpc0fe44eb01203a54bb
您还可以在 AWS DMS 控制台上检查复制子网组的状态。

创建安全组
为了增强安全性并改进 AWS 账户内资源通讯的可见性,建议创建一个专用于 AWS DMS 复制实例的安全组。
要创建新的安全组,请运行以下脚本,或从 GitHub 仓库运行 createdmssecuritygroupps1 脚本:
powershellSecurityGroupName = dmssecgroupDescription = AWS DMS 的安全组
您希望在哪个 VPC 中部署 DMS 资源的 VPC Id
VpcId = YourVpcIp
NewEC2SecurityGroup GroupName SecurityGroupName Description Description VpcId VpcId
请注意命令输出中返回的安全组 ID,以便在后续步骤中使用:
plaintextPS CTempAWS Bloggt CTempAWS Blogcreatedmssecuritygroupps1sg0f57d952a8ec41412
创建 AWS DMS 复制实例
接下来,您可以部署新的 AWS DMS 复制实例。
根据您的环境和需求更改提供代码中的命令参数。默认情况下,脚本创建的 AWS DMS 复制实例的实例类型为 dmsr5large,配备 50 GB 存储。这些默认值适合本文目的,可以根据需要进行调整。脚本会创建单可用区的 AWS DMS 复制实例,并确保使用最新的 AWS DMS 版本。
要创建 AWS DMS 实例,请运行以下脚本,或从 GitHub 仓库运行 createdmsreplicationinstanceps1 脚本:
powershell
根据您的环境需求更改
ReplicationInstanceIdentifier = dmsinstance01
这是在前一节中创建的复制子网组
ReplicationSubnetGroupIdentifier = dmsreplicationsubnetgroup
这是在前一节中创建的安全组
VpcSecurityGroupId = sg0f57d952a8ec41412
根据您的环境更改
ResourceIdentifier = dmsinstance01ReplicationInstanceClass = dmsr5largeAllocatedStorage = 50EngineVersion = 352
DMSInstanceObject = NewDMSReplicationInstance ReplicationInstanceIdentifier ReplicationInstanceIdentifier ReplicationSubnetGroupIdentifier ReplicationSubnetGroupIdentifier VpcSecurityGroupId VpcSecurityGroupId ResourceIdentifier ResourceIdentifier ReplicationInstanceClass ReplicationInstanceClass AllocatedStorage AllocatedStorage EngineVersion EngineVersion
While (DMSInstanceObjectReplicationInstanceStatus eq creating) {
DMSInstanceObject = GetDMSReplicationInstance WhereObject { ReplicationInstanceIdentifier eq ReplicationInstanceIdentifier } WriteOutput DMS 实例创建状态 (DMSInstanceObjectReplicationInstanceStatus) StartSleep Seconds 10}
脚本会每 10 秒检查一次实例创建的状态。您应获得以下输出:
plaintextPS CTempAWS Bloggt CTempAWS Blogcreatedmsreplicationinstanceps1DMS 实例创建状态 creatingDMS 实例创建状态 creatingDMS 实例创建状态 creatingDMS 实例创建状态 creatingDMS 实例创建状态 creating
在您的 AWS DMS 复制实例准备过程完成后,AWS DMS 实例创建状态会变为可用:
plaintextDMS 实例创建状态 creatingDMS 实例创建状态 creatingDMS 实例创建状态 available
创建源和目标端点
端点提供了连接、数据存储类型和数据存储位置的信息。AWS DMS 使用端点连接数据存储并将数据从源迁移到目标端点。根据所选的端点类型,端点提供多个配置设置。
创建源端点
在我们的示例中,我们创建了一个连接到运行在 Amazon EC2 上的 SQL Server 实例的源端点。如果您是从本地 SQL Server 迁移,步骤是相同的。
根据您的环境,更改突出显示的值以适应您的需求。此外,可以使用 AWS Secrets Manager 存储秘密,并在此脚本中使用 AWSPowerShell 检索它们。
要创建源端点,请运行以下脚本,或从 GitHub 仓库运行 createdmssourceendpointps1 脚本:
powershellEndpointSettings = @{ EndpointIdentifier = sourcesql2019 MicrosoftSQLServerSettingsDatabaseName = AdventureWorks2016 MicrosoftSQLServerSettingsPassword = ReadHost 输入密码 AsSecureString MicrosoftSQLServerSettingsPort = 1433 MicrosoftSQLServerSettingsServerName = 1001192 MicrosoftSQLServerSettingsUsername = dmssrcusr EngineName = sqlserver EndpointType = source}
BSTR = [SystemRuntimeInteropServicesMarshal]SecureStringToBSTR(EndpointSettingsMicrosoftSQLServerSettingsPassword) EndpointPassword = [SystemRuntimeInteropServicesMarshal]PtrToStringAuto(BSTR)
EndpointStatus = NewDMSEndpoint EndpointIdentifier EndpointSettingsEndpointIdentifier EndpointType EndpointSettingsEndpointType EngineName EndpointSettingsEngineNameMicrosoftSQLServerSettingsDatabaseName EndpointSettingsMicrosoftSQLServerSettingsDatabaseName MicrosoftSQLServerSettingsPassword EndpointPasswordMicrosoftSQLServerSettingsPort EndpointSettingsMicrosoftSQLServerSettingsPort MicrosoftSQLServerSettingsServerName EndpointSettingsMicrosoftSQLServerSettingsServerNameMicrosoftSQLServerSettingsUsername EndpointSettingsMicrosoftSQLServerSettingsUsername
WriteOutput 端点状态 (EndpointStatusStatus)
EndpointIdentifier 参数名称中不得包含下划线字符。
端点的配置几乎是即时的,您应在输出中看到显示的活动状态:
plaintextPS CTempAWS Bloggt CTempAWS Blogcreatedmssourceendpointps1端点状态 active
创建目标端点
在我们的示例中,我们创建目标端点,连接到 RDS for SQL Server 实例。创建此端点与创建源端点类似,只需将 EndpointType 参数从 source 更改为 target。
苹果加速器永久免费版根据您的环境,更改突出显示的值来适配需求。您还可以使用 AWS Secrets Manager 存储秘密,并在此脚本中使用 AWSPowerShell 检索它们。
要创建目标端点,请运行以下脚本,或从 GitHub 仓库运行 createdmstargetendpointps1 脚本:
powershellEndpointSettings = @{ EndpointIdentifier = targetsql2019 MicrosoftSQLServerSettingsDatabaseName = AdventureWorks2016 MicrosoftSQLServerSettingsPassword = ReadHost 输入密码 AsSecureString MicrosoftSQLServerSettingsPort = 1433 MicrosoftSQLServerSettingsServerName = RDSInstanceEndpoint # 应根据您的环境需求进行更改 MicrosoftSQLServerSettingsUsername = dmstgtusr EngineName = sqlserver EndpointType = target}
BSTR = [SystemRuntimeInteropServicesMarshal]SecureStringToBSTR(EndpointSettingsMicrosoftSQLServerSettingsPassword) EndpointPassword = [SystemRuntimeInteropServicesMarshal]PtrToStringAuto(BSTR)
EndpointStatus = NewDMSEndpoint EndpointIdentifier EndpointSettingsEndpointIdentifier EndpointType