

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 数据库
<a name="databases-pattern-list"></a>

**Topics**
+ [使用链接服务器从亚马逊 EC2 上的微软 SQL Server 访问本地微软 SQL Server 表](access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers.md)
+ [使用只读副本 PeopleSoft 在 Amazon RDS Custom 上将 HA 添加到 Oracle](add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica.md)
+ [分析对象依赖关系以将部分数据库数据从 Oracle 迁移到 PostgreSQL](multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql.md)
+ [评测将 SQL Server 数据库迁移至 MongoDB Atlas on AWS 的查询性能](assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws.md)
+ [使用 IaC 原则自动 blue/green 部署 Amazon Aurora 全球数据库](p-automate-blue-green-deployments-aurora-global-databases-iac.md)
+ [在跨区域自动复制 Amazon RDS 实例 AWS 账户](automate-the-replication-of-amazon-rds-instances-across-aws-accounts.md)
+ [使用 AWS Lambda 任务计划程序在亚马逊 EC2 上运行的 SQL Server Express 版中自动执行数据库任务](automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.md)
+ [使用 DR Orchestrator Framework 自动执行跨区域故障转移和故障恢复](automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.md)
+ [使用 Systems Manager 自动备份 SAP HANA 数据库和 EventBridge](automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge.md)
+ [使用 Python 应用程序为 Amazon DynamoDB 自动生成 PynamoDB 模型和 CRUD 函数](automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.md)
+ [通过使用 Cloud Custodian 来阻止对 Amazon RDS 的公有访问](block-public-access-to-amazon-rds-by-using-cloud-custodian.md)
+ [使用为适用于微软 SQL Server 的亚马逊 RDS 配置 Windows 身份验证 AWS Managed Microsoft AD](configure-windows-authentication-for-amazon-rds-using-microsoft-ad.md)
+ [配置对 Amazon DynamoDB 的跨账户访问](configure-cross-account-access-to-amazon-dynamodb.md)
+ [在 AWS 上的 SQL Server 的“始终打开”可用性组中配置只读路由](configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws.md)
+ [在 pgAdmin 中使用 SSH 隧道进行连接](connect-by-using-an-ssh-tunnel-in-pgadmin.md)
+ [将 JSON Oracle 查询转换至 PostgreSQL 数据库 SQL](convert-json-oracle-queries-into-postgresql-database-sql.md)
+ [使用跨账户复制 Amazon DynamoDB 表 AWS Backup](copy-amazon-dynamodb-tables-across-accounts-using-aws-backup.md)
+ [使用自定义实施，跨账户复制 Amazon DynamoDB 表](copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.md)
+ [为 Amazon RDS 和 Amazon Aurora 创建详细的成本和使用情况报告](create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora.md)
+ [使用 Terraform 在亚马逊 EC2 和亚马逊 FSx 上部署 SQL Server 故障转移集群实例](deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.md)
+ [在 Amazon Aurora PostgreSQL 中模拟 Oracle PL/SQL 关联数组和适用于 PostgreSQL 的亚马逊 RDS](emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql.md)
+ [在 Amazon RDS 中为 PostgreSQL 数据库实例启用加密连接](enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.md)
+ [加密现有 Amazon RDS for PostgreSQL 数据库实例](encrypt-an-existing-amazon-rds-for-postgresql-db-instance.md)
+ [在启动时强制对 Amazon RDS 数据库执行自动标记](enforce-automatic-tagging-of-amazon-rds-databases-at-launch.md)
+ [估算按需容量的 DynamoDB 表成本](estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.md)
+ [估算 Amazon DynamoDB 表的存储成本](estimate-storage-costs-for-an-amazon-dynamodb-table.md)
+ [使用 AWR 报告估计 Oracle 数据库的 Amazon RDS 引擎大小](estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.md)
+ [使用 AWS DMS 将 Amazon RDS for SQL Server 表导出至 S3 存储桶](export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.md)
+ [在 Aurora PostgreSQL 中处理动态 SQL 语句中的匿名块](handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql.md)
+ [帮助强制执行 DynamoDB 标签](help-enforce-dynamodb-tagging.md)
+ [通过 AWS DMS 和 Amazon Aurora 实施跨区域灾难恢复](implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora.md)
+ [将含有 100 多个参数的 Oracle 函数和过程迁移到 PostgreSQL](migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql.md)
+ [将 Redis 工作负载迁移至 Redis Enterprise Cloud on AWS](migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.md)
+ [使用具有相同主机名的 SAP HSR 将 SAP HANA 迁移至 AWS](migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname.md)
+ [使用迁移微软 SQL Server Always On 可用性组 AWS Application Migration Service](migrate-microsoft-sql-server-always-on-group-using-mgn.md)
+ [使用分布式可用性组将 SQL Server 迁移至 AWS](migrate-sql-server-to-aws-using-distributed-availability-groups.md)
+ [将关系数据库迁移到 MongoDB Atlas AWS](migrate-relational-database-to-mongodb-atlas.md)
+ [将自托管 MongoDB 环境迁移到 MongoDB Atlas AWS](migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud.md)
+ [使用 AWS DMS 将 Oracle 数据库迁移至 Amazon DynamoDB](migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms.md)
+ [使用和 A SharePlex WS DMS 从 Oracle 8i 或 9i 迁移到 Amazon RDS for Oracle](migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms.md)
+ [将本地 MySQL 数据库迁移至 Amazon EC2](migrate-an-on-premises-mysql-database-to-amazon-ec2.md)
+ [监控 Amazon Aurora 以查找未加密的实例](monitor-amazon-aurora-for-instances-without-encryption.md)
+ [使用亚马逊监控 Oracle GoldenGate 日志 CloudWatch](monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.md)
+ [从 Oracle Database Enterprise Edition 更换平台到 Amazon RDS for Oracle 上的 Standard Edition 2。](replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle.md)
+ [使用 Precission Connect 将大型机数据库复制到 AWS](replicate-mainframe-databases-to-aws-by-using-precisely-connect.md)
+ [使用 Lambda 和 Secrets Manager 计划适用于 Amazon RDS for PostgreSQL 和 Aurora PostgreSQL 的任务](schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager.md)
+ [使用本地 SMTP 服务器和数据库邮件发送 Amazon RDS for SQL Server 数据库实例通知](send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.md)
+ [在 IBM Db2 on AWS 上为 SAP 设置灾难恢复](set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.md)
+ [使用 Terraform 为数据库迁移设置 CI/CD 管道](set-up-ci-cd-pipeline-for-db-migration-with-terraform.md)
+ [EC2 使用 FSx 适用于 Windows 文件服务器的亚马逊上设置微软 SQL Server 故障转移群集](microsoft-sql-failover-cluster-on-amazon-ec2.md)
+ [在 Amazon RDS Custom 上为 Oracle 电子商务套件设置 HA/DR 架构，并使用活动备用数据库](set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database.md)
+ [将数据从 IBM Db2、SAP、Sybase 和其他数据库流式传输到 MongoDB Atlas AWS](stream-data-from-ibm-db2-to-mongodb-atlas.md)
+ [在 Amazon RDS 上为 Oracle PeopleSoft 应用程序过渡角色适用于 Oracle 定制](transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle.md)
+ [将不同账户中的 Amazon Redshift 集群中的数据卸载到 Amazon S3](unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.md)
+ [按照工作负载分类的数据库迁移模式](databases-database-migration-patterns-by-workload-pattern-list.md)
+ [更多模式](databases-more-patterns-pattern-list.md)

# 使用链接服务器从亚马逊 EC2 上的微软 SQL Server 访问本地微软 SQL Server 表
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers"></a>

*Tirumala Dasari 和 Eduardo Valentim，Amazon Web Services*

## Summary
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-summary"></a>

此模式描述了如何使用链接服务器从运行或托管在亚马逊弹性计算云 (亚马逊 EC2) Windows 或 Linux 实例上的微软 SQL Server 数据库访问在微软 Windows 上运行的本地微软 SQL Server 数据库表。

## 先决条件和限制
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 在亚马逊 EC2 Linux AMI（亚马逊机器映像）上运行微软 SQL Server 的亚马逊
+ 本地微软 SQL Server (Windows) 服务器和 Windows 或 Linux EC2 实例之间的 AWS Direct Connect

**产品版本**
+ SQL Server 2016 或更高版本

## 架构
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-architecture"></a>

**源技术堆栈**
+ 在 Windows 上运行的本地 Microsoft SQL Server 数据库
+ 亚马逊 EC2 的微软 SQL Server 在 Windows AMI 或 Linux AMI 上运行

**目标技术堆栈**
+ 亚马逊 EC2 ，微软 SQL Server 在亚马逊 Linux AMI 上运行
+ 亚马逊 EC2 搭载微软 SQL Server 在 Windows AMI 上运行

**源数据库和目标数据库架构**

![\[AWS 云 architecture with VPC, availability zones, and hybrid environment connecting to on-premises database.\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/8e4a3222-0850-4980-8028-c710dcdb9186/images/fa157992-0ed9-46e1-8059-0cbbb74a98ec.png)


## 工具
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-tools"></a>
+ [Microsoft SQL Server Management Studio (SSMS)](https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16) 是用于管理 SQL Server 基础结构的集成环境。它提供了用户界面和一组工具，其中包含与 SQL Server 交互的丰富脚本编辑器。

## 操作说明
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-epics"></a>

### 在 Windows SQL Server 中将 SQL Server 的身份验证模式更改为 Windows
<a name="change-authentication-mode-to-windows-for-sql-server-in-windows-sql-server"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 通过 SSMS 连接到 Windows SQL Server。 |  | 数据库管理员 | 
| 从 Windows SQL Server 实例的上下文（右键单击）菜单中将身份验证模式更改为 SQL Server 中的 Windows。 |  | 数据库管理员 | 

### 重新启动 Windows MSSQL 服务
<a name="restart-the-windows-mssql-service"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 重新启动 SQL 服务。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers.html) | 数据库管理员 | 

### 在 Windows SQL Server 中创建新登录名并选择要访问的数据库
<a name="create-new-login-and-choose-databases-to-access-in-windows-sql-server"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在“安全”选项卡中，打开“登录”的上下文（右键单击）菜单，然后选择新的登录名。 |  | 数据库管理员 | 
| 在“常规”选项卡中，选择“SQL Server 身份验证”，输入用户名，输入密码，然后确认密码并清除用于在下次登录时更改密码的选项。 |  | 数据库管理员 | 
| 在“服务器角色”选项卡中，选择“公共”。 |  | 数据库管理员 | 
| 在“用户映射”选项卡中，选择要访问的数据库和架构，然后突出显示该数据库以选择数据库角色。 | 选择“public”和“db\$1datareader”以访问数据库表中的数据。 | 数据库管理员 | 
| 选择“确定”以创建用户。 |  | 数据库管理员 | 

### 将 Windows SQL Server IP 添加到 Linux SQL Server 主机文件
<a name="add-windows-sql-server-ip-to-linux-sql-server-host-file"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 通过终端窗口连接到 Linux SQL Server 框。 |  | 数据库管理员 | 
| 打开 /etc/hosts 文件，并使用 SQL Server 添加 Windows 计算机的 IP 地址。 |  | 数据库管理员 | 
| 保存主机文件。 |  | 数据库管理员 | 

### 在 Linux SQL Server 上创建链接服务器
<a name="create-linked-server-on-linux-sql-server"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用存储过程 master.sys.sp\$1addlinkedserver 和 master.dbo.sp\$1addlinkedsrvlogin 创建链接服务器。 | 有关使用这些存储过程的详细信息，请参阅*其他信息*部分。 | 数据库管理员、开发人员 | 

### 验证在 SSMS 中创建的链接服务器和数据库
<a name="verify-the-created-linked-server-and-databases-in-ssms"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 SSMS 的 Linux SQL Server 中，转到“链接服务器”并刷新。 |  | 数据库管理员 | 
| 在左窗格中展开创建的链接服务器和目录。 | 您将看到选定的 SQL Server 数据库以及表和视图。 | 数据库管理员 | 

### 验证是否可以访问 Windows SQL Server 数据库表
<a name="verify-that-you-can-access-windows-sql-server-database-tables"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 SSMS 查询窗口中，运行查询：“select top 3 \$1 from [sqllin].dms\$1sample\$1win.dbo.mlb\$1data”。 | 请注意，FROM 子句使用由四部分组成的语法：computer.database.schema.table（例如，从 [sqllin] .master.sys.databases 中选择名称 “数据库”SQL2 ）。在我们的示例中，我们在主机文件 SQL2 中为创建了别名，因此您无需在方括号之间输入实际的 NetBIOS 名称。如果您使用实际的 NetBIOS 名称，请注意，AWS 默认使用 Win-xxxx 等 NetBIOS 名称，并且 SQL Server 要求使用方括号作为带破折号的名称。 | 数据库管理员、开发人员 | 

## 相关资源
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-resources"></a>
+ [Linux 上的 SQL Server 发行说明](https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-release-notes?view=sql-server-2017) 

 

## 附加信息
<a name="access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers-additional"></a>

**使用存储过程创建链接服务器**

SSMS 不支持为 Linux SQL Server 创建链接服务器，因此必须使用以下存储过程来创建它们：

```
EXEC master.sys.sp_addlinkedserver @server= N'SQLLIN' , @srvproduct= N'SQL Server'    
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'SQLLIN',@useself=N'False',@locallogin=NULL,@rmtuser=N'username',@rmtpassword='Test123$'
```

注 1：在存储过程 `master.dbo.sp_addlinkedsrvlogin` 中输入您之前在 Windows SQL Server 中创建的登录凭据。

注 2：`@server` 名称 `SQLLIN` 和主机文件条目名称 `172.12.12.4 SQLLIN` 应相同。

 您可以使用此过程为以下方案创建链接服务器：
+ Linux SQL Server 通过链接服务器到 Windows SQL Server（在此模式中指定）
+ Windows SQL Server 通过链接服务器到 Linux SQL Server
+ Linux SQL Server 通过链接服务器连接到另一个 Linux SQL Server

# 使用只读副本 PeopleSoft 在 Amazon RDS Custom 上将 HA 添加到 Oracle
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica"></a>

*Sampath Kathirvel，Amazon Web Services*

## Summary
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-summary"></a>

要在亚马逊网络服务 (AWS) 上运行 [Oracle PeopleSoft](https://www.oracle.com/applications/peoplesoft/) 企业资源规划 (ERP) 解决方案，您可以使用[亚马逊关系数据库服务 (Amazon RDS) 或 Ama](https://aws.amazon.com/rds/) [zon RDS Custom for Oracle](https://aws.amazon.com/rds/custom/)，后者支持需要访问底层操作系统和数据库环境的传统、自定义和打包应用程序。有关规划迁移时需要考虑的关键因素，请参阅 AWS Prescriptive Guidance 中的 [Oracle 数据库迁移策略](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/strategies.html)。

在撰写本文时，RDS Custom for Oracle 不支持[多可用区](https://aws.amazon.com/blogs/aws/multi-az-option-for-amazon-rds-oracle/)选项，该选项可作为使用存储复制的[Amazon RDS for Oracle](https://aws.amazon.com/rds/oracle/) 的 HA 解决方案使用。相反，此模式通过使用备用数据库来创建和维护主数据库的物理副本来实现 HA。该模式侧重于使用 Oracle Data Guard 设置只读副本在 Amazon RDS Custom 上运行带高可用性的 PeopleSoft 应用程序数据库的步骤。

此模式还会将只读副本更改为只读模式。将只读副本置于只读模式可带来其他好处：
+ 从主数据库卸载只读工作负载
+ 通过使用 Oracle Active Data Guard 功能从备用数据库中检索正常运行的块，从而自动修复损坏的块
+ 使用 Far Sync 功能使远程备用数据库保持同步，而不会产生与长距离重做日志传输相关的性能开销。

在只读模式下使用副本需要 [Oracle Active Data Guard](https://www.oracle.com/assets/technology-price-list-070617.pdf) 选项，这需要额外付费，因为它是 Oracle Database Enterprise Edition 单独许可的功能。

## 先决条件和限制
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-prereqs"></a>

**先决条件**
+ Amazon RDS 定制版上的现有 PeopleSoft 应用程序。如果您没有应用程序，请参阅 “[将 Oracle 迁移 PeopleSoft 到 Amazon RDS Custom](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-oracle-peoplesoft-to-amazon-rds-custom.html)” 模式。
+ 单个 PeopleSoft 应用程序层。但是，您可以调整此模式以使用多个应用程序层。
+ Amazon RDS Custom 配置了至少 8 GB 的交换空间。
+ Oracle Active Data Guard 数据库许可证，用于将只读副本转换为只读模式，并使用它来将报告任务卸载到备用数据库。有关详细信息，请参阅 [Oracle 技术商业价目表](https://www.oracle.com/corporate/pricing/#technology)。

**限制**** **
+ [RDS Custom for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limits) 的一般限制和不支持的配置
+ [适用于 Oracle 的 Amazon RDS Custom 只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-rr.html#custom-rr.limitations)的相关限制

**产品版本**
+ 有关 Amazon RDS Custom 支持的 Oracle 数据库版本，请参阅[适用于 Oracle 的 RDS Custom](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.html#Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.ora)。
+ 有关 Amazon RDS Custom 支持的 Oracle 数据库实例类，请参阅[适用于 Oracle 的 RDS Custom 支持的数据库实例类](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.instances)。

## 架构
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-architecture"></a>

**目标技术堆栈**
+ 适用于 Oracle 的 Amazon RDS Custom
+ AWS Secrets Manager
+ Oracle Active Data Guard
+ 甲骨文 PeopleSoft 应用程序

**目标架构**

下图显示了 Amazon RDS Custom 数据库实例和 Amazon RDS Custom 只读副本。只读副本使用 Oracle Active Data Guard 复制到另一个可用区。您还可以使用只读副本卸载主数据库上的读取流量并用于报告目的。

![\[VPC 包括 AWS Secrets Manager、Amazon EFS、应用层和数据库层。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7df4b2d0-b833-4ba3-98e4-a178db395d9d/images/463aefbe-70ad-4cd3-9ddc-0d8347e848c6.png)


有关 PeopleSoft 在 AWS 上使用 Oracle 的代表性架构，请参阅[在 AWS 上设置高可用 PeopleSoft 架构](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/set-up-a-highly-available-peoplesoft-architecture-on-aws.html)。

## 工具
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-tools"></a>

**Amazon Web Services**
+ [适用于 Oracle 的 Amazon RDS Custom](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/working-with-custom-oracle.html) 是一项托管式数据库服务，适用于需要访问底层操作系统和数据库环境的旧版、自定义和打包应用程序。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 的 API 调用，以便以编程方式检索密钥。在这种模式中，您可以从 Secrets Manager 中使用密钥名称 `do-not-delete-rds-custom-+<<RDS Resource ID>>+-dg` 检索 `RDS_DATAGUARD` 的数据库用户密码。

**其他工具**
+ [Oracle Data Guard](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/preface.html#GUID-B6209E95-9DA8-4D37-9BAD-3F000C7E3590) 可帮助您创建、维护、管理和监控备用数据库。

## 最佳实践
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-best-practices"></a>

若要实现零数据丢失（RPO=0）目标，请使用 `MaxAvailability` Data Guard 保护模式，并使用重做传输 `SYNC+NOAFFIRM` 设置以获得更好的性能。有关选择数据库保护模式的详细信息，请参阅*其他信息*部分。

## 操作说明
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-epics"></a>

### 创建只读副本
<a name="create-the-read-replica"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建只读副本。 | 要创建 Amazon RDS Custom 数据库实例的只读副本，请按照 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.Create)中的说明操作，并使用您创建的 Amazon RDS Custom 数据库实例（请参阅*先决条件*部分）作为源数据库。默认情况下，Amazon RDS Custom 只读副本创建为物理备用副本，并处于已装载状态。这样做是为了确保遵守 Oracle Active Data Guard 许可。此模式包含用于设置多租户容器数据库 (CDB) 或非 CDB 实例的代码。 | 数据库管理员 | 

### 将 Oracle 数据卫士保护模式更改为 MaxAvailability
<a name="change-oracle-data-guard-protection-mode-to-maxavailability"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 访问主数据库上的 Data Guard 代理配置。 | 在此示例中，Amazon RDS Custom 只读副本对于非 CDB 实例为 `RDS_CUSTOM_ORCL_D`，对于 CDB 实例为 `RDS_CUSTOM_RDSCDB_B`。非 CDB 的数据库是 `orcl_a`（主数据库）和 `orcl_d`（备用数据库）。CDB 的数据库名称为 `rdscdb_a`（主数据库）和 `rdscdb_b`（备用数据库）。您可以直接或通过主数据库连接到 RDS Custom 只读副本。您可以在位于 `$ORACLE_HOME/network/admin` 目录中的 `tnsnames.ora` 文件中找到数据库的网络服务名称。RDS Custom for Oracle 会自动为您的主数据库和只读副本填充这些条目。`RDS_DATAGUARD` 用户的密码存储在 AWS Secrets Manager 中，密钥名称为 `do-not-delete-rds-custom-+<<RDS Resource ID>>+-dg`。有关如何使用从 Secrets Manager 检索到的 SSH（安全 Shell）密钥连接到 RDS 自定义实例的更多信息，请参阅[使用 SSH 连接到 RDS 自定义数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-creating.html#custom-creating.ssh)。要通过 Data Guard 命令行 (`dgmgrl`) 访问 Oracle Data Guard 代理配置，请使用以下代码。**非 CDB**<pre>$ dgmgrl RDS_DATAGUARD@RDS_CUSTOM_ORCL_D<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Fri Sep 30 22:44:49 2022<br />Version 19.10.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "ORCL_D"<br />Connected as SYSDG.<br />DGMGRL> <br />DGMGRL> show database orcl_d<br />Database - orcl_d<br />Role: PHYSICAL STANDBY<br />Intended State: APPLY-ON<br />Transport Lag: 0 seconds (computed 0 seconds ago)<br />Apply Lag: 0 seconds (computed 0 seconds ago)<br />Average Apply Rate: 11.00 KByte/s<br />Instance(s):<br />ORCL<br />SUCCESS<br />DGMGRL></pre>**CDB**<pre>-bash-4.2$ dgmgrl C##RDS_DATAGUARD@RDS_CUSTOM_RDSCDB_B<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Jan 11 20:24:11 2023<br />Version 19.16.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "RDSCDB_B"<br />Connected as SYSDG.<br />DGMGRL><br />DGMGRL> show database rdscdb_b<br />Database - rdscdb_b<br />  Role:               PHYSICAL STANDBY<br />  Intended State:     APPLY-ON<br />  Transport Lag:      0 seconds (computed 1 second ago)<br />  Apply Lag:          0 seconds (computed 1 second ago)<br />  Average Apply Rate: 2.00 KByte/s<br />  Real Time Query:    OFF<br />  Instance(s):<br />    RDSCDB<br />Database Status:<br />SUCCESS<br />DGMGRL></pre> | 数据库管理员 | 
| 通过从主节点连接到 DGMGRL 来更改日志传输设置。 | 将日志传输模式更改为 `FastSync`，对应于重做传输设置 `SYNC+NOAFFIRM`。若要确保在角色切换后具有有效的设置，请同时更改主数据库和备用数据库的设置。**非 CDB**<pre>DGMGRL><br />DGMGRL> edit database orcl_d set property logxptmode=fastsync;<br />Property "logxptmode" updated<br />DGMGRL> show database orcl_d LogXptMode;<br />LogXptMode = 'fastsync'<br />DGMGRL> edit database orcl_a set property logxptmode=fastsync;<br />Property "logxptmode" updated<br />DGMGRL> show database orcl_a logxptmode;<br />LogXptMode = 'fastsync'<br />DGMGRL>   </pre>**CDB**<pre>DGMGRL> edit database rdscdb_b set property logxptmode=fastsync;DGMGRL> edit database rdscdb_b set property logxptmode=fastsync;<br />Property "logxptmode" updated<br />DGMGRL> show database rdscdb_b LogXptMode;<br />  LogXptMode = 'fastsync'<br />DGMGRL> edit database rdscdb_a set property logxptmode=fastsync;<br />Property "logxptmode" updated<br />DGMGRL> show database rdscdb_a logxptmode;<br />  LogXptMode = 'fastsync'<br />DGMGRL></pre> | 数据库管理员 | 
| 将保护模式更改为 MaxAvailability。 | 通过从主节点连接到 `DGMGRL`，将保护模式更改为 `MaxAvailability`。**非 CDB**<pre>DGMGRL> edit configuration set protection mode as maxavailability;<br />Succeeded.<br />DGMGRL> show configuration;<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_a - Primary database<br />orcl_d - Physical standby database <br />Fast-Start Failover: Disabled<br />Configuration Status:<br />SUCCESS (status updated 38 seconds ago)<br />DGMGRL> </pre>**CDB**<pre>DGMGRL> show configuration<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_a - Primary database<br />    rdscdb_b - Physical standby database <br />Fast-Start Failover:  Disabled<br />Configuration Status:<br />SUCCESS   (status updated 57 seconds ago)<br />DGMGRL></pre> | 数据库管理员 | 

### 将复制副本状态从附加更改为只读，并启用重做应用
<a name="change-the-replica-status-from-mount-to-read-only-and-enable-redo-apply"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止对备用数据库进行重做应用。 | 默认情况下，只读副本是在 `MOUNT` 模式下创建的。要以只读模式打开它，首先需要通过从主节点或备用节点连接到 `DGMGRL` 来关闭重做应用。**非 CDB**<pre>DGMGRL> show database orcl_dDGMGRL> show database orcl_d<br />Database - orcl_d<br />Role: PHYSICAL STANDBY<br />Intended State: APPLY-ON<br />Transport Lag: 0 seconds (computed 1 second ago)<br />Apply Lag: 0 seconds (computed 1 second ago)<br />Average Apply Rate: 11.00 KByte/s<br />Real Time Query: OFF<br />Instance(s):<br />ORCL<br />Database Status:<br />SUCCESS<br />DGMGRL> edit database orcl_d set state=apply-off;<br />Succeeded.<br />DGMGRL> show database orcl_d<br />Database - orcl_d<br />Role: PHYSICAL STANDBY<br />Intended State: APPLY-OFF<br />Transport Lag: 0 seconds (computed 1 second ago)<br />Apply Lag: 42 seconds (computed 1 second ago)<br />Average Apply Rate: (unknown)<br />Real Time Query: OFF<br />Instance(s):<br />ORCL<br />Database Status:<br />SUCCESS<br />DGMGRL></pre>**CDB**<pre>DGMGRL> show configurationDGMGRL> show configuration<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_a - Primary database<br />    rdscdb_b - Physical standby database <br />Fast-Start Failover:  Disabled<br />Configuration Status:<br />SUCCESS   (status updated 57 seconds ago)<br />DGMGRL> show database rdscdb_b;<br />Database - rdscdb_b<br />  Role:               PHYSICAL STANDBY<br />  Intended State:     APPLY-ON<br />  Transport Lag:      0 seconds (computed 1 second ago)<br />  Apply Lag:          0 seconds (computed 1 second ago)<br />  Average Apply Rate: 2.00 KByte/s<br />  Real Time Query:    OFF<br />  Instance(s):<br />    RDSCDB<br />Database Status:<br />SUCCESS<br />DGMGRL> edit database rdscdb_b set state=apply-off;<br />Succeeded.<br />DGMGRL> show database rdscdb_b;<br />Database - rdscdb_b<br />  Role:               PHYSICAL STANDBY<br />  Intended State:     APPLY-OFF<br />  Transport Lag:      0 seconds (computed 1 second ago)<br />  Apply Lag:          0 seconds (computed 1 second ago)<br />  Average Apply Rate: (unknown)<br />  Real Time Query:    OFF<br />  Instance(s):<br />    RDSCDB<br />Database Status:<br />SUCCESS</pre> | 数据库管理员 | 
| 以只读模式打开只读副本实例。 | 使用 TNS 条目连接到备用数据库，然后通过从主节点或备用节点连接到备用数据库，以只读模式打开该数据库。**非 CDB**<pre>$ sqlplus RDS_DATAGUARD@RDS_CUSTOM_ORCL_D as sysdg<br />-bash-4.2$ sqlplus RDS_DATAGUARD@RDS_CUSTOM_ORCL_D as sysdg<br />SQL*Plus: Release 19.0.0.0.0 - Production on Fri Sep 30 23:00:14 2022<br />Version 19.10.0.0.0<br />Copyright (c) 1982, 2020, Oracle. All rights reserved.<br />Enter password: <br />Last Successful login time: Fri Sep 30 2022 22:48:27 +00:00<br />Connected to:<br />Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production<br />Version 19.10.0.0.0<br />SQL> select open_mode from v$database;<br />OPEN_MODE<br />--------------------<br />MOUNTED<br />SQL> alter database open read only;<br />Database altered.<br />SQL> select open_mode from v$database;<br />OPEN_MODE<br />--------------------<br />READ ONLY<br />SQL> </pre>**CDB**<pre>-bash-4.2$ sqlplus C##RDS_DATAGUARD@RDS_CUSTOM_RDSCDB_B as sysdg<br />SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 11 21:14:07 2023<br />Version 19.16.0.0.0<br />Copyright (c) 1982, 2022, Oracle.  All rights reserved.<br />Enter password: <br />Last Successful login time: Wed Jan 11 2023 21:12:05 +00:00<br />Connected to:<br />Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production<br />Version 19.16.0.0.0<br />SQL> select name,open_mode from v$database;<br />NAME   OPEN_MODE<br />--------- --------------------<br />RDSCDB   MOUNTED<br />SQL> alter database open read only;<br />Database altered.<br />SQL> select name,open_mode from v$database;<br />NAME   OPEN_MODE<br />--------- --------------------<br />RDSCDB   READ ONLY<br />SQL></pre> | 数据库管理员 | 
| 在只读副本实例上激活重做应用。 | 在主节点或备用节点上使用 `DGMGR` L 在只读副本实例上激活重做应用。**非 CDB**<pre>$ dgmgrl RDS_DATAGUARD@RDS_CUSTOM_ORCL_D<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Fri Sep 30 23:02:16 2022<br />Version 19.10.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "ORCL_D"<br />Connected as SYSDG.<br />DGMGRL> <br />edit database orcl_d set state=apply-on;<br />DGMGRL> edit database orcl_d set state=apply-on;<br />Succeeded.<br />DGMGRL> show database orcl_d<br />Database - orcl_d<br />Role: PHYSICAL STANDBY<br />Intended State: APPLY-ON<br />Transport Lag: 0 seconds (computed 0 seconds ago)<br />Apply Lag: 0 seconds (computed 0 seconds ago)<br />Average Apply Rate: 496.00 KByte/s<br />Real Time Query: ON<br />Instance(s):<br />ORCL<br />Database Status:<br />SUCCESS<br />DGMGRL></pre>**CDB**<pre>-bash-4.2$ dgmgrl C##RDS_DATAGUARD@RDS_CUSTOM_RDSCDB_B-bash-4.2$ dgmgrl C##RDS_DATAGUARD@RDS_CUSTOM_RDSCDB_B<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Jan 11 21:21:11 2023<br />Version 19.16.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "RDSCDB_B"<br />Connected as SYSDG.<br />DGMGRL> edit database rdscdb_b set state=apply-on;<br />Succeeded.<br />DGMGRL> show database rdscdb_b           <br />Database - rdscdb_b<br />  Role:               PHYSICAL STANDBY<br />  Intended State:     APPLY-ON<br />  Transport Lag:      0 seconds (computed 0 seconds ago)<br />  Apply Lag:          0 seconds (computed 0 seconds ago)<br />  Average Apply Rate: 35.00 KByte/s<br />  Real Time Query:    ON<br />  Instance(s):<br />    RDSCDB<br />Database Status:<br />SUCCESS<br />DGMGRL> show database rdscdb_b   <br />Database - rdscdb_b<br />  Role:               PHYSICAL STANDBY<br />  Intended State:     APPLY-ON<br />  Transport Lag:      0 seconds (computed 1 second ago)<br />  Apply Lag:          0 seconds (computed 1 second ago)<br />  Average Apply Rate: 16.00 KByte/s<br />  Real Time Query:    ON<br />  Instance(s):<br />    RDSCDB<br />Database Status:<br />SUCCESS<br />DGMGRL></pre> | 数据库管理员 | 

## 相关的资源
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-resources"></a>
+ [将 Amazon RDS 配置为 Oracle PeopleSoft 数据库](https://d1.awsstatic.com/whitepapers/configuring-amazon-rds-as-peoplesoft-database.pdf)（AWS 白皮书）
+ [Oracle Data Guard 代理指南](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/index.html)（Oracle 参考文档）
+ [Data Guard 概念和管理](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/index.html)（Oracle 参考文档）

## 附加信息
<a name="add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica-additional"></a>

**选择数据库保护模式**

Oracle Data Guard 提供三种保护模式，可根据您的可用性、保护和性能要求配置 Data Guard 环境。下表对这三种模式进行了汇总。


| 
| 
| 保护模式 | 重做传输设置 | 说明 | 
| --- |--- |--- |
| ***最佳性能*** | `ASYNC` | 对于主数据库上发生的事务，重做数据将异步传输并写入备用数据库重做日志。因此，对性能的影响微乎其微。由于异步日志传送，`MaxPerformance` 无法提供 RPO=0。 | 
| ***最大程度的保护*** | `SYNC+AFFIRM` | 对于主数据库上的事务，在确认事务之前，重做数据将同步传输并写入磁盘上的备用数据库重做日志。如果备用数据库不可用，则主数据库将自行关闭，以确保事务受到保护。 | 
| ***最大可用性*** | `SYNC+AFFIRM` | 这类似于 `MaxProtection` 模式，除非未从备用数据库收到确认。在这种情况下，它会像在 `MaxPerformance` 模式下一样运行，以保持主数据库的可用性，直到它能够再次将其重做流写入同步备用数据库。 | 
| `SYNC+NOAFFIRM` | 对于主数据库上的事务，重做将同步传输到备用数据库，并且主数据库仅等待确认已在备用数据库上收到重做，而不是等待重做已写入备用磁盘。此模式（也称为 `FastSync`）可以提供性能优势，但代价是在多个同时发生故障的特殊情况下可能会丢失数据。 | 

RDS Custom for Oracle 中的只读副本是使用最高性能保护模式创建的，这也是 Oracle Data Guard 的默认保护模式。最高性能模式对主数据库的性能影响最小，这可以帮助您满足以秒为单位的恢复点目标（RPO）要求。

要努力实现零数据丢失（RPO=0）目标，可以将 Oracle Data Guard 保护模式自定义为 `MaxAvailability`，并将 `SYNC+NOAFFIRM` 作为重做传输的设置，以获得更好的性能。由于只有在将相应的重做向量成功传输到备用数据库后，才会确认主数据库上的提交，因此主实例和副本之间的网络延迟对于提交敏感型工作负载至关重要。建议对工作负载执行负载测试，以评测将只读副本自定义为在 `MaxAvailability` 模式下运行时对性能的影响。

与在不同的可用区中部署只读副本相比，将只读副本部署在与主数据库相同的可用区中可提供更低的网络延迟。但是，在同一可用区中部署主副本和只读副本可能无法满足您的 HA 要求，因为在极少数情况下，如果可用区不可用，主实例和只读副本实例都会受到影响。

# 分析对象依赖关系以将部分数据库数据从 Oracle 迁移到 PostgreSQL
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql"></a>

*anuradha chintha，Amazon Web Services*

## Summary
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-summary"></a>

此模式描述了将部分 Oracle 数据库迁移到 Amazon Relational Database Service（Amazon RDS）或 Amazon Aurora PostgreSQL 时，系统性地识别和管理系统依赖关系的重要性。在部分迁移中，只有一部分原始数据库中的对象和数据会被迁移，而源数据库仍将继续运行并为依赖未迁移组件的应用程序提供服务。

在处理具有紧密耦合应用程序以及上下游依赖关系的大型数据库时，必须识别并分析迁移的范围。要开始部分迁移，请确定范围对象，包括表、触发器、视图、存储过程、函数和包。范围界定过程遵循全面的方法：
+ 一级范围对象通过应用程序代码中的直接引用以及关键模块特有的作业来确定。
+ 二级对象是通过全面的依赖分析推导而来的。

了解系统不同部分的交互方式后，可以更好地规划正确的数据库组件移动顺序，降低迁移失败的风险。下表列出了不同类型的依赖关系分析。


| 
| 
| 分析类型 | 聚焦领域 | 用途 | 
| --- |--- |--- |
| 对象依赖关系 | 表观看次数存储过程函数触发器 | 确定数据库对象与其分层结构之间的关系 | 
| 区段依赖关系 | 外键关系主键链跨架构引用 | 映射数据关系并维护引用完整性 | 
| 安全依赖关系 | 用户权限角色层次结构对象权限 | 确保适当的访问控制迁移和安全维护 | 
| 访问模式 | 读取操作写入操作 | 确定数据库交互模式 | 

要保持源系统与目标系统之间的一致性，请在过渡期间建立数据同步机制。还必须修改应用程序代码和函数，以处理源 Oracle 与目标 PostgreSQL 数据库之间的数据分发。

## 先决条件和限制
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ Oracle 数据库（源）
+ Amazon RDS 或 Amazon Aurora PostgreSQL（目标）

**产品版本**
+ 甲骨文 19c 或更高版本
+ PostgreSQL 16 或更高版本

## 架构
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-architecture"></a>

**源技术堆栈**
+ 甲骨文 19c 或更高版本

**目标技术堆栈**
+ Amazon RDS 或 Amazon Aurora PostgreSQL

**目标架构**

下图显示了从本地 Oracle 数据库迁移至 Amazon RDS for Oracle 的过程，涉及以下内容：
+ 确定数据库依赖关系
+ 使用 AWS Schema Conversion Tool (AWS SCT) 迁移数据库代码和对象
+ 使用 AWS Database Migration Service (AWS DMS) 迁移数据
+ 使用变更数据捕获 (CDC) 复制正在进行的更改 AWS DMS

有关更多信息，请参阅 AWS 文档 AWS Schema Conversion Tool中的[AWS Database Migration Service 与集成](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_DMSIntegration.html)。

![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/90160825-3199-4382-95a8-ad63139c5c89/images/b09c36a4-27fa-412e-877e-57a31bcce0dc.png)


## 工具
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-tools"></a>

**AWS 服务**
+ [Amazon Relational Database Service（Amazon RDS）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) for Oracle 可帮助您在 AWS 云中设置、操作和扩缩 Oracle 关系数据库。
+ Amazon Aurora 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ AWS Schema Conversion Tool (AWS SCT) 通过自动将源数据库架构和大部分自定义代码转换为与目标数据库兼容的格式来支持异构数据库迁移。
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到云和本地设置的组合中， AWS 云 或者迁移到云端和本地设置的组合之间。

**其他服务**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) 是一个集成的开发环境，可简化传统部署和基于云的部署中 Oracle 数据库的开发和管理。对于这种模式，您可以使用 [SQL\$1Plus](https://docs.oracle.com/cd/B19306_01/server.102/b14357/qstart.htm)。

## 最佳实践
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-best-practices"></a>

有关预调配和迁移 Oracle 数据库的最佳实践，请参阅[迁移至 Amazon RDS for Oracle 的最佳实践](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/best-practices.html)。

## 操作说明
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-epics"></a>

### 确定对象依赖关系
<a name="identify-object-dependencies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建对象表。 | 确定对应用程序功能至关重要的对象，然后创建一个名为 `DEPENDENT_ANALYSIS_BASELINE` 的表。将每个对象的记录添加到表中。有关示例，请参阅*其他信息*部分。 | 数据工程师、数据库管理员 | 
| 创建一个数据库程序。 | 创建名为 `sp_object_dependency_analysis` 的存储过程，利用 `DBA_DEPENDENCIES` 表中的数据分析对象的双向依赖关系（正向和反向）。有关示例，请参阅*其他信息*部分。 | 数据工程师、数据库管理员 | 
| 运行程序。 | 在每个连续层级上运行脚本，直至找不到新的对象依赖关系。所有依赖关系和层级都存储在 `DEPENDENT_ANALYSIS_BASELINE` 表中。 | 数据库管理员、数据工程师 | 

### 为区段层级的依赖关系创建程序
<a name="create-a-procedure-for-segment-level-dependencies"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建依赖关系表。 | 创建名为 `REFERENTIAL_ANALYSIS_BASELINE` 的区段层级依赖关系表。发现所有对象层级依赖关系后，查询 `DBA_CONSTRAINT` 表以检查 `DEPENDENT_ANALYSIS_BASELINE` 的父表。若基准表被其他表引用，则排除依赖关系。回填处理这些关系。以下为脚本示例：<pre>CREATE TABLE REFERENTIAL_ANALYSIS_BASELINE<br />(CHILD_OWNER VARCHAR2(50 BYTE),<br />CHILD_NAME VARCHAR2(100 BYTE),<br />PARENT_OWNER VARCHAR2(50 BYTE),<br />PARENT_NAME VARCHAR2(50 BYTE),<br />REFERENCE_PATH VARCHAR2(1000 BYTE));</pre> | 数据工程师、数据库管理员 | 
| 创建一个数据库程序。 | 创建一个名为 `SP_OBJECT_REFERENTIAL_ANALYSIS` 的程序，然后生成所有已识别对象的引用分析。有关示例，请参阅*其他信息*部分。 | 数据工程师、数据库管理员 | 
| 运行程序。 | 运行程序以获取引用依赖关系。在 `REFERENTIAL_ANALYSIS_BASELINE` 中生成引用分析对象详细信息。 | 数据工程师、数据库管理员 | 

### 识别读取和写入的对象
<a name="identify-objects-that-read-and-write"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建用于读取和写入对象的表。 | 使用以下脚本可创建名为 `TABLE_READ_OBJECT_DETAILS` 的读取对象表和名为 `TABLE_WRITE_OBJECT_DETAILS` 的写入对象表：<pre>CREATE TABLE TABLE_READ_OBJECT_DETAILS<br />(OWNER VARCHAR2(50 BYTE),<br />TAB_NAME VARCHAR2(50 BYTE),<br />READER_OWNER VARCHAR2(50 BYTE),<br />READER_NAME VARCHAR2(50 BYTE),<br />READER_TYPE VARCHAR2(50 BYTE));</pre><pre>CREATE TABLE TABLE_WRITE_OBJECT_DETAILS<br />(TABLE_NAME VARCHAR2(100 BYTE),<br />WRITEOBJ_OWNER VARCHAR2(100 BYTE),<br />WRITEOBJ_NAME VARCHAR2(100 BYTE),<br />WRITEOBJ_TYPE VARCHAR2(100 BYTE),<br />LINE VARCHAR2(100 BYTE),<br />TEXT VARCHAR2(4000 BYTE),<br />OWNER VARCHAR2(50 BYTE));</pre> | 数据工程师、数据库管理员 | 
| 创建程序供分析之用。 | 创建程序 `SP_READER_OBJECTS_ANALYSIS` 和 `SP_WRITER_OBJECTS_ANALYSIS`，分别用于分析读取对象和写入对象。这些程序使用模式匹配来查找相关对象。有关示例，请参阅*其他信息*部分。 | 数据工程师、数据库管理员 | 
| 运行程序。 | 运行这些程序可识别依赖对象。 | 数据库管理员、数据工程师 | 

### 查看数据库权限
<a name="review-database-privileges"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建用于查看权限的表。 | 创建用于分析权限的名为 `OBJECT_PRIVS_ANALYSIS` 的表。要以递归方式捕获 `DEPENDENT_ANALYSIS_BASELINE` 表中的对象权限，请使用以下脚本：<pre>CREATE TABLE OBJECT_PRIVS_ANALYSIS<br />(OWNER VARCHAR2(50 BYTE),<br />OBJECT_NAME VARCHAR2(50 BYTE),<br />USER_NAME VARCHAR2(50 BYTE),<br />PRIVS VARCHAR2(50 BYTE));</pre> | 数据工程师、数据库管理员 | 
| 创建用于查看权限的程序。 | 创建名为 `SP_OBJECT_PRIVS_ANALYSIS` 的程序。为已识别的对象生成权限分析。有关示例，请参阅*其他信息*部分。 | 数据库管理员、数据工程师 | 
| 运行程序。 | 运行程序可将它们捕获到 `OBJECT_PRIVS_ANALYSIS` 表中。 | 数据库管理员、数据工程师 | 

## 问题排查
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 无法访问字典表 | 确保创建分析对象的用户可以访问 DBA 表。 | 

## 相关资源
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-resources"></a>

**AWS 文档**
+ [Amazon RDS 和 Aurora 文档](https://docs.aws.amazon.com/rds/)
+ [Oracle 数据库 19c 至 Amazon Aurora PostgreSQL 迁移行动手册](https://docs.aws.amazon.com/dms/latest/oracle-to-aurora-postgresql-migration-playbook/chap-oracle-aurora-pg.html)
+ [什么是 AWS Database Migration Service？](https://docs.aws.amazon.com/dms/latest/userguide/)
+ [什么是 AWS Schema Conversion Tool？](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/)

**其他文档**
+ [Oracle 数据库对象](https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Database-Objects.html)

## 附加信息
<a name="multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql-additional"></a>

**`DEPENDENT_ANALYSIS_BASELINE` 的脚本**

```
CREATE TABLE DEPENDENT_ANALYSIS_BASELINE
(OWNER VARCHAR2(128 BYTE) NOT NULL ENABLE,
OBJECT_NAME VARCHAR2(128 BYTE) NOT NULL ENABLE,
OBJECT_TYPE VARCHAR2(20 BYTE),
DEPEDNCY_LEVEL NUMBER,
PROJECT_NEED VARCHAR2(20 BYTE),
CATAGORY VARCHAR2(4000 BYTE),
COMMENTS VARCHAR2(4000 BYTE),
CATAGORY1 CLOB,
COMMENTS1 CLOB,
CUSTOMER_COMMENTS VARCHAR2(1000 BYTE),
BACKFILL_TO_GUS VARCHAR2(1000 BYTE),
BACKFILL_NEAR_REAL_TIME_OR_BATCH VARCHAR2(1000 BYTE),
PK_EXISTS VARCHAR2(3 BYTE),
UI_EXISTS VARCHAR2(3 BYTE),
LOB_EXISTS VARCHAR2(3 BYTE),
MASTER_LINK VARCHAR2(100 BYTE),
CONSTRAINT PK_DEPENDENT_ANALYSIS_BASELINE PRIMARY KEY (OWNER,OBJECT_NAME,OBJECT_TYPE));
```

**适用于 `SP_WRITER_OBJECTS_ANALYSIS` 的程序**

```
CREATE OR REPLACE PROCEDURE SP_WRITER_OBJECTS_ANALYSIS IS
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_WRITE_OBJECT_DETAILS';
  FOR I IN (SELECT OWNER, OBJECT_NAME FROM DEPENDENT_ANALYSIS_BASELINE WHERE OBJECT_TYPE = 'TABLE')
  LOOP
    INSERT INTO TABLE_WRITE_OBJECT_DETAILS(OWNER, TABLE_NAME, WRITEOBJ_OWNER, WRITEOBJ_NAME, WRITEOBJ_TYPE, LINE, TEXT)
    SELECT DISTINCT I.OWNER, I.OBJECT_NAME, OWNER WRITEOBJ_OWNER, NAME, TYPE, LINE, TRIM(TEXT)
    FROM DBA_SOURCE 
    WHERE UPPER(TEXT) LIKE '%' || I.OBJECT_NAME || '%'
      AND (UPPER(TEXT) LIKE '%INSERT%' || I.OBJECT_NAME || '%' 
        OR UPPER(TEXT) LIKE '%UPDATE%' || I.OBJECT_NAME || '%' 
        OR UPPER(TEXT) LIKE '%DELETE%' || I.OBJECT_NAME || '%' 
        OR UPPER(TEXT) LIKE '%UPSERT%' || I.OBJECT_NAME || '%' 
        OR UPPER(TEXT) LIKE '%MERGE%' || I.OBJECT_NAME || '%') 
      AND UPPER(TEXT) NOT LIKE '%PROCEDURE%' 
      AND UPPER(TEXT) NOT LIKE 'PROCEDURE%' 
      AND UPPER(TEXT) NOT LIKE '%FUNCTION%' 
      AND UPPER(TEXT) NOT LIKE 'FUNCTION%'
      AND UPPER(TEXT) NOT LIKE '%TRIGGER%' 
      AND UPPER(TEXT) NOT LIKE 'TRIGGER%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE '%AFTER UPDATE%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE 'BEFORE UPDATE%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE 'BEFORE INSERT%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE 'AFTER INSERT%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE 'BEFORE DELETE%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE 'AFTER DELETE%' 
      AND UPPER(TRIM(TEXT)) NOT LIKE '%GGLOGADM.GG_LOG_ERROR%' 
      AND (TRIM(TEXT) NOT LIKE '/*%' AND TRIM(TEXT) NOT LIKE '--%' ) 
      AND (OWNER, NAME, TYPE) IN (SELECT OWNER, NAME, TYPE FROM DBA_DEPENDENCIES WHERE REFERENCED_NAME = I.OBJECT_NAME);
  END LOOP;
END;
```

**`SP_READER_OBJECTS_ANALYSIS` 的脚本**

```
CREATE OR REPLACE PROCEDURE SP_READER_OBJECTS_ANALYSIS IS
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE TABLE_READ_OBJECT_DETAILS';
  FOR I IN (SELECT OWNER, OBJECT_NAME FROM DEPENDENT_ANALYSIS_BASELINE WHERE OBJECT_TYPE = 'TABLE')
  LOOP
    INSERT INTO TABLE_READ_OBJECT_DETAILS
    SELECT DISTINCT i.owner, i.object_name, owner, name, type 
    FROM dba_dependencies 
    WHERE referenced_name = I.OBJECT_NAME
    AND referenced_type = 'TABLE' 
    AND type NOT IN ('SYNONYM', 'MATERIALIZED VIEW', 'VIEW') 
    AND (owner, name, type) NOT IN (
      SELECT DISTINCT owner, trigger_name, 'TRIGGER' 
      FROM dba_triggers 
      WHERE table_name = I.OBJECT_NAME 
      AND table_owner = i.owner
      UNION ALL
      SELECT DISTINCT owner, name, type 
      FROM dba_source
      WHERE upper(text) LIKE '%' || I.OBJECT_NAME || '%' 
      AND (upper(text) LIKE '%INSERT %' || I.OBJECT_NAME || '%' 
        OR upper(text) LIKE '%UPDATE% ' || I.OBJECT_NAME || '%' 
        OR upper(text) LIKE '%DELETE %' || I.OBJECT_NAME || '%' 
        OR upper(text) LIKE '%UPSERT %' || I.OBJECT_NAME || '%' 
        OR upper(text) LIKE '%MERGE %' || I.OBJECT_NAME || '%') 
      AND upper(text) NOT LIKE '%PROCEDURE %' 
      AND upper(text) NOT LIKE 'PROCEDURE %'
      AND upper(text) NOT LIKE '%FUNCTION %' 
      AND upper(text) NOT LIKE 'FUNCTION %'
      AND upper(text) NOT LIKE '%TRIGGER %'
      AND upper(text) NOT LIKE 'TRIGGER %'
      AND upper(trim(text)) NOT LIKE 'BEFORE INSERT %'
      AND upper(trim(text)) NOT LIKE 'BEFORE UPDATE %' 
      AND upper(trim(text)) NOT LIKE 'BEFORE DELETE %' 
      AND upper(trim(text)) NOT LIKE 'AFTER INSERT %' 
      AND upper(trim(text)) NOT LIKE 'AFTER UPDATE %' 
      AND upper(trim(text)) NOT LIKE 'AFTER DELETE %' 
      AND (trim(text) NOT LIKE '/*%' AND trim(text) NOT LIKE '--%'));
  END LOOP;
END;
```

**`SP_OBJECT_REFERENTIAL_ANALYSIS` 的脚本**

```
CREATE OR REPLACE PROCEDURE SP_OBJECT_REFERENTIAL_ANALYSIS IS
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE REFERENTIAL_ANALYSIS_BASELINE';
  INSERT INTO REFERENTIAL_ANALYSIS_BASELINE
  WITH rel AS (
    SELECT DISTINCT c.owner, c.table_name, c.r_owner r_owner,
      (SELECT table_name FROM dba_constraints 
       WHERE constraint_name = c.r_constraint_name 
       AND owner = c.r_owner) r_table_name 
    FROM dba_constraints c 
    WHERE constraint_type = 'R' 
    AND c.owner NOT IN (SELECT username FROM dba_users WHERE oracle_maintained = 'Y')
    AND c.r_owner NOT IN (SELECT username FROM dba_users WHERE oracle_maintained = 'Y')),
  tab_list AS (
    SELECT OWNER, object_name 
    FROM DEPENDENT_ANALYSIS_BASELINE 
    WHERE UPPER(OBJECT_TYPE) = 'TABLE')
  SELECT DISTINCT owner child_owner, table_name child, r_owner parent_owner,
    r_table_name parent, SYS_CONNECT_BY_PATH(r_table_name, ' -> ') || ' -> ' || table_name PATH
  FROM rel 
  START WITH (r_owner, r_table_name) IN (SELECT * FROM tab_list)
  CONNECT BY NOCYCLE (r_owner, r_table_name) = ((PRIOR owner, PRIOR table_name))
  UNION
  SELECT DISTINCT owner child_owner, table_name child, r_owner parent_owner,
    r_table_name parent, SYS_CONNECT_BY_PATH(table_name, ' -> ') || ' -> ' || r_table_name PATH
  FROM rel 
  START WITH (owner, table_name) IN (SELECT * FROM tab_list)
  CONNECT BY NOCYCLE (owner, table_name) = ((PRIOR r_owner, PRIOR r_table_name));
END;
```

**`SP_OBJECT_PRIVS_ANALYSIS` 的脚本**

```
CREATE OR REPLACE PROCEDURE SP_OBJECT_PRIVS_ANALYSIS IS
  V_SQL VARCHAR2(4000);
  V_CNT NUMBER;
BEGIN
  V_SQL := 'TRUNCATE TABLE OBJECT_PRIVS_ANALYSIS';
  EXECUTE IMMEDIATE V_SQL;
  FOR I IN (SELECT OWNER, OBJECT_NAME FROM DEPENDENT_ANALYSIS_BASELINE WHERE OBJECT_TYPE = 'TABLE')
  LOOP
    INSERT INTO OBJECT_PRIVS_ANALYSIS(OWNER, OBJECT_NAME, USER_NAME, PRIVS)
    WITH obj_to_role AS (
      SELECT DISTINCT GRANTEE role_name, 
        DECODE(privilege, 'SELECT', 'READ', 'REFERENCE', 'READ', 'INSERT', 'WRITE', 
               'UPDATE', 'WRITE', 'DELETE', 'WRITE', privilege) privs
      FROM DBA_TAB_PRIVS t, DBA_ROLES r 
      WHERE OWNER = I.OWNER 
      AND TYPE = 'TABLE' 
      AND TABLE_NAME = I.OBJECT_NAME 
      AND t.GRANTEE = r.ROLE 
      AND r.ROLE IN (SELECT ROLE FROM DBA_ROLES WHERE ORACLE_MAINTAINED = 'N')
    )
    SELECT I.OWNER, I.OBJECT_NAME, grantee, privs 
    FROM (
      -- Recursively Role to User mapping with privilege
      SELECT DISTINCT grantee, privs 
      FROM (SELECT rp.granted_role, rp.grantee, privs,
        (SELECT DECODE(COUNT(*), 0, 'ROLE', 'USER') 
         FROM (SELECT 'User' FROM DBA_users WHERE username = rp.GRANTEE)) grantee_type 
        FROM DBA_role_privs rp, obj_to_role r 
        WHERE rp.granted_role = r.role_name 
        AND grantee IN ((SELECT USERNAME FROM DBA_USERS WHERE ORACLE_MAINTAINED = 'N') 
                       UNION (SELECT ROLE FROM DBA_ROLES WHERE ORACLE_MAINTAINED = 'N'))
        AND granted_role IN (SELECT ROLE FROM DBA_ROLES WHERE ORACLE_MAINTAINED = 'N') 
        START WITH granted_role IN (SELECT DISTINCT role_name FROM obj_to_role) 
        CONNECT BY granted_role = PRIOR grantee) 
      WHERE grantee_type = 'USER'
    )
    UNION
    (
      -- Direct Object grants to User
      SELECT I.OWNER, I.OBJECT_NAME, GRANTEE, 
        DECODE(privilege, 'SELECT', 'READ', 'REFERENCE', 'READ', 'INSERT', 'WRITE',
               'UPDATE', 'WRITE', 'DELETE', 'WRITE', privilege) privs 
      FROM DBA_TAB_PRIVS, DBA_USERS 
      WHERE GRANTEE = USERNAME 
      AND OWNER = I.OWNER 
      AND TYPE = 'TABLE' 
      AND TABLE_NAME = I.OBJECT_NAME
    ) 
    ORDER BY 2 DESC;
  END LOOP;
END;
```

**适用于 `SP_OBJECT_DEPENDENCY_ANALYSIS` 的程序**

```
CREATE OR REPLACE PROCEDURE SP_OBJECT_DEPENDENCY_ANALYSIS (v_level NUMBER) IS
  TYPE typ IS RECORD (
    schema VARCHAR2(100),
    obj_type VARCHAR2(100),
    obj_name VARCHAR2(100),
    path VARCHAR2(5000)
  );
  TYPE array IS TABLE OF typ;
  l_data array;
  c SYS_REFCURSOR;
  l_errors NUMBER;
  l_errno NUMBER;
  l_msg VARCHAR2(4000);
  l_idx NUMBER;
  l_level NUMBER;
BEGIN
  l_level := v_level + 1;
  OPEN c FOR 
    WITH obj_list AS (
      SELECT owner schema_name, object_type, object_name 
      FROM DEPENDENT_ANALYSIS_BASELINE 
      WHERE depedncy_level = v_level
    ),
    fw_dep_objects AS (
      SELECT level lvl, owner, name, type, referenced_owner, referenced_name,
        referenced_type, SYS_CONNECT_BY_PATH(name, ' -> ') || ' -> ' || referenced_name PATH 
      FROM dba_dependencies
      START WITH (owner, CASE WHEN type = 'PACKAGE BODY' THEN 'PACKAGE' ELSE type END, name) 
        IN (SELECT schema_name, object_type, object_name FROM obj_list)
      CONNECT BY NOCYCLE (owner, type, name) = 
        ((PRIOR referenced_owner, PRIOR referenced_type, PRIOR referenced_name))
    ),
    bw_dep_objects AS (
      SELECT level lvl, owner, name, type, referenced_owner, referenced_name,
        referenced_type, SYS_CONNECT_BY_PATH(name, ' <- ') || ' <- ' || referenced_name PATH 
      FROM dba_dependencies
      START WITH (referenced_owner, CASE WHEN referenced_type = 'PACKAGE BODY' THEN 'PACKAGE' 
        ELSE referenced_type END, referenced_name) IN (SELECT schema_name, object_type, object_name FROM obj_list)
      CONNECT BY NOCYCLE (referenced_owner, referenced_type, referenced_name) = 
        ((PRIOR owner, PRIOR type, PRIOR name))
    )
    SELECT * FROM (
      (SELECT DISTINCT referenced_owner schema, referenced_type obj_type, 
        referenced_name obj_name, path FROM fw_dep_objects)
      UNION
      (SELECT DISTINCT owner schema, type obj_type, name obj_name, path 
       FROM bw_dep_objects)
    )
    WHERE schema IN (SELECT username FROM all_users WHERE oracle_maintained = 'N')
    ORDER BY obj_type;

  LOOP
    FETCH c BULK COLLECT INTO l_data LIMIT 100;
    BEGIN
      FORALL i IN 1..l_data.count SAVE EXCEPTIONS
        INSERT INTO DEPENDENT_ANALYSIS_BASELINE (
          owner, object_name, object_type, catagory, depedncy_level, project_need, comments
        ) 
        VALUES (
          l_data(i).schema, 
          l_data(i).obj_name,
          CASE WHEN l_data(i).obj_type = 'PACKAGE BODY' THEN 'PACKAGE' ELSE l_data(i).obj_type END,
          'level ' || l_level || ' dependency',
          l_level,
          '',
          'from dependency proc' || l_data(i).path
        );
    EXCEPTION
      WHEN OTHERS THEN
        l_errors := sql%bulk_exceptions.count;
        FOR i IN 1..l_errors LOOP
          l_errno := sql%bulk_exceptions(i).error_code;
          l_msg := SQLERRM(-l_errno);
          l_idx := sql%bulk_exceptions(i).error_index;
          UPDATE DEPENDENT_ANALYSIS_BASELINE 
          SET catagory1 = catagory1 || ', found in level' || l_level || ' dependent of ' || l_data(l_idx).path,
              comments1 = comments1 || ', from dependency proc exception ' || l_data(i).path
          WHERE owner = l_data(l_idx).schema 
          AND object_name = l_data(l_idx).obj_name 
          AND object_type = l_data(l_idx).obj_type;
        END LOOP;
    END;
    EXIT WHEN c%NOTFOUND;
  END LOOP;
  CLOSE c;
END;
```

# 评测将 SQL Server 数据库迁移至 MongoDB Atlas on AWS 的查询性能
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws"></a>

*Battulga Purevragchaa, Amazon Web Services*

*Krishnakumar Sathyanarayana，US Inc PeerIslands *

*Babu Srinivasan，MongoDB*

## Summary
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-summary"></a>

这种模式为使用近乎真实的数据加载 MongoDB 以及评测尽可能接近生产场景的 MongoDB 查询性能提供指导。该评测提供的信息可帮助您规划从关系数据库迁移至MongoDB 的操作。该模式使用[PeerIslands 测试数据生成器和性能分析器](https://tools.peerislands.io/)来测试查询性能。

这种模式对于 Microsoft SQL Server 迁移至 MongoDB 特别有用，因为执行架构转换以及将数据从当前 SQL Server 实例加载到 MongoDB 可能非常复杂。相反，在开始实际迁移之前，您可以将近乎真实的数据加载至 MongoDB，了解 MongoDB 的性能并微调架构设计。

## 先决条件和限制
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-prereqs"></a>

**先决条件**
+ 一个活跃的 AWS 账户
+ 熟悉 [MongoDB Atlas](https://www.mongodb.com/docs/atlas/getting-started/)
+ 目标 MongoDB 架构
+ 典型查询模式

**限制**
+ 数据加载时间和性能受到 MongoDB 集群实例大小限制。我们建议您选择适用于生产的实例，以了解实际性能。
+ PeerIslands 测试数据生成器和性能分析器目前仅支持在线数据加载和查询。尚不支持离线批处理（例如，使用 Spark 连接器将数据加载至 MongoDB）。
+ PeerIslands 测试数据生成器和性能分析器支持集合中的字段关系。它不支持跨集合关系。

**产品版本**
+ 此模式同时支持 [MongoDB Atlas](https://www.mongodb.com/atlas) 和 [MongoDB Enterprise Advanced](https://www.mongodb.com/products/mongodb-enterprise-advanced)。

## 架构
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-architecture"></a>

**目标技术堆栈**
+ MongoDB Atlas 或 MongoDB Enterprise Advanced

**架构**

![\[用于评测将 SQL Server 数据库迁移至 MongoDB Atlas on AWS 的查询性能的架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/25f0ab73-d587-4bd0-9fc0-ac675d5aa349/images/717caae4-d52e-4c78-bb7d-2ecb5acccd42.png)


PeerIslands 测试数据生成器和性能分析器使用 Java 和 Angular 构建，并将其生成的数据存储在亚马逊 Elastic Block Store (Amazon EBS) Elastic Block Store 上。该工具包含两个工作流：测试数据生成与性能测试。
+ 在测试数据生成中，您需要创建模板，该模板是必须生成的数据模型的 JSON 表示形式。创建模板后，您可按照负载生成配置的定义在目标集合中生成数据。
+ 在性能测试中，您可创建配置文件。配置文件是一种多阶段测试方案，您可在其中配置创建、读取、更新和删除 (CRUD) 操作、聚合管道、每个操作的权重以及每个阶段的持续时间。创建配置文件后，您可根据配置对目标数据库运行性能测试。

PeerIslands 测试数据生成器和性能分析器将其数据存储在 Amazon EBS 上，因此您可以使用任何 MongoDB 支持的连接机制（包括对等互连、允许列表和私有终端节点）将 Amazon EBS 连接到 MongoDB。默认情况下，该工具不包含操作组件；但是，如果需要，可以将其配置为适用于 Prometheus 的亚马逊托管服务、亚马逊托管 Grafana、Amazon 和 AWS Secrets Manag CloudWatch er。

## 工具
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-tools"></a>
+ [PeerIslands 测试数据生成器和性能分析器](https://tools.peerislands.io/)包括两个组件。测试数据生成器组件可帮您根据 MongoDB 架构生成高度针对客户的真实数据。该工具完全由用户界面驱动，包含丰富的数据库，可用于在 MongoDB 上快速生成数十亿条记录。该工具还提供在 MongoDB 架构中实现字段间关系的功能。Performance Analyzer 组件可帮助您生成高度针对客户的查询和聚合，并在 MongoDB 上执行真实的性能测试。您可以使用 Performance Analyzer 通过丰富的负载配置文件和针对特定用例的参数化查询来测试 MongoDB 性能。

## 最佳实践
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-best-practices"></a>

请参阅以下资源：
+ [MongoDB 架构设计最佳实践](https://www.mongodb.com/developer/products/mongodb/mongodb-schema-design-best-practices/)（MongoDB 开发人员网站）
+ 在 [AWS 上部署 MongoDB Atlas 的最佳实践（Mongo](https://www.mongodb.com/presentation/best-practices-of-deploying-mongodb-atlas-on-aws) DB 网站）
+ 使用 AWS [将应用程序安全地连接到 MongoDB Atlas 数据平面 PrivateLink（AWS 博](https://aws.amazon.com/blogs/apn/connecting-applications-securely-to-a-mongodb-atlas-data-plane-with-aws-privatelink/)客文章）
+ [MongoDB 性能最佳实践指南（MongoDB 网站](https://www.mongodb.com/basics/best-practices)）

## 操作说明
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-epics"></a>

### 了解您的源数据
<a name="understand-your-source-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 了解当前 SQL Server 源数据库占用空间。 | 了解当前的 SQL Server 占用空间。这可以通过对数据库 `INFORMATION` 架构运行查询来实现。确定表数量和每个表的大小。分析每个表关联的索引。有关 SQL 分析的更多信息，请参阅 PeerIslands 网站上的博客文章 [SQL2Mongo：数据迁移之旅](https://engineering.peerislands.io/sql2mongo-data-migration-journey-fec91a421d60)。 | 数据库管理员 | 
| 了解源架构。 | 确定表架构和数据的业务表示形式（例如邮政编码、名称和货币）。使用现有的实体关系 (ER) 图或者从现有数据库生成 ER 图。有关更多信息，请参阅 PeerIslands 网站上的博客文章《[SQL2Mongo：数据迁移之旅](https://engineering.peerislands.io/sql2mongo-data-migration-journey-fec91a421d60)》。 | 数据库管理员 | 
| 了解查询模式。 | 记录您使用的前 10 个 SQL 查询。你可以使用数据库中可用的 **performance\$1schema.events\$1statements\$1summary\$1by\$1digest** 表了解热门查询。有关更多信息，请参阅 PeerIslands 网站上的博客文章《[SQL2Mongo：数据迁移之旅](https://engineering.peerislands.io/sql2mongo-data-migration-journey-fec91a421d60)》。 | 数据库管理员 | 
| 了解 SLA 承诺。 | 记录数据库操作的目标服务级别协议 (SLAs)。常见衡量标准包括查询延迟和每秒查询次数。这些措施及其目标通常可在非功能性需求 (NFR) 文档中查找。 | 数据库管理员 | 

### 定义 MongoDB 架构
<a name="define-the-mongodb-schema"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 定义目标架构。 | 为目标 MongoDB 架构定义多种选项。有关更多信息，请参阅 MongoDB Atlas 文档中的 [Schemas](https://www.mongodb.com/docs/atlas/app-services/schemas/)。根据表格关系考虑最佳实践与设计模式。 | MongoDB 工程师 | 
| 定义目标查询模式。 | 定义 MongoDB 查询和聚合管道。这些查询等同于您为 SQL Server 工作负载所捕获的热门查询。[要了解如何构造 MongoDB 聚合管道，请参阅 MongoDB 文档](https://www.mongodb.com/docs/manual/core/aggregation-pipeline/)。 | MongoDB 工程师 | 
| 定义 MongoDB 实例类型。 | 确定您计划用于测试的实例大小。有关指南，请参阅 [MongoDB 文档](https://www.mongodb.com/docs/atlas/sizing-tier-selection/)。 | MongoDB 工程师 | 

### 准备目标数据库
<a name="prepare-the-target-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置 MongoDB Atlas 集群。 | 要在 AWS 上设置 MongoDB 集群，请按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/tutorial/create-new-cluster/)中的说明进行操作。 | MongoDB 工程师 | 
| 在目标数据库中创建用户。 | 按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/connect-to-database-deployment/)中的说明配置 MongoDB Atlas 集群以实现访问和网络安全。 | MongoDB 工程师 | 
| 在 AWS 中创建相应的角色，并为 Atlas 配置基于角色的访问控制。 | 如有需要，请按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/security/set-up-unified-aws-access/)中的说明设置其他用户。通过 AWS 角色配置[身份验证与授权](https://www.mongodb.com/docs/atlas/security/config-db-auth/)。 | MongoDB 工程师 | 
| 设置 Compass for MongoDB Atlas 访问。 | 设置 [MongoDB Compass GUI 实用程序](https://www.mongodb.com/products/compass)以便于导航和访问。 | MongoDB 工程师 | 

### 使用测试数据生成器设置基本负荷
<a name="set-up-the-base-load-by-using-test-data-generator"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装测试数据生成器。 | 在您的环境中安装[PeerIsland 测试数据生成器](https://github.com/PeerIslands/loadgen_binary)。 | MongoDB 工程师 | 
| 配置测试数据生成器，以生成相应的数据。 | 使用数据库为 MongoDB 架构中的所有字段生成特定数据，从而创建模板。有关更多信息，请参阅 [MongoDB 数据生成器和性能。分析器](https://vimeo.com/570068857)视频。 | MongoDB 工程师 | 
| 水平扩展测试数据生成器，以生成所需负载。 | 使用您创建的模板，通过配置所需并行度开始针对目标集合生成负载。确定生成必要数据的时间范围与规模。 | MongoDB 工程师 | 
| 验证 MongoDB Atlas 中的负载。 | 检查加载至 MongoDB Atlas 中的数据。 | MongoDB 工程师 | 
| 在 MongoDB 上生成所需索引。 | 根据查询模式定义所需索引 有关最佳实践，请参阅 [MongoDB 文档](https://www.mongodb.com/docs/manual/applications/indexes/)。 | MongoDB 工程师 | 

### 执行性能测试
<a name="conduct-performance-testing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在性能分析器设置负载配置文件。 | 通过配置特定的查询及其相应的权重、测试运行的持续时间和阶段，在 Performance Analyzer 中创建性能测试的配置文件。有关更多信息，请参阅 [MongoDB 数据生成器和性能。分析器](https://vimeo.com/570068857)视频。 | MongoDB 工程师 | 
| 运行性能测试。 | 使用您创建的性能测试配置文件，通过配置所需并行度开始对目标集合进行测试。水平扩展性能测试工具，以对 MongoDB Atlas 运行查询。 | MongoDB 工程师 | 
| 记录测试结果。 | 记录查询 P95、P99 延迟。 | MongoDB 工程师 | 
| 调整架构与查询模式。 | 修改索引和查询模式，以解决任何性能问题。 | MongoDB 工程师 | 

### 关闭项目
<a name="close-the-project"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 关闭临时 AWS 资源。 | 删除用于测试数据生成器与性能分析器的所有临时资源。 | AWS 管理员 | 
| 更新性能测试结果。 | 了解 MongoDB 的查询性能，并将其与您的查询性能进行比较。 SLAs如有必要，可微调 MongoDB 架构并重新运行该过程。 | MongoDB 工程师 | 
| 结束项目。 | 关闭项目并提供反馈。 | MongoDB 工程师 | 

## 相关资源
<a name="assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws-resources"></a>
+ GitHub 存储库：[s3toAtlas](https://github.com/mongodb-partners/S3toAtlas)
+ 架构：[MongoDB 架构设计](https://www.mongodb.com/developer/products/mongodb/mongodb-schema-design-best-practices/)
+ 聚合管道：[MongoDB 聚合管道](https://www.mongodb.com/docs/manual/core/aggregation-pipeline/)
+ MongoDB Atlas 大小调整：[大小调整等级选择](https://www.mongodb.com/docs/atlas/sizing-tier-selection/)
+ 视频：[MongoDB 数据生成器](https://vimeo.com/570068857)和性能。分析器
+ 参考文献：[MongoDB 文档](https://www.mongodb.com/docs/)
+ [教程：****[MongoDB 开发人员指南、](https://www.mongodb.com/docs/develop-applications/)MongoDB Jumpstart](https://www.youtube.com/playlist?list=PL4RCxklHWZ9v2lcat4oEVGQhZg6r4IQGV)
+ Amazon Web Services Marketplace：**·**[Amazon Web Services Marketplace 上的 MongoDB Atlas](https://aws.amazon.com/marketplace/seller-profile?id=c9032c7b-70dd-459f-834f-c1e23cf3d092)
+ AWS 合作伙伴解决方案：** **[ AWS Reference Deployment 中的 MongoDB Atlas](https://aws.amazon.com/quickstart/architecture/mongodb-atlas/)

其他资源：
+ [SQL 分析](https://engineering.peerislands.io/sql2mongo-data-migration-journey-fec91a421d60)
+ [MongoDB 开发人员社区论坛](https://www.mongodb.com/community/forums/)
+ [MongoDB 性能微调问题](https://www.mongodb.com/developer/products/mongodb/performance-tuning-tips/)
+ [使用 Atlas 和 Redshift 执行运营分析](https://github.com/mongodb-partners/Atlas_to_Redshift)
+ [使用 MongoDB Atlas 和 AWS Elastic Beanstalk 实施应用程序现代化](https://github.com/mongodb-partners/MEANStack_with_Atlas_on_AWS_EB)

# 使用 IaC 原则自动 blue/green 部署 Amazon Aurora 全球数据库
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac"></a>

*Ishwar Chauthaiwale、ANKIT JAIN 和 Ramu Jagini，Amazon Web Services*

## Summary
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-summary"></a>

对于在 [Amazon Aurora 全球数据库](https://aws.amazon.com/rds/aurora/global-database/)上运行关键工作负载的组织来说，管理数据库更新、迁移或扩展的工作可能极具挑战性。确保在零停机的状况下无缝执行这些操作，对于维持服务可用性并避免用户遭遇中断至关重要。

 blue/green 部署策略允许您同时运行两个相同的环境：蓝色（当前环境）和绿色（新环境），从而为这一挑战提供了解决方案。 blue/green 策略使您能够以最小的风险和停机时间实施更改、执行测试和在环境之间切换流量。

此模式可帮助您使用基础设施即代码 (IaC) 原则自动执行 Aurora 全球数据库的 blue/green 部署过程。它使用[AWS CloudFormation[AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)、和 [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 来简化 blue/green 部署。为了提高可靠性，它使用全局事务标识符 (GTIDs) 进行复制。与二进制日志（binlog）复制相比，基于 GTID 的复制能在环境间提供更优的数据一致性和失效转移能力。

**注意**  
此模式假设您使用的是 Aurora MySQL 兼容版全局数据库集群。如果您改用 Aurora PostgreSQL-Compatible，请使用与 MySQL 命令对应的 PostgreSQL 命令。

通过遵循此模式中的步骤，您可以：
+ 配置绿色 Aurora 全球数据库：使用 CloudFormation 模板可以创建反映现有蓝色环境的绿色环境。
+ 设置基于 GTID 的复制：您可以配置 GTID 复制以保持蓝色环境和绿色环境同步。
+ 无缝切换流量：完全同步后，可以使用 Route 53 和 Lambda 自动将流量从蓝色环境切换到绿色环境。
+ 完成部署：确认绿色环境已完全作为主数据库运行，然后停止复制并清理所有临时资源。

此模式中的方法具有以下优势：
+ 减少关键数据库更新或迁移期间的停机时间：自动化可确保环境之间的顺畅过渡，最大限度地减少服务中断。
+ 支持快速回滚：如果流量切换到绿色环境后出现问题，可以快速恢复到蓝色环境并保持服务连续性。
+ 增强测试与验证：可以在不影响实时蓝色环境的情况下对绿色环境进行全面测试，从而降低生产环境中出现错误的可能性。
+ 确保数据一致性：基于 GTID 的复制技术可使蓝绿环境保持同步，从而防止迁移期间出现数据丢失或不一致的情况。
+ 保持业务连续性：自动化 blue/green 部署有助于在更新或迁移期间保持服务可用性，从而避免长时间中断和经济损失。

## 先决条件和限制
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ 源 Aurora MySQL 兼容版全局数据库集群（蓝色环境）。全球数据库提供多区域配置，助力实现高可用性和灾难恢复。有关设置全球数据库集群的说明，请参阅 [Aurora 文档](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-getting-started.html)。
+ 在源集群上启用了 [基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)。

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

**产品版本**
+ Aurora MySQL 兼容版 8.0 或更高版本

## 架构
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-architecture"></a>

![\[使用 GTID 复制技术同步不同区域中的蓝色和绿色环境。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/19922266-c2e5-460b-9a0f-22e6d6736094/images/7a8c3095-7904-4080-906f-0c403c289a4f.png)


下图说明了以下内容：
+ 全局数据库设置：Aurora 全球数据库集群策略性地部署在两个集群上 AWS 区域。此配置支持地理分布和区域冗余，从而增强了灾难恢复能力。
+ 主区域到辅助区域复制：逻辑复制机制确保从主区域到辅助区域的无缝数据同步。这种复制可保持数据一致性，同时最大限度地减少跨地理距离的延迟。
+ 集群之间基于 GTID 的复制：基于 GTID 的复制技术可在蓝色主集群与绿色主集群之间维持事务一致性与有序数据流，确保数据同步的可靠性。
+ 蓝色主集群到辅助集群复制：逻辑复制可在蓝色主集群与其辅助集群之间建立强大的数据管道。这种复制可实现连续的数据同步与高可用性。
+ Route 53 DNS 配置：Route 53 托管区记录管理所有蓝绿集群数据库端点的 DNS 解析。此配置可提供无缝的端点映射，并在失效转移场景中实现高效的流量路由。

## 工具
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您对 AWS 资源进行建模和设置，这样您就可以花更少的时间管理这些资源，而将更多的时间集中在运行的应用程序上 AWS。您可以创建一个描述所需所有 AWS 资源的模板，并 CloudFormation 负责为您配置和配置这些资源。
+  [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，无需预调配或管理服务器即可运行代码。Lambda 只在需要时运行您的代码，并自动进行扩展，从每天几个请求扩展到每秒数千个请求。 
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一种可用性高、可扩展性强的 DNS Web 服务。

## 最佳实践
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-best-practices"></a>

我们建议您仔细阅读 AWS 文档，以加深对 Route 53 中的[蓝/绿部署策略](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)、[基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)和[加权路由策略](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)的理解。这些知识对于有效实施和管理数据库迁移、确保数据一致性、优化流量路由至关重要。通过全面了解这些 AWS 功能和最佳实践，您将能够更好地处理未来的更新，最大限度地减少停机时间并维护弹性和安全的数据库环境。

有关使用此模式 AWS 服务 的指南，请参阅以下 AWS 文档：
+ [亚马逊 Aurora MySQL 的最佳实践](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.BestPractices.html)
+ [CloudFormation  ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) 最佳实践
+ [使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)
+ [亚马逊 Route 53 最佳实践](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/best-practices.html)

## 操作说明
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-epics"></a>

### 创造绿色环境
<a name="create-the-green-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 从蓝色集群创建快照备份。 | 在 blue/green 部署中，绿色环境代表当前（蓝色）数据库环境的全新、相同版本。在切换生产流量之前，可以使用绿色环境来安全地测试更新、验证更改并确保稳定性。它充当实施数据库变更的临时平台，能最大限度地减少对实时环境的干扰。要创建绿色环境，请先在 Aurora MySQL 兼容版全局数据库中创建主（蓝色）集群的快照。此快照为创建绿色环境奠定了基础。要创建快照：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)或者，您可以使用 AWS Command Line Interface (AWS CLI) 来创建快照：<pre>aws rds create-db-cluster-snapshot --db-cluster-snapshot-identifier blue-green-demo --db-cluster-identifier ex-global-cluster --region eu-west-1</pre>请确保快照成功完成，然后再进入下一步。 | 数据库管理员 | 
| 为您的全局数据库及其资源生成 CloudFormation 模板。 |  CloudFormation IaC 生成器可帮助您利用现有 AWS 资源生成 CloudFormation 模板。使用此功能为现有 Aurora MySQL 兼容的全局数据库及其相关资源创建 CloudFormation 模板。此模板配置子网组、安全组、参数组和其他设置。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html) | 数据库管理员 | 
| 修改绿色环境的 CloudFormation 模板。 | 自定义 CloudFormation 模板以反映绿色环境的设置。这包括更新资源名称和标识符，确保绿色环境独立于蓝色集群运行。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)如果您使用 `SnapshotIdentifier` 属性恢复数据库集群，请避免指定诸如 `GlobalClusterIdentifier`、`MasterUsername` 或 `MasterUserPassword` 之类的属性。 | 数据库管理员 | 
| 部署 CloudFormation 堆栈为绿色环境创建资源。 | 在此步骤中，您将部署自定义 CloudFormation 模板来创建绿色环境的资源。要部署 CloudFormation 堆栈，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)CloudFormation 启动创建绿色环境资源的过程。此过程可能需要几分钟才能完成。 | 数据库管理员 | 
| 验证 CloudFormation 堆栈和资源。 |  CloudFormation 堆栈部署完成后，您需要验证绿色环境是否已成功创建：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)验证完成后，您的绿色环境即已准备就绪，可进行后续配置，包括从蓝色环境复制数据。 | 数据库管理员 | 

### 配置基于 GTID 的复制
<a name="configure-gtid-based-replication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证蓝色集群上的 GTID 设置。 | GTIDs 为在蓝色和绿色环境之间复制数据提供了一种高度可靠的方法。[基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)通过为蓝色环境中的每件事务分配唯一标识符，带来一种弹性、简化的方法。与传统的二进制日志复制相比，此方法可确保环境间的数据同步无缝衔接、保持一致，且更易于管理。在配置复制之前，您需要确保在蓝色集群上正确启用基于 GTID 的复制。此步骤确保在蓝色环境中的每件事务都能被唯一追踪，并可复制到绿色环境中。要确认 GTID 是否启用：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)这些设置将为蓝色环境中的所有未来事务启用 GTID 跟踪。确认这些设置之后，就可以开始设置复制。 | 数据库管理员 | 
| 创建复制用户。 | 要将数据从蓝色环境复制到绿色环境，需要在蓝色集群上创建专用的复制用户。该用户将负责管理复制流程。要设置复制用户：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)此用户现在即拥有在两个环境之间复制数据的必要权限。 | 数据库管理员 | 
| 在绿色集群上配置基于 GTID 的复制。 | 下一步是为基于 GTID 的复制配置绿色集群。此设置可确保绿色环境将持续同步蓝色环境中发生的全部事务。要配置绿色集群：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html) | 数据库管理员 | 
| 开始在绿色集群上复制。 | 您现在可以启动复制流程。在绿色集群上运行以下命令：<pre>START SLAVE;</pre>这使绿色环境能够开始同步数据，并从蓝色环境接收和应用事务。 | 数据库管理员 | 
| 验证复制过程。 | 要验证绿色环境是否准确地复制了蓝色集群中的数据：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)如果所有指标都正确，说明基于 GTID 的复制运行平稳，绿色环境已与蓝色环境完全同步。 | 数据库管理员 | 

### 将流量从蓝色集群切换到绿色集群
<a name="switch-traffic-from-blue-to-green-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 Route 53 加权路由策略。 | 验证完蓝色和绿色环境之间的数据一致性之后，可以将流量从蓝色集群切换至绿色集群。这种过渡应该平稳进行且最大限度地减少停机时间，并确保应用程序数据库的完整性。为满足这些要求，可以使用 Route 53 进行 DNS 路由，使用 Lambda 自动切换流量。此外，完善的回滚方案可确保在出现任何问题时，您能够恢复到蓝色集群。第一步是在 Route 53 中配置加权路由。加权路由允许您控制蓝色和绿色集群之间的流量分布，并逐步将流量从一个环境转移到另一个环境。要配置加权路由：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)有关加权路由策略的更多信息，请参阅 [Route 53 文档](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)。 | AWS DevOps | 
| 部署 Lambda 函数来监控复制延迟。 | 为确保绿色环境与蓝色环境完全同步，部署一个 Lambda 函数来监控集群之间的复制延迟。此函数可检查复制状态，特别是 **Seconds\$1Behind\$1Master** 指标，以确定绿色集群是否已准备好处理所有流量。以下是您可以使用的 Lambda 函数示例：<pre>import boto3<br /><br />def check_replication_lag(event, context):<br />    client = boto3.client('rds')<br />    response = client.describe_db_instances(DBInstanceIdentifier='green-cluster-instance')<br />    replication_status = response['DBInstances'][0]['ReadReplicaDBInstanceIdentifiers']<br />    if replication_status:<br />        lag = replication_status[0]['ReplicationLag']<br />        return lag<br />    return -1</pre>此函数检查复制延迟并返回值。如果延迟为零，说明绿色集群与蓝色集群完全同步。 | AWS DevOps | 
| 使用 Lambda 自动调整 DNS 权重。 | 当复制延迟达到零时，即可将所有流量切换到绿色集群。可以使用另一个 Lambda 函数来自动完成此过渡，该函数会调整 Route 53 中的 DNS 权重，将流量 100% 定向到绿色集群。以下是自动切换流量的 Lambda 函数示例：<pre>import boto3<br /><br />def switch_traffic(event, context):<br />    route53 = boto3.client('route53')<br />    lag = check_replication_lag(event, context)<br />    if lag == 0:<br />        response = route53.change_resource_record_sets(<br />            HostedZoneId='YOUR_HOSTED_ZONE_ID',<br />            ChangeBatch={<br />                'Changes': [<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': 'db.example.com',<br />                            'Type': 'CNAME',<br />                            'SetIdentifier': 'GreenCluster',<br />                            'Weight': 100,<br />                            'TTL': 60,<br />                            'ResourceRecords': [{'Value': 'green-cluster-endpoint'}]<br />                        }<br />                    },<br />                    {<br />                        'Action': 'UPSERT',<br />                        'ResourceRecordSet': {<br />                            'Name': 'db.example.com',<br />                            'Type': 'CNAME',<br />                            'SetIdentifier': 'BlueCluster',<br />                            'Weight': 0,<br />                            'TTL': 60,<br />                            'ResourceRecords': [{'Value': 'blue-cluster-endpoint'}]<br />                        }<br />                    }<br />                ]<br />            }<br />        )<br />        return response</pre>此功能会检查复制延迟，并在延迟为零时更新 Route 53 DNS 权重，以将流量完全切换到绿色集群。****割接过程中，如果蓝色集群遇到大量写入流量，请考虑在割接期间暂停写入操作。这样可以确保复制及时完成，并防止蓝色集群与绿色集群之间出现数据不一致的情况。 | AWS DevOps | 
| 验证流量切换。 | Lambda 函数调整 DNS 权重后，您应验证所有流量是否都定向到绿色集群以及切换是否成功。要验证：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)如果一切运行正常，流量切换即告完成。 | AWS DevOps | 
| 如果遇到任何问题，请回滚更改。 | 制定回滚计划至关重要，可防止流量切换后出现任何问题。以下是必要时快速恢复至蓝色集群的方法：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)实施此回滚计划可确保在出现任何意外问题时，将对用户的干扰降至最低。 | AWS DevOps | 

### 验证并停止基于 GTID 的复制
<a name="validate-and-stop-gtid-based-replication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在绿色集群上停止基于 GTID 的复制。 | 将流量从蓝色环境切换至绿色环境后，应验证过渡是否成功，并确保绿色集群按预期运行。此外，必须停止蓝色和绿色集群之间基于 GTID 的复制，因为绿色环境现在用作主数据库。完成这些任务可确保您的环境安全可靠、运行高效，并为持续运营提供最佳支持。要停止复制：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)停止复制后，绿色集群将完全独立，并作为工作负载的主数据库环境运行。 | 数据库管理员 | 
| 清理资源。 | 清理从蓝色集群迁移至绿色集群过程中创建的任何临时或未使用资源，可确保您的环境保持优化、安全且具有成本效益。清理工作包括调整安全设置、进行最终备份以及停用不必要的资源。要清理资源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/p-automate-blue-green-deployments-aurora-global-databases-iac.html)清理资源有助于维护安全高效的环境，降低成本，并确保仅保留必要的基础设施。 | AWS DevOps | 

## 相关资源
<a name="p-automate-blue-green-deployments-aurora-global-databases-iac-resources"></a>

CloudFormation:
+ [CloudFormation 用户指南](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)
+ [CloudFormation  ](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/best-practices.html) 最佳实践
+ [使用 IaC 生成器从现有资源生成模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/generate-IaC.html)
+ 将@@ [整个应用程序导入 CloudFormation](https://aws.amazon.com/blogs/devops/import-entire-applications-into-aws-cloudformation/)（AWS 博客文章）

Amazon Aurora：
+ [Amazon Aurora 用户指南](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Welcome.html)
+ [管理亚马逊 Aurora 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_Aurora.html)

蓝绿部署策略：
+ [亚马逊 Aurora Blue/Green 部署概述](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/blue-green-deployments-overview.html)

基于 GTID 的复制：
+ [使用基于 GTID 的复制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql-replication-gtid.html)（Amazon RDS 文档）

AWS Lambda:
+ [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)

Amazon Route 53：
+ [Amazon Route 53 开发人员指南](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html)
+ [加权路由](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-weighted.html)

MySQL 客户端工具：
+ [PyMYSQL](https://github.com/PyMySQL/PyMySQL)

# 在跨区域自动复制 Amazon RDS 实例 AWS 账户
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts"></a>

*Parag Nagwekar 和 Arun Chandapillai，Amazon Web Services*

## Summary
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-summary"></a>

此模式向您展示了如何使用 AWS Step Functions 和自动跨不同的 AWS 账户 复制、跟踪和回滚亚马逊关系数据库服务 (Amazon RDS) 数据库实例。 AWS Lambda您可以使用此自动化来执行 RDS 数据库实例的大规模复制，而不会影响性能或运营开销 - 无论您的组织规模如何。您还可以使用这种模式来帮助您的组织遵守强制性的数据治理策略或合规性要求，这些策略或合规性要求要求在不同的 AWS 账户 和之间复制和冗余数据 AWS 区域。大规模 Amazon RDS 数据的跨账户复制是低效且容易出错的手动过程，可能成本高昂且耗时，但此模式中的自动化可以帮助您安全、有效且高效地实现跨账户复制。

## 先决条件和限制
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-prereqs"></a>

**先决条件**
+ 二 AWS 账户
+ 一个 RDS 数据库实例，在源中启动并正在运行 AWS 账户
+ 目标中 RDS 数据库实例的子网组 AWS 账户
+ 在源中创建 AWS 账户 并与目标账户共享的 AWS Key Management Service (AWS KMS) 密钥（有关策略详细信息的更多信息，请参阅此模式[的其他信息](#automate-the-replication-of-amazon-rds-instances-across-aws-accounts-additional)部分。）
+ 目标 AWS KMS key 中的一个 AWS 账户 ，用于加密目标账户中的数据库

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

**产品版本**
+ Python 3.9（使用 AWS Lambda）
+ PostgreSQL 11.3、13.x 和 14.x

## 架构
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-architecture"></a>

**技术堆栈**
+ Amazon Relational Database Service(Amazon RDS)
+ Amazon Simple Notification Service（Amazon SNS）
+ AWS Key Management Service (AWS KMS)
+ AWS Lambda
+ AWS Secrets Manager
+ AWS Step Functions

**目标架构**

下图显示了一种架构，用于使用 Step Functions 编排 RDS 数据库实例从源账户（账户 A）到目标账户（账户 B）的定时按需复制。

![\[使用 Step Functions 在源账户和目标账户之间复制 Amazon RDS 数据库实例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6310ad9b-1b1a-4a67-b684-ef605fef3e87/images/001550bb-cf6b-493d-9de9-0229a43753a1.png)


在源账户（图中的账户 A）中，Step Functions 状态机执行以下操作：

1. 从账户 A 的 RDS 数据库实例创建快照

1. 使用 AWS KMS key 来自账户 A 复制和加密快照。为确保传输过程中的加密，无论数据库实例是否加密，都将对快照进行加密。

1. 通过授予账户 B 对快照的访问权限，与账户 B 共享数据库快照。

1. 向 SNS 主题推送通知，然后 SNS 主题调用账户 B 中的 Lambda 函数。

在目标账户（图中的账户 B）中，Lambda 函数运行 Step Functions 状态机来编排以下内容：

1. 将共享快照从账户 A 复制到账户 B，同时使用 AWS KMS key 来自账户 A 先解密数据，然后使用账户 B AWS KMS key 中的账户对数据进行加密。

1. 从 Secrets Manager 中读取密钥，以捕获当前数据库实例的名称。

1. 使用新名称和 Amazon RDS 的默认 AWS KMS key 名称从快照中恢复数据库实例。

1. 读取新数据库的端点并使用新的数据库端点更新 Secrets Manager 中的密钥，然后为以前的数据库实例添加标签，以便日后将其删除。

1. 保留数据库最新 N 个实例，并删除所有其他实例。

## 工具
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-tools"></a>

**AWS 服务**
+ [Amazon Relational Database Service（Amazon RDS）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)可帮助您在 AWS 云中设置、操作和扩展关系数据库。
+ [Amazon Simple Notification Service（Amazon SNS）](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)可帮助您协调和管理发布者与客户端（包括 Web 服务器和电子邮件地址）之间的消息交换。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)帮助您设置 AWS 资源，快速一致地配置资源，并在和的整个 AWS 账户 生命周期中对其进行管理 AWS 区域。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可帮助您创建和控制加密密钥以帮助保护您的数据。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [适用于 Python (Boto3) 的 AWS SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html)是一个软件开发套件，可帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 进行的 API 调用，以便以编程方式检索此密钥。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)是一项无服务器编排服务，可帮助您组合 Lambda 函数和其他函数 AWS 服务 来构建业务关键型应用程序。

**代码存储库**

此模式的代码可在 GitHub [跨账户 RDS 复制](https://github.com/aws-samples/aws-rds-crossaccount-replication)存储库中找到。

## 操作说明
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-epics"></a>

### 只需单击一下即可自动复制 RDS 数据库实例 AWS 账户
<a name="automate-the-replication-of-rds-db-instances-across-aws-accounts-with-a-single-click"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在源账户中部署 CloudFormation 堆栈。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | 云管理员、云架构师 | 
| 在目标账户中部署 CloudFormation 堆栈。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | 云架构师、 DevOps 工程师、云管理员 | 
| 验证目标账户中是否创建了 RDS 数据库实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | 云管理员、云架构师、 DevOps 工程师 | 
| 将 Lambda 函数订阅至 SNS 主题。 | 您必须运行以下 AWS Command Line Interface (AWS CLI) 命令才能将目标账户（账户 B）中的 Lambda 函数订阅到源账户（账户 A）中的 SNS 主题。在账户 A 中，运行以下命令：<pre>aws sns add-permission \<br />--label lambda-access --aws-account-id <DestinationAccount> \<br />--topic-arn <Arn of SNSTopic > \<br />--action-name Subscribe ListSubscriptionsByTopic </pre>在账户 B 中，运行以下命令：<pre>aws lambda add-permission \<br />--function-name <Name of InvokeStepFunction> \<br />--source-arn <Arn of SNSTopic > \<br />--statement-id function-with-sns \<br />--action lambda:InvokeFunction \<br />--principal sns.amazonaws.com</pre>在账户 B 中，运行以下命令：<pre>aws sns subscribe \<br />--protocol "lambda" \<br />--topic-arn <Arn of SNSTopic> \<br />--notification-endpoint <Arn of InvokeStepFunction></pre> | 云管理员、云架构师、数据库管理员 | 
| 将源账户中的 RDS 数据库实例与目标账户同步。 | 通过在源账户中启动 Step Functions 状态机，启动按需数据库复制。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html)调度程序可帮助您按计划自动运行复制，但默认情况下调度程序处于关闭状态。您可以在目标账户 CloudFormation 堆栈的 “**资源**” 选项卡中找到计划程序的 Amazon CloudWatch 规则名称。有关如何修改 CloudWatch 事件规则的说明，请参阅 CloudWatch 文档中的[删除或禁用 CloudWatch 事件规则](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Delete-or-Disable-Rule.html)。 | 云架构师、 DevOps 工程师、云管理员 | 
| 需要时，可以将数据库回滚至之前的任何副本。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-the-replication-of-amazon-rds-instances-across-aws-accounts.html) | 云管理员、数据库管理员、工程师 DevOps  | 

## 相关资源
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-resources"></a>
+ [跨区域只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.CrossRegionReadReplicas.html)（Amazon RDS 文档）
+ [蓝绿部署](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.BlueGreenDeployments.html)（Amazon RDS 文档）

## 附加信息
<a name="automate-the-replication-of-amazon-rds-instances-across-aws-accounts-additional"></a>

您可以使用以下示例策略来 AWS KMS key 共享您的信息 AWS 账户。

```
{
    "Version": "2012-10-17",		 	 	 
    "Id": "cross-account-rds-kms-key",
    "Statement": [
        {
            "Sid": "Enable user permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<SourceAccount>:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow administration of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<DestinationAccount>:root"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::<DestinationAccount>:root",
                    "arn:aws:iam::<SourceAccount>:root"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey",
                "kms:CreateGrant"
            ],
            "Resource": "*"
        }
    ]
}
```

# 使用 AWS Lambda 任务计划程序在亚马逊 EC2 上运行的 SQL Server Express 版中自动执行数据库任务
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2"></a>

*Subhani Shaik，Amazon Web Services*

## Summary
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-summary"></a>

此模式演示了如何在 SQL Server Express 版（SQL Server 的免费版本）中计划和管理数据库任务。但是，SQL Server Express 版本缺少通常处理自动数据库操作的 SQL Server 代理服务。此模式说明了在亚马逊弹性计算云 (Amazon) 实例上运行的 SQL Server Express 版中，如何使用任务计划程序和 Lambda 作为自动执行数据库任务的替代方案。 EC2

[任务计划程序](https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page)是一种内置 Windows 系统实用程序，便于自动执行例行任务。它提供了一种安排和管理自动化操作的机制，无需再在重复的过程中手动干预。[AWS Lambda](https://aws.amazon.com/lambda/) 是一种无服务器计算服务，可自动运行代码以响应事件，而无需您管理底层基础设施。

## 先决条件和限制
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ 使用 Amazon Virtual Private Cloud（Amazon VPC）创建的虚拟私有云（VPC）
+ 装有 Windows 服务器的亚马逊 EC2 实例
+ 通过 Windows Server 连接到亚马逊实例的亚马逊 Elastic Block Store (A EC2 mazon EBS) 卷
+ [SQL Server Express Edition](https://www.microsoft.com/en-us/download/details.aspx?id=101064) 二进制文件

**限制**
+ 有关 SQL Server Express 版功能限制的信息，请访问 [Microsoft 网站](https://learn.microsoft.com/en-us/sql/sql-server/editions-and-components-of-sql-server-2019?view=sql-server-ver16)。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然后选择相应服务的链接。

**产品版本**
+ 包含 SQL Server Express 版的 SQL Server 2016 或更高版本

## 架构
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-architecture"></a>

下图显示了安装了 SQL Server Express 版的情况下运行的亚马逊 EC2 实例。该实例可通过远程桌面协议 (RDP) 客户端或从中 AWS Systems Manager Session Manager访问。 AWS Key Management Service (AWS KMS) 处理 Amazon EBS 卷的数据加密以确保 data-at-rest安全。基础设施还包括 AWS Identity and Access Management (IAM)，它提供访问控制和管理执行 Lambda 函数的权限。Amazon Simple Storage Service（Amazon S3）可存储 Lambda 函数。

![\[运行在私有子网上安装了 SQL Server Express 版的 Amazon EC2 实例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/3af2174d-bf49-4e43-86f7-34759e5eea84/images/3a37dcb8-10af-42f2-8ff1-fab4f87eb646.png)


## 工具
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-tools"></a>

**AWS 服务**
+ [Amazon Elastic Block Store (Amazon](https://docs.aws.amazon.com/ebs/latest/userguide/what-is-ebs.html) EBS) 提供用于亚马逊实例的块级存储卷。 EC2 
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可帮助您创建和控制加密密钥以帮助保护您的数据。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [AWS Systems Manager Session Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager.html)是一个完全托管的 AWS Systems Manager 工具。使用会话管理器，您可以管理您的 Amazon EC2 实例、边缘设备、本地服务器和虚拟机 (VMs)。
+ [Amazon Virtual Private Cloud（亚马逊 VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络，并具有使用 AWS的可扩展基础设施的优势。

**其他工具**
+ [Microsoft SQL Server Management Studio (SSMS)](https://learn.microsoft.com/en-us/ssms/download-sql-server-management-studio-ssms) 是一款用于管理 SQL Server 的工具，包括访问、配置和管理 SQL Server 组件。
+ [Python](https://www.python.org/) 是一种通用的计算机编程语言。您可以使用它在 [AWS 云](https://aws.amazon.com/developer/language/python/) 上构建应用程序、自动执行任务和开发服务。
+ [任务计划程序](https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page)是一种 Microsoft 工具，您可以用它在计算机上自动安排例行任务。

## 最佳实践
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-best-practices"></a>
+ [Amazon 的最佳实践 EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-best-practices.html)
+ [在亚马逊上部署微软 SQL Server 的最佳实践 EC2](https://docs.aws.amazon.com/prescriptive-guidance/latest/sql-server-ec2-best-practices/welcome.html)
+ [使用 AWS Lambda 函数的最佳实践](https://docs.aws.amazon.com/lambda/latest/dg/best-practices.html)
+ [ IAM 安全最佳实操](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)

## 操作说明
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-epics"></a>

### 创建亚马逊 EC2 实例并安装 SQL Server Express 版
<a name="create-an-amazon-ec2-instance-and-install-sql-server-express-edition"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 Amazon EC2 实例。 | 要创建亚马逊 EC2 实例，请打开亚马逊 EC2 控制台，网址为，[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)然后从可用于 Windows 服务器的实例列表中选择一个[亚马逊系统映像 (AMI)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html)。有关更多信息，请参阅 AWS 文档中的[启动 Amazon EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/LaunchingAndUsingInstances.html)。 | DBA、AWS DevOps | 
| 安装 SQL Server Express 版本。 | 要安装 SQL Server Express 版，请完成以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html) | DBA、AWS DevOps | 

### 创建自动数据库维护任务
<a name="create-automated-database-maintenance-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确定例行任务。 | 确定要自动执行的例行任务。例如，下列任务符合自动化的条件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html) | 数据库管理员 | 
| 准备 SQL 脚本。 | 要准备 SQL 脚本，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html) | 数据库管理员 | 
| 配置访问权限。 | 要配置访问权限，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html) | 数据库管理员 | 

### 通过任务计划程序自动执行任务
<a name="automate-tasks-with-task-scheduler"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建批处理文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html)<pre>sqlcmd -S servername -U username -P password -i <T-SQL query path.sql></pre>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html)<pre><br />@echo off<br />sqlcmd -S [ServerName] -d [DatabaseName] -U username -P password -i "PathToSQLScript\Script.sql" -o "PathToOutput\Output.txt"</pre> | AWS DevOps、DBA | 
| 在任务计划程序中创建任务。 | 要在任务计划程序中创建任务，请使用以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html)要手动运行任务，请右键单击新创建的任务，然后选择**运行**。 | 数据库管理员 | 
| 查看任务状态。 | 要在任务计划程序中查看任务的状态，请使用以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html) | DBA、AWS DevOps | 

### 使用自动执行任务 AWS Lambda
<a name="automate-tasks-with-lamlong"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 实施解决方案。 | 要实施此模式的解决方案，请采用以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.html) | AWS DevOps， DevOps 工程师 | 

## 问题排查
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| Lambda 问题 | 有关使用时可能遇到的错误和问题的帮助 AWS Lambda，请参阅文档[中的 Lambda 问题疑难解答](https://docs.aws.amazon.com/lambda/latest/dg/lambda-troubleshooting.html)。 AWS  | 

## 相关资源
<a name="automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2-resources"></a>
+ [Amazon EC2 实例类型](https://aws.amazon.com/ec2/instance-types/)
+ [AWS Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/with-eventbridge-scheduler.html)
+ [AWS Lambda 定价](https://aws.amazon.com/lambda/pricing/)
+ [开发人员任务计划程序](https://learn.microsoft.com/en-us/windows/win32/taskschd/task-scheduler-start-page)（Microsoft 网站）

# 使用 DR Orchestrator Framework 自动执行跨区域故障转移和故障恢复
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework"></a>

*Jitendra Kumar、Pavithra Balasubramanian 和 Oliver Francis，Amazon Web Services*

## Summary
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework-summary"></a>

此模式描述了如何使用 [DR Orchestrator Framework](https://docs.aws.amazon.com/prescriptive-guidance/latest/automate-dr-solution-relational-database/dr-orchestrator-framework-overview.html) 来编排和自动执行容易出错的手动步骤，以便跨 Amazon Web Services（AWS）区域执行灾难恢复。该模式涵盖了以下数据库：
+ Amazon Relational Database Service（Amazon RDS）for MySQL、Amazon RDS for PostgreSQL 或 Amazon RDS for MariaDB
+ Amazon Aurora MySQL 兼容版本或 Amazon Aurora PostgreSQL 兼容版本（使用集中文件）
+ 亚马逊 ElastiCache （Redis OSS）

为了演示 DR Orchestrator Framework 的功能，您需要创建两个数据库实例或集群。主节点在中 AWS 区域 `us-east-1`，次要在中`us-west-2`。要创建这些资源，您可以使用 [aws-cross-region-dr-databases GitHub 存储库`App-Stack`](https://github.com/aws-samples/aws-cross-region-dr-databases)文件夹中的 AWS CloudFormation 模板。

## 先决条件和限制
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework-prereqs"></a>

**一般先决条件**
+ 灾难恢复 Orchestrator 框架同时部署在主服务器和辅助设备中 AWS 区域
+ 两个 [Amazon Simple Storage Service](https://aws.amazon.com/s3/) 存储桶
+ 具有两个子网和一个 AWS 安全组的[虚拟私有云 (VPC)](https://aws.amazon.com/vpc/) 

**引擎特定的先决条件**
+ **亚马逊 Aurora** — 必须至少有一个 Aurora 全球数据库在两个数据库中可用 AWS 区域。您可将 `us-east-1` 作为主要区域，也可将 `us-west-2` 用作辅助区域。
+ **亚马逊 ElastiCache （Redis OSS）**— ElastiCache 全球数据存储必须一分为二。 AWS 区域您可将 `use us-east-1` 作为主要区域，也可将 `us-west-2` 用作辅助区域。

**Amazon RDS 限制**
+ DR Orchestrator Framework 在进行故障转移或故障恢复之前不会检查复制滞后。必须手动检查复制滞后。
+ 此解决方案已使用包含一个只读副本的主数据库实例进行了测试。如果要使用多个只读副本，请在生产环境中实施解决方案之前对其进行全面测试。

**Aurora 限制**
+ 功能可用性和支持因每个数据库引擎的特定版本以及 AWS 区域而异。有关跨区域复制的功能和区域可用性的更多信息，请参阅[跨区域只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.CrossRegionReadReplicas.html)。
+ Aurora 全局数据库对支持的 Aurora 数据库实例类和最大数量有特定的配置要求 AWS 区域。有关更多信息，请参阅 [Amazon Aurora 全局数据库的配置要求](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-getting-started.html#aurora-global-database.configuration.requirements)。
+ 此解决方案已使用包含一个只读副本的主数据库实例进行了测试。如果要使用多个只读副本，请在生产环境中实施解决方案之前对其进行全面测试。

**ElastiCache 限制**
+ 有关全球数据存储的区域可用性和 ElastiCache 配置要求的信息，请参阅 ElastiCache 文档中的[先决条件和限制](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Redis-Global-Datastores-Getting-Started.html)。

**Amazon RDS ****产品版本**

Amazon RDS 支持以下引擎版本：
+ **MySQL** – Amazon RDS 支持运行以下版本 [MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MySQL.html) 的数据库实例：MySQL 8.0 和 MySQL 5.7
+ **PostgreSQL** – 有关 Amazon RDS for PostgreSQL 的可支持版本的信息，请参阅[可用的 PostgreSQL 数据库版本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html#PostgreSQL.Concepts.General.DBVersions)。
+ **MariaDB** – Amazon RDS 支持运行以下版本 [MariaDB](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_MariaDB.html) 的数据库实例：
  + MariaDB 10.11
  + MariaDB 10.6
  + MariaDB 10.5

**Aurora 产品版本**
+ Amazon Aurora 全球数据库切换要求使用与 MySQL 5.7 兼容的 Aurora MySQL 兼容版，且需为 2.09.1 或更高版本

  有关更多信息，请参阅 [Amazon Aurora 全局数据库的限制](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html#aurora-global-database.limitations)。

**ElastiCache (Redis OSS) 产品版本**

亚马逊 ElastiCache （Redis OSS）支持以下 Redis 版本：
+ Redis 7.1（加强版）
+ Redis 7.0（加强版）
+ Redis 6.2（加强版）
+ Redis 6.0（加强版）
+ Redis 5.0.6（加强版）

有关更多信息，请参阅[支持的 ElastiCache (Redis OSS) 版本](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Redis-Global-Datastores-Getting-Started.html)。

## 架构
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework-architecture"></a>

**Amazon RDS**** 架构**

Amazon RDS 架构包括以下资源：
+ 在主区域 (`us-east-1`) 中创建的主要 Amazon RDS 数据库实例，可供客户端 read/write 访问
+ 在辅助区域（`us-west-2`）中创建的 Amazon RDS 只读副本，为客户端提供只读访问权限
+ DR Orchestrator Framework 同时部署在主要和辅助区域中

![\[单个 AWS 账户中的双区域 RDS 架构示意图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/8d39561f-924e-4b3e-8175-c5c3cab163bd/images/ad217033-600c-40da-929c-b9f9aecb4c2c.png)


此图显示以下内容：

1. 实例主集群和辅助实例之间的异步复制

1. 客户端在主要区域中的读/写访问权限

1. 客户端在辅助区域中的只读访问权限

**Aurora 架构**

Amazon Aurora 架构包括以下资源：
+ 在主区域（`us-east-1`）中创建的主 Aurora 数据库集群，具有活动写入器端点
+ 在辅助区域（`us-west-2`）中创建的 Aurora 数据库集群，具有非活动写入器端点
+ DR Orchestrator Framework 同时部署在主要和辅助区域中

![\[在单个 AWS 账户中部署双区域 Aurora 的示意图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/8d39561f-924e-4b3e-8175-c5c3cab163bd/images/524ec002-5aa7-47b2-8c8d-6d1a3b535e9e.png)


此图显示以下内容：

1. 主集群和辅助集群之间的异步复制

1. 带有活跃写入器端点的主数据库集群

1. 带有非活跃写入器端点的辅助数据库集群

**ElastiCache (Redis OSS) 架构**

亚马逊 ElastiCache （Redis OSS）架构包括以下资源：
+ 由两个集群创建的 ElastiCache （Redis OSS）全球数据存储：

  1. 主区域（`us-east-1`）中的主集群

  1. 辅助集群位于辅助区域（`us-west-2`）中。
+ 两个集群之间使用 TLS 1.2 加密实现的 Amazon 跨区域链接
+ DR Orchestrator Framework 同时部署在主要和辅助区域中

![\[带有 Amazon 跨区域链接的双区域 ElastiCache 部署示意图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/8d39561f-924e-4b3e-8175-c5c3cab163bd/images/cf6620a0-dd42-4042-8dc2-012bf514ffc0.png)


**自动化和扩展**

DR Orchestrator Framework 具有可扩展性，并行支持多个 AWS 数据库的故障转移或故障恢复。

您可以使用以下负载代码对账户中的多个 AWS 数据库进行故障切换。在此示例中，三个 AWS 数据库（两个全球数据库，例如兼容 Aurora MySQL 或兼容 Aurora PostgreSQL 的数据库，以及一个 Amazon RDS for MySQL 实例）故障转移到灾难恢复区域：

```
{
  "StatePayload": [
    {
      "layer": 1,
      "resources": [
        {
          "resourceType": "PlannedFailoverAurora",
          "resourceName": "Switchover (planned failover) of Amazon Aurora global databases (MySQL)",
          "parameters": {
            "GlobalClusterIdentifier": "!Import dr-globaldb-cluster-mysql-global-identifier",
            "DBClusterIdentifier": "!Import dr-globaldb-cluster-mysql-cluster-identifier" 
          }
        },
        {
          "resourceType": "PlannedFailoverAurora",
          "resourceName": "Switchover (planned failover) of Amazon Aurora global databases (PostgreSQL)",
          "parameters": {
            "GlobalClusterIdentifier": "!Import dr-globaldb-cluster-postgres-global-identifier",
            "DBClusterIdentifier": "!Import dr-globaldb-cluster-postgres-cluster-identifier" 
          }
        },
        {
          "resourceType": "PromoteRDSReadReplica",
          "resourceName": "Promote RDS for MySQL Read Replica",
          "parameters": {
            "RDSInstanceIdentifier": "!Import rds-mysql-instance-identifier",
            "TargetClusterIdentifier": "!Import rds-mysql-instance-global-arn"
          }
        }         
      ]
    }
  ]
}
```

## 工具
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework-tools"></a>

**AWS 服务**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [Amazon ElastiCache](https://docs.aws.amazon.com/elasticache/) 可帮助您在中设置、管理和扩展分布式内存缓存环境。 AWS 云这种模式使用亚马逊 ElastiCache （Redis OSS）。
+ [AWS Lambda](https://aws.amazon.com/lambda/) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。在这种模式中，使用 Lambda 函数 AWS Step Functions 来执行这些步骤。
+ [Amazon Relational Database Service（Amazon RDS）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)可帮助您在 AWS 云中设置、操作和扩展关系数据库。此模式支持 Amazon RDS for MySQL、Amazon RDS for PostgreSQL 和 Amazon RDS for MariaDB。
+ [适用于 Python (Boto3) 的 AWS SDK](https://aws.amazon.com/sdk-for-python/)帮助您将 Python 应用程序、库或脚本与集成 AWS 服务。在这种模式中，Boto3 APIs 用于与数据库实例或全局数据库通信。
+ [AWS Step Functions](https://aws.amazon.com/step-functions/)是一项无服务器编排服务，可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。在此模式中，Step Functions 状态机用于编排和运行数据库实例或全局数据库的跨区域故障转移和故障恢复。

**代码存储库**

此模式的代码可在上的 [aws-cross-region-dr GitHub-databases 存储库](https://github.com/aws-samples/aws-cross-region-dr-databases/tree/main/App-Stack)中找到。

## 操作说明
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework-epics"></a>

### 安装 DR Orchestrator Framework
<a name="install-dr-orchestrator-framework"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆 GitHub 存储库。 | 要克隆存储库，请运行以下命令：<pre>git clone https://github.com/aws-samples/aws-cross-region-dr-databases.git</pre> | AWS DevOps，AWS 管理员 | 
| 将 Lambda 函数代码打包到 .zip 文件存档中。 | 为 Lambda 函数创建存档文件以包含 DR Orchestrator Framework 依赖项：<pre>cd <YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts<br /><br />bash scripts/deploy-orchestrator-sh.sh</pre> | AWS 管理员 | 
| 创建 S3 存储桶。 | 需要使用 S3 存储桶来存储 DR Orchestrator Framework 以及您的最新配置。创建两个 S3 存储桶，一个位于主区域（`us-east-1`）中，一个在辅助区域（`us-west-2`）中：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.html)将 `xxxxxx` 替换为随机值以使存储桶名称保持唯一。 | AWS 管理员 | 
| 创建子网和安全组。 | 在主区域（`us-east-1`）和辅助区域（`us-west-2`）中，为在您的 VPC 中部署 Lambda 函数创建两个子网和一个安全组：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.html) | AWS 管理员 | 
| 更新 DR Orchestrator 参数文件。 | 在 `<YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts/cloudformation` 文件夹中，更新以下 DR Orchestrator 参数文件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.html)使用以下参数值，将 `x` 和 `y` 替换为资源名称：<pre>[<br />    {<br />         "ParameterKey": "TemplateStoreS3BucketName",<br />         "ParameterValue": "dr-orchestrator-xxxxxx-us-east-1"<br />    },<br />    {<br />        "ParameterKey": "TemplateVPCId",<br />        "ParameterValue": "vpc-xxxxxx"<br />    },<br />    {<br />        "ParameterKey": "TemplateLambdaSubnetID1",<br />        "ParameterValue": "subnet-xxxxxx"<br />    },<br />    {<br />        "ParameterKey": "TemplateLambdaSubnetID2",<br />        "ParameterValue": "subnet-yyyyyy"<br />    },<br />    {<br />        "ParameterKey": "TemplateLambdaSecurityGroupID",<br />        "ParameterValue": "sg-xxxxxxxxxx"<br />    }<br /> ]</pre> | AWS 管理员 | 
| 将 DR Orchestrator Framework 代码上传到 S3 存储桶。 | S3 存储桶中的代码比本地目录中的代码更安全。将 `DR-Orchestration-artifacts` 目录（包括所有文件和子文件夹）上传到 S3 存储桶。要上传代码，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.html) | AWS 管理员 | 
| 在主要区域中部署 DR Orchestrator Framework。 | 要在主要区域（`us-east-1`）中部署 DR Orchestrator Framework，请运行以下命令：<pre>cd <YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts/cloudformation<br /><br />aws cloudformation deploy \<br />--region us-east-1 \<br />--stack-name dr-orchestrator \<br />--template-file Orchestrator-Deployer.yaml \<br />--parameter-overrides file://Orchestrator-Deployer-parameters-us-east-1.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre> | AWS 管理员 | 
| 在辅助区域中部署 DR Orchestrator Framework。 | 在辅助区域（`us-west-2`）中，运行以下命令：<pre>cd <YOUR-LOCAL-GIT-FOLDER>/DR-Orchestration-artifacts/cloudformation<br /><br />aws cloudformation deploy \<br />--region us-west-2 \<br />--stack-name dr-orchestrator \<br />--template-file Orchestrator-Deployer.yaml \<br />--parameter-overrides file://Orchestrator-Deployer-parameters-us-west-2.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre> | AWS 管理员 | 
| 验证部署。 | 如果 CloudFormation 命令成功运行，它将返回以下输出：<pre>Successfully created/updated stack - dr-orchestrator</pre>或者，您可以导航到 CloudFormation 控制台并验证`dr-orchestrator`堆栈的状态。 | AWS 管理员 | 

### 创建数据库实例或集群
<a name="create-the-database-instances-or-clusters"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建数据库子网和安全组。 | 在您的 VPC 中，在主区域（`us-east-1`）和辅助区域（`us-west-2`）中为数据库实例或全局数据库创建两个子网和一个安全组：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.html) | AWS 管理员 | 
| 更新主数据库实例或集群的参数文件。 | 在 `<YOUR LOCAL GIT FOLDER>/App-Stack` 文件夹中，更新主要区域的参数文件。**Amazon RDS**在 `RDS-MySQL-parameter-us-east-1.json` 文件中，使用您创建的资源的名称更新 `SubnetIds` 和 `DBSecurityGroup`：<pre>{<br />  "Parameters": {<br />    "SubnetIds": "subnet-xxxxxx,subnet-xxxxxx",<br />    "DBSecurityGroup": "sg-xxxxxxxxxx",<br />    "MySqlGlobalIdentifier":"rds-mysql-instance",<br />    "InitialDatabaseName": "mysqldb",<br />    "DBPortNumber": "3789",<br />    "PrimaryRegion": "us-east-1",<br />    "SecondaryRegion": "us-west-2",<br />    "KMSKeyAliasName": "rds/rds-mysql-instance-KmsKeyId"<br />  }<br />}<br /></pre>**Amazon Aurora** 在 `Aurora-MySQL-parameter-us-east-1.json` 文件中，使用您创建的资源的名称更新 `SubnetIds` 和 `DBSecurityGroup`：<pre>{<br />  "Parameters": {<br />    "SubnetIds": "subnet1-xxxxxx,subnet2-xxxxxx",<br />    "DBSecurityGroup": "sg-xxxxxxxxxx",<br />    "GlobalClusterIdentifier":"dr-globaldb-cluster-mysql",<br />    "DBClusterName":"dbcluster-01",<br />    "SourceDBClusterName":"dbcluster-02",<br />    "DBPortNumber": "3787",<br />    "DBInstanceClass":"db.r5.large",<br />    "InitialDatabaseName": "sampledb",<br />    "PrimaryRegion": "us-east-1",<br />    "SecondaryRegion": "us-west-2",<br />    "KMSKeyAliasName": "rds/dr-globaldb-cluster-mysql-KmsKeyId"<br />  }<br />}</pre>**亚马逊 ElastiCache （Redis OSS）**在 `ElastiCache-parameter-us-east-1.json` 文件中，使用您创建的资源的名称更新 `SubnetIds` 和 `DBSecurityGroup`。<pre>{<br />  "Parameters": {<br />    "CacheNodeType": "cache.m5.large",<br />    "DBSecurityGroup": "sg-xxxxxxxxxx",<br />    "SubnetIds": "subnet-xxxxxx,subnet-xxxxxx",<br />    "EngineVersion": "5.0.6",<br />    "GlobalReplicationGroupIdSuffix": "demo-redis-global-datastore",<br />    "NumReplicas": "1",<br />    "NumShards": "1",<br />    "ReplicationGroupId": "demo-redis-cluster",<br />    "DBPortNumber": "3788",<br />    "TransitEncryption": "true",<br />    "KMSKeyAliasName": "elasticache/demo-redis-global-datastore-KmsKeyId",<br />    "PrimaryRegion": "us-east-1",<br />    "SecondaryRegion": "us-west-2"<br />  }<br />}</pre> | AWS 管理员 | 
| 在主要区域中部署数据库实例或集群。 | 要在主区域（`us-east-1`）中部署您的实例或集群，请根据您的数据库引擎运行以下命令。**Amazon RDS**<pre>cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack<br /><br />aws cloudformation deploy \<br />--region us-east-1 \<br />--stack-name rds-mysql-app-stack \<br />--template-file RDS-MySQL-Primary.yaml \<br />--parameter-overrides file://RDS-MySQL-parameter-us-east-1.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre>**Amazon Aurora**<pre>cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack<br /><br />aws cloudformation deploy \<br />--region us-east-1 \<br />--stack-name aurora-mysql-app-stack \<br />--template-file Aurora-MySQL-Primary.yaml \<br />--parameter-overrides file://Aurora-MySQL-parameter-us-east-1.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre>**亚马逊 ElastiCache （Redis OSS）**<pre>cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack<br /><br />aws cloudformation deploy \<br />--region us-east-1 --stack-name elasticache-ds-app-stack \<br />--template-file ElastiCache-Primary.yaml \<br />--parameter-overrides file://ElastiCache-parameter-us-east-1.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback<br /></pre>验证 CloudFormation 资源是否成功部署。 | AWS 管理员 | 
| 更新辅助数据库实例或集群的参数文件。 | 在 `<YOUR LOCAL GIT FOLDER>/App-Stack` 文件夹中，更新辅助区域的参数文件。**Amazon RDS**在 `RDS-MySQL-parameter-us-west-2.json` 文件中，使用您创建的资源的名称更新 `SubnetIDs` 和 `DBSecurityGroup`。`PrimaryRegionKMSKeyArn`使用`MySQLKmsKeyId`从主数据库实例 CloudFormation 堆栈的 O **ut** puts 部分中获取的值更新：<pre>{<br />  "Parameters": {<br />    "SubnetIds": "subnet-aaaaaaaaa,subnet-bbbbbbbbb",<br />    "DBSecurityGroup": "sg-cccccccccc",<br />    "MySqlGlobalIdentifier":"rds-mysql-instance",<br />    "InitialDatabaseName": "mysqldb",<br />    "DBPortNumber": "3789",<br />    "PrimaryRegion": "us-east-1",<br />    "SecondaryRegion": "us-west-2",<br />    "KMSKeyAliasName": "rds/rds-mysql-instance-KmsKeyId",<br />    "PrimaryRegionKMSKeyArn":"arn:aws:kms:us-east-1:xxxxxxxxx:key/mrk-xxxxxxxxxxxxxxxxxxxxx"<br />  }<br />} </pre>**Amazon Aurora**在 `Aurora-MySQL-parameter-us-west-2.json` 文件中，使用您创建的资源的名称更新 `SubnetIDs` 和 `DBSecurityGroup`。`PrimaryRegionKMSKeyArn`使用`AuroraKmsKeyId`从主数据库实例 CloudFormation 堆栈的 O **ut** puts 部分中获取的值更新：<pre>{<br />  "Parameters": {<br />    "SubnetIds": "subnet1-aaaaaaaaa,subnet2-bbbbbbbbb",<br />    "DBSecurityGroup": "sg-cccccccccc",<br />    "GlobalClusterIdentifier":"dr-globaldb-cluster-mysql",<br />    "DBClusterName":"dbcluster-01",<br />    "SourceDBClusterName":"dbcluster-02",<br />    "DBPortNumber": "3787",<br />    "DBInstanceClass":"db.r5.large",<br />    "InitialDatabaseName": "sampledb",<br />    "PrimaryRegion": "us-east-1",<br />    "SecondaryRegion": "us-west-2",<br />    "KMSKeyAliasName": "rds/dr-globaldb-cluster-mysql-KmsKeyId"<br />  }<br />}</pre>**亚马逊 ElastiCache （Redis OSS）**在 `ElastiCache-parameter-us-west-2.json` 文件中，使用您创建的资源的名称更新 `SubnetIDs` 和 `DBSecurityGroup`。`PrimaryRegionKMSKeyArn`使用`ElastiCacheKmsKeyId`从主数据库实例 CloudFormation 堆栈的 O **ut** puts 部分中获取的值更新：<pre>{<br />  "Parameters": {<br />    "CacheNodeType": "cache.m5.large",<br />    "DBSecurityGroup": "sg-cccccccccc",<br />    "SubnetIds": "subnet-aaaaaaaaa,subnet-bbbbbbbbb",<br />    "EngineVersion": "5.0.6",<br />    "GlobalReplicationGroupIdSuffix": "demo-redis-global-datastore",<br />    "NumReplicas": "1",<br />    "NumShards": "1",<br />    "ReplicationGroupId": "demo-redis-cluster",<br />    "DBPortNumber": "3788",<br />    "TransitEncryption": "true",<br />    "KMSKeyAliasName": "elasticache/demo-redis-global-datastore-KmsKeyId",<br />    "PrimaryRegion": "us-east-1",<br />    "SecondaryRegion": "us-west-2"<br />  }<br />}</pre> | AWS 管理员 | 
| 在辅助区域中部署数据库实例或集群。 | 根据您的数据库引擎运行以下命令。**Amazon RDS**<pre>cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack<br /><br />aws cloudformation deploy \<br />--region us-west-2 \<br />--stack-name rds-mysql-app-stack \<br />--template-file RDS-MySQL-DR.yaml \<br />--parameter-overrides file://RDS-MySQL-parameter-us-west-2.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre>**Amazon Aurora**<pre>cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack<br /><br />aws cloudformation deploy \<br />--region us-west-2 \<br />--stack-name aurora-mysql-app-stack \<br />--template-file Aurora-MySQL-DR.yaml \<br />--parameter-overrides file://Aurora-MySQL-parameter-us-west-2.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre>**亚马逊 ElastiCache （Redis OSS）**<pre>cd <YOUR-LOCAL-GIT-FOLDER>/App-Stack<br /><br />aws cloudformation deploy \<br />--region us-west-2 \<br />--stack-name elasticache-ds-app-stack \<br />--template-file ElastiCache-DR.yaml \<br />--parameter-overrides file://ElastiCache-parameter-us-west-2.json \<br />--capabilities CAPABILITY_AUTO_EXPAND CAPABILITY_NAMED_IAM CAPABILITY_IAM \<br />--disable-rollback</pre>验证 CloudFormation 资源是否成功部署。 | AWS 管理员 | 

## 相关资源
<a name="automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework-resources"></a>
+ [数据库的灾难恢复策略 AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-database-disaster-recovery/welcome.html)（AWS 规范性指导策略）
+ [在 AWS（AWS 规范性指导指南）上自动执行关系数据库灾难恢复解决方案](https://docs.aws.amazon.com/prescriptive-guidance/latest/automate-dr-solution-relational-database/dr-orchestrator-framework-overview.html)
+ [使用 Amazon Aurora Global Database](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html)
+ [跨 AWS 区域 使用全局数据存储进行复制](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Redis-Global-Datastore.html)
+ [在 AWS（AWS 规范性指导指南）上自动执行关系数据库灾难恢复解决方案](https://docs.aws.amazon.com/prescriptive-guidance/latest/automate-dr-solution-relational-database/introduction.html)

# 使用 Systems Manager 自动备份 SAP HANA 数据库和 EventBridge
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge"></a>

*Ambarish Satarkar 和 Gaurav Rath，Amazon Web Services*

## Summary
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge-summary"></a>

此模式描述了如何使用 AWS Systems Manager、亚马逊 EventBridge、亚马逊简单存储服务 (Amazon S3) Service 和适用于 SAP HANA 的 AWS Backint Agent 自动备份 SAP HANA 数据库。

此模式提供了一种使用 `BACKUP DATA` 命令的基于 Shell 脚本的方法，无需在多个系统中维护每个操作系统（OS）实例的脚本和作业配置。


| 
| 
| 注意：截至2023年4月，AWS Backup宣布在亚马逊弹性计算云（亚马逊 EC2）上支持SAP HANA数据库。有关更多信息，请参阅 [Amazon EC2 实例上的 SAP HANA 数据库备份](https://docs.aws.amazon.com/aws-backup/latest/devguide/backup-saphana.html)。根据贵组织的需求，您可以使用 AWS Backup 服务自动备份您的 SAP HANA 数据库，也可以使用这种模式。 | 
| --- |

## 先决条件和限制
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge-prereqs"></a>

**先决条件**
+ 在为 Systems Manager 配置的托管亚马逊弹性计算云 (Amazon EC2) 实例上，支持版本处于运行状态的现有 SAP HANA 实例
+ 已安装 2.3.274.0 或更高版本的 Systems Manager Agent（SSM Agent）
+ 未启用公开访问权限的 S3 存储桶
+ 一个名为 `SYSTEM` 的 `hdbuserstore` 密钥
+ AWS Identity and Access Management（IAM）角色用于自动化运行手册按计划运行
+ 并且 `AmazonSSMManagedInstanceCore` 和 `ssm:StartAutomationExecution` 策略附加到 Systems Manager 自动化服务角色。

**限制**
+ 适用于 SAP HANA 的 AWS Backint 代理不支持重复数据删除。
+ 适用于 SAP HANA 的 AWS Backint 代理不支持数据压缩。

**产品版本**

在以下操作系统上支持 AWS Backint 代理：
+ SUSE Linux Enterprise Server
+ SUSE Linux Enterprise Server for SAP
+ Red Hat Enterprise Linux for SAP

AWS Backint 代理支持以下数据库： 
+ SAP HANA 1.0 SP12 （单节点和多节点）
+ SAP HANA 2.0 及更高版本（单节点和多节点）

## 架构
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge-architecture"></a>

**目标技术堆栈**
+ AWS Backint 代理
+ Amazon S3
+ AWS Systems Manager
+ Amazon EventBridge
+ SAP HANA

**目标架构**

下图显示了安装 AWS Backint Agent、S3 存储桶和 Systems Manager EventBridge 的安装脚本，它们使用命令文档来安排定期备份。

![\[安排定期备份的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/0aa22a27-d100-483d-95f9-c3101f40402c/images/201d2b9a-b88e-4432-82cd-240b81da981e.png)


**自动化和扩展**
+ 使用 Systems Manager 自动化运行手册可以安装多个 AWS Backint 代理。
+ 根据目标选择，每次运行 Systems Manager 运行手册都可以扩展到 *n* 个 SAP HANA 实例。
+ EventBridge 可以自动执行 SAP HANA 备份。

## 工具
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge-tools"></a>
+ [适用于 SAP HANA 的 AWS Backint 代理](https://docs.aws.amazon.com/sap/latest/sap-hana/aws-backint-agent-sap-hana.html)是一款独立的应用程序，它与现有工作流程集成，可将 SAP HANA 数据库备份到您在配置文件中指定的 S3 存储桶。AWS Backint 代理支持 SAP HANA 数据库的完整、增量和差异备份。AWS Backint 代理在 SAP HANA 数据库服务器上运行，在该服务器上，备份和目录从 SAP HANA 数据库传输到 AWS Backint 代理中。
+ [Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) 是一项无服务器事件总线服务，可用于将应用程序与来自各种来源的数据连接起来。 EventBridge 将来自您的应用程序、软件即服务 (SaaS) 应用程序和 AWS 服务的实时数据流传输到目标，例如 AWS Lambda 函数、使用 API 目标的 HTTP 调用终端节点或其他账户中的事件总线。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一项对象存储服务。您可以通过 Amazon S3 随时在 Web 上的任何位置存储和检索的任意大小的数据。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 可帮助您查看和控制您在 AWS 上的基础设施。通过使用 Systems Manager 控制台，您可以查看来自多个 Amazon Web Services 的操作数据并在 AWS 资源之间自动执行操作任务。

**代码**

此模式的代码可在[aws-backint-automated-backup](https://github.com/aws-samples/aws-backint-automated-backup) GitHub 存储库中找到。

## 操作说明
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge-epics"></a>

### 创建 hdbuserstore 密钥系统
<a name="create-an-hdbuserstore-key-system"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 hdbuserstore 密钥。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge.html) | AWS 管理员、SAP HANA 管理员 | 

### 安装 AWS Backint 代理
<a name="install-aws-backint-agent"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS Backint 代理。 | 按照 AWS Backint 代理文档中[安装和配置适用于 SAP HANA 的 AWS Backint 代理](https://docs.aws.amazon.com/sap/latest/sap-hana/aws-backint-agent-installing-configuring.html)中的说明进行操作。 | AWS 管理员、SAP HANA 管理员 | 

### 创建 Systems Manager 命令文档
<a name="create-the-systems-manager-command-document"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Systems Manager 命令文档。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge.html) | AWS 管理员、SAP HANA 管理员 | 

### 定期安排备份
<a name="schedule-backups-on-a-regular-frequency"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 Amazon 安排定期备份 EventBridge。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge.html)您可以从 S3 存储桶路径验证备份是否成功。 <pre> s3:/<your_bucket_name>/<target folder>/<SID>/usr/sap/<SID>/SYS/global/hdb/backint/DB_<SID>/</pre>您还可以验证 SAP HANA 备份目录中的备份。 | AWS 管理员、SAP HANA 管理员 | 

## 相关资源
<a name="automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge-resources"></a>
+ [适用于 SAP HANA 的 AWS Backint 代理](https://docs.aws.amazon.com/sap/latest/sap-hana/aws-backint-agent-sap-hana.html)
+ [安装和配置适用于 SAP HANA 的 AWS Backint 代理](https://docs.aws.amazon.com/sap/latest/sap-hana/aws-backint-agent-installing-configuring.html)

# 使用 Python 应用程序为 Amazon DynamoDB 自动生成 PynamoDB 模型和 CRUD 函数
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application"></a>

*Vijit Vashishtha、Dheeraj Alimchandani 和 Dhananjay Karanjkar，Amazon Web Services*

## Summary
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-summary"></a>

通常需要实体以及创建、读取、更新和删除（CRUD）操作函数，以便高效地执行 Amazon DynamoDB 数据库操作。PynamoDB 是一种基于 Python 的接口，支持 Python 3。它还提供了一些其他特性，例如支持 Amazon DynamoDB 事务、自动属性值序列化和反序列化，以及与常见 Python 框架（例如 Flask 和 Django）的兼容性。此模式提供了一个简化 PynamoDB 模型和 CRUD 操作函数的自动创建的库，从而帮助使用 Python 和 DynamoDB 的开发人员。虽然它为数据库表生成基本的 CRUD 函数，但它也可以对 PynamoDB 模型和 Amazon DynamoDB 表中的 CRUD 函数进行逆向工程。此模式旨在通过使用基于 Python 的应用程序来简化数据库操作。

下面是此解决方案的主要功能：
+ **PynamoDB 模型的 JSON 架构** ‒ 通过导入 JSON 架构文件在 Python 中自动生成 PynamoDB 模型。
+ **CRUD 函数生成** ‒ 自动生成函数以在 DynamoDB 表上执行 CRUD 操作。
+ **从 DynamoDB 逆向工程** ‒ 使用 PynamoDB 对象关系映射（ORM）对现有 Amazon DynamoDB 表的 PynamoDB 模型和 CRUD 函数进行逆向工程。

## 先决条件和限制
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ Python 版本 3.8 或更高版本，[已下载](https://www.python.org/downloads/)并已安装
+ Jinja2 版本 3.1.2 或更高版本，[已下载](https://pypi.org/project/Jinja2/#files)并已安装
+ 您要为其生成 ORM 的 Amazon DynamoDB 表
+ AWS Command Line Interface (AWS CLI)，[已安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)
+ PynamoDB 版本 5.4.1 或更高版本，[已安装](https://pynamodb.readthedocs.io/en/stable/tutorial.html#installation)

## 架构
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-architecture"></a>

**目标技术堆栈**
+ JSON 脚本
+ Python 应用程序
+ PynamoDB 模型
+ Amazon DynamoDB 数据库实例

**目标架构**

![\[使用 Python 应用程序从 DynamoDB 表生成 CRUD 函数和 PynamoDB 模型。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/74cc4c73-5c8b-448d-98fb-b681cfa5f860/images/c2c367d6-d88a-4f49-8571-89160539eb08.png)


1. 您创建了一个输入 JSON 架构文件。此 JSON 架构文件提供了相应的 DynamoDB 表的属性，您需要根据这些表创建 PynamoDB 模型并为这些表创建 CRUD 函数。它包含以下三个重要密钥：
   + `name` – 目标 DynamoDB 表的名称。
   + `region`— 桌子的托管 AWS 区域 位置
   + `attributes` ‒ 目标表中包含的属性，例如[分区键](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)（也称为*哈希属性*）、[排序键](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)、[本地二级索引](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html)、[全局二级索引](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html)以及任何[非键属性](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.TablesItemsAttributes)。当应用程序直接从目标表中获取关键属性时，此工具期望输入架构仅提供非键属性。如需关于如何在 JSON 架构文件中指定属性的示例，请参阅此模式的[其他信息](#automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-additional)部分。

1. 运行 Python 应用程序并提供 JSON 架构文件作为输入。

1. Python 应用程序读取 JSON 架构文件。

1. Python 应用程序连接到 DynamoDB 表以派生架构和数据类型。该应用程序运行 [describe\$1table](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb/client/describe_table.html) 操作并获取表的键和索引属性。

1. Python 应用程序结合了 JSON 架构文件和 DynamoDB 表中的属性。它使用 Jinja 模板引擎生成 PynamoDB 模型和相应的 CRUD 函数。

1. 您可访问 PynamoDB 模型以对 DynamoDB 表执行 CRUD 操作。

## 工具
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-tools"></a>

**AWS 服务**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。

**其他工具**
+ [Jinja](https://jinja.palletsprojects.com/en/) 是一个可扩展的模板引擎，可将模板编译成经过优化的 Python 代码。此模式使用 Jinja 通过在模板中嵌入占位符和逻辑来生成动态内容。
+ [PynamoDB](https://pynamodb.readthedocs.io/en/stable/) 是一种基于 Python 的 Amazon DynamoDB 接口。
+ [Python](https://www.python.org/) 是通用的计算机编程语言。

**代码存储库**

此模式的代码可在 GitHub [自动生成 PynamoDB](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb) 模型和 CRUD 函数存储库中找到。该存储库分为两个主要部分：控制器包和模板。

*控制器包*

控制器 Python 包中包含帮助生成 PynamoDB 模型和 CRUD 函数的主要应用程序逻辑。其中包含以下内容：
+ `input_json_validator.py` ‒ 此 Python 脚本验证输入 JSON 架构文件并创建包含目标 DynamoDB 表列表及其各自必需属性的 Python 对象。
+ `dynamo_connection.py` ‒ 此脚本建立与 DynamoDB 表的连接，并使用 `describe_table` 操作提取创建 PynamoDB 模型所需的属性。
+ `generate_model.py` ‒ 此脚本包含一个 Python 类 `GenerateModel`，该类基于输入 JSON 架构文件和 `describe_table` 操作创建 PynamoDB 模型。
+ `generate_crud.py` ‒ 对于 JSON 架构文件中定义的 DynamoDB 表，此脚本使用 `GenerateCrud` 操作创建 Python 类。

*模板*

Python 目录包含以下 Jinja 模板：
+ `model.jinja` ‒ 此 Jinja 模板包含用于生成 Pynamodb 模型脚本的模板表达式。
+ `crud.jinja` ‒ 此 Jinja 模板包含用于生成 CRUD 函数脚本的模板表达式。

## 操作说明
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-epics"></a>

### 设置环境
<a name="set-up-the-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆存储库。 | 输入以下命令克隆[自动生成 PynamoDB 模型和 CRUD 函数](https://github.com/aws-samples/amazon-reverse-engineer-dynamodb)存储库。<pre>git clone https://github.com/aws-samples/amazon-reverse-engineer-dynamodb.git</pre> | 应用程序开发人员 | 
| 设置 Python 环境。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | 应用程序开发人员 | 

### 生成 PynamoDB 模型和 CRUD 函数
<a name="generate-the-pynamodb-model-and-crud-functions"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改 JSON 架构文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | 应用程序开发人员 | 
| 运行 Python 应用程序。 | 输入以下命令生成 Pynamodb 模型和 CRUD 函数，其中 `<input_schema.json>` 是您的 JSON 架构文件的名称。<pre>python main.py --file <input_schema.json></pre> | 应用程序开发人员 | 

### 验证 PynamoDB 模型和 CRUD 函数
<a name="verify-the-pynamodb-model-and-crud-functions"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证生成的 PynamoDB 模型。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | 应用程序开发人员 | 
| 验证生成的 CRUD 函数。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.html) | 应用程序开发人员 | 

## 相关资源
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-resources"></a>
+ [Amazon DynamoDB 的核心组件](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html)（DynamoDB 文档）
+ [使用二级索引改进数据访问](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html)（DynamoDB 文档）

## 附加信息
<a name="automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application-additional"></a>

**JSON 架构文件的示例属性**

```
[
{
"name": "test_table",
"region": "ap-south-1",
"attributes": [
{
"name": "id",
"type": "UnicodeAttribute"
},
{
"name": "name",
"type": "UnicodeAttribute"
},
{
"name": "age",
"type": "NumberAttribute"
}
]
}
]
```

# 通过使用 Cloud Custodian 来阻止对 Amazon RDS 的公有访问
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian"></a>

*abhay kumar 和 Dwarika Patra，Amazon Web Services*

## Summary
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-summary"></a>

许多组织在多个云供应商上运行其工作负载和服务。在这些混合云环境中，除了各个云提供商提供的安全性外，云基础设施还需要严格的云治理。Amazon Relational Database Service (Amazon RDS) 等云数据库是一项重要的服务，必须对其进行监控以防存在任何访问和权限漏洞。尽管您可通过配置安全组来限制对 Amazon RDS 数据库的访问，但您可添加第二层保护来禁止诸如公有访问之类的操作。阻止公有访问有助于您遵守通用数据保护条例（GDPR）、健康保险流通与责任法案（HIPAA）、美国国家标准与技术研究所（NIST）和支付卡行业数据安全标准（PCI DSS）。

Cloud Custodian 是开源规则引擎，您可以使用它来强制执行对 Amazon Web Services（AWS）资源（例如 Amazon RDS）的访问限制。借助 Cloud Custodian，您可设置规则，根据定义的安全和合规标准对环境进行验证。您可使用 Cloud Custodian 来管理您的云环境，帮助确保遵守安全政策、标签政策、未使用资源的垃圾回收和成本管理。借助 Cloud Custodian，您可使用单一界面在混合云环境中实施治理。例如，你可以使用云托管人界面与 AWS Microsoft Azure 进行交互，从而减少使用 AWS 安全组和 Azure 策略等 AWS Config机制的工作量。

此模式提供了如何使用云托管 AWS 来强制限制对 Amazon RDS 实例的公开访问权限。

## 先决条件和限制
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ [密钥对](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds-create)
+ AWS Lambda 已安装

## 架构
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-architecture"></a>

下图显示了云托管人将策略部署到并 AWS CloudTrail 启动`CreateDBInstance`事件 AWS Lambda，以及在 Amazon RDS 上将 Lambda 函数`PubliclyAccessible`设置为 false。

![\[使用 Cloud Custodian on AWS 来限制对 Amazon RDS 实例的公有访问。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/90f9537e-9365-4da2-8a28-da0ff374743c/images/6d04ca3b-6aa4-4c62-ade9-8b7474928c5e.png)


## 工具
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-tools"></a>

**AWS 服务**
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)帮助您审计您的治理、合规和运营风险 AWS 账户。
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一个开源工具，可帮助您 AWS 服务 通过命令行外壳中的命令进行交互。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon Relational Database Service（Amazon RDS）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)可帮助您在 AWS 云中设置、操作和扩展关系数据库。

**其他工具**
+ [Cloud Custodian](https://cloudcustodian.io/) 将大多数组织用于管理其公共云账户的多种工具和脚本统一到一个开源工具中。它使用无状态规则引擎来定义和实施策略，为云基础设施提供指标、结构化输出和详细报告。它与无服务器运行时系统紧密集成，以低运营开销提供实时修复和响应。

## 操作说明
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-epics"></a>

### 设置 AWS CLI
<a name="set-up-the-cli"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS CLI。 | 要安装 AWS CLI，请按照[AWS 文档](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)中的说明进行操作。 | AWS 管理员 | 
| 设置 AWS 凭据。 | 配置 AWS CLI 用于与之交互的设置 AWS，包括 AWS 区域 和您要使用的输出格式。<pre>$>aws configure<br />AWS Access Key ID [None]: <your_access_key_id><br />AWS Secret Access Key [None]: <your_secret_access_key><br />Default region name [None]:<br />Default output format [None]:</pre>有关详情，请参阅 [AWS 文档](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。 | AWS 管理员 | 
| 创建 IAM 角色。 | 要创建具有 Lambda 执行角色的 IAM 角色，请运行以下命令。<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17",		 	 	 "Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}</pre> | AWS DevOps | 

### 设置 Cloud Custodian
<a name="set-up-cloud-custodian"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 Cloud Custodian。 | 要为您的操作系统和环境安装 Cloud Custodian，请按照 [Cloud Custodian 文档](https://cloudcustodian.io/docs/quickstart/index.html#install-cc)中的说明进行操作。 | DevOps 工程师 | 
| 检查 Cloud Custodian 架构。 | 要查看您可针对其运行策略的 Amazon RDS 资源的完整列表，请使用以下命令。<pre>custodian schema aws.rds</pre> | DevOps 工程师 | 
| 创建Cloud Custodian策略。 | 使用 YAML 扩展名将 *Cloud Custodian 策略文件*下的代码保存在[其他信息](#block-public-access-to-amazon-rds-by-using-cloud-custodian-additional)部分。 | DevOps 工程师 | 
| 定义 Cloud Custodian 操作以更改可公开访问的标志。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/block-public-access-to-amazon-rds-by-using-cloud-custodian.html) | DevOps 工程师 | 
| 执行试运行。 | （可选）要在不对资源运行任何操作的情况下检查策略识别了哪些资源，请使用以下命令。<pre>custodian run -dryrun <policy_name>.yaml -s <output_directory></pre> | DevOps 工程师 | 

### 部署策略
<a name="deploy-the-policy"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 Lambda 部署策略。 | 要创建将运行策略的 Lambda 函数，请使用以下命令。<pre>custodian run -s policy.yaml</pre>然后，该政策将由 AWS CloudTrail `CreateDBInstance`活动启动。因此，`false`对于符合条件的实例， AWS Lambda 会将可公开访问的标志设置为。 | DevOps 工程师 | 

## 相关资源
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-resources"></a>
+ [AWS Lambda 网站](https://aws.amazon.com/lambda/)
+ [Amazon RDS 网站](https://aws.amazon.com/rds/)
+ [Cloud Custodian 文档](https://cloudcustodian.io/docs/quickstart/index.html)

## 附加信息
<a name="block-public-access-to-amazon-rds-by-using-cloud-custodian-additional"></a>

**Cloud Custodian 策略 YAML 文件**

```
policies:
  - name: "block-public-access"
    resource: rds
    description: |
      This Enforcement blocks public access for RDS instances.
    mode:
      type: cloudtrail
      events:
        - event: CreateDBInstance # Create RDS instance cloudtrail event
          source: rds.amazonaws.com
          ids: requestParameters.dBInstanceIdentifier
      role: arn:aws:iam::1234567890:role/Custodian-compliance-role
    filters:
      - type: event
        key: 'detail.requestParameters.publiclyAccessible'
        value: true
    actions:
      - type: set-public-access
        state: false
```

**c7n 资源 rds.py 文件**

```
@actions.register('set-public-access')
 class RDSSetPublicAvailability(BaseAction):
 
     schema = type_schema(
         "set-public-access",
         state={'type': 'boolean'})
     permissions = ('rds:ModifyDBInstance',)
 
     def set_accessibility(self, r):
         client = local_session(self.manager.session_factory).client('rds')
         waiter = client.get_waiter('db_instance_available')
         waiter.wait(DBInstanceIdentifier=r['DBInstanceIdentifier'])
         client.modify_db_instance(
             DBInstanceIdentifier=r['DBInstanceIdentifier'],
             PubliclyAccessible=self.data.get('state', False))
 
 
     def process(self, rds):
         with self.executor_factory(max_workers=2) as w:
             futures = {w.submit(self.set_accessibility, r): r for r in rds}
             for f in as_completed(futures):
                 if f.exception():
                     self.log.error(
                         "Exception setting public access on %s  \n %s",
                         futures[f]['DBInstanceIdentifier'], f.exception())
         return rds
```

**Security Hub CSPM 集成**

Cloud Custodian 可以与 [AWS Security Hub CSPM](https://aws.amazon.com/security-hub/) 集成，以发送安全调查发现并尝试补救措施。有关更多信息，请参阅[宣布与云托管人集成 AWS Security Hub CSPM](https://aws.amazon.com/blogs/opensource/announcing-cloud-custodian-integration-aws-security-hub/)。

# 使用为适用于微软 SQL Server 的亚马逊 RDS 配置 Windows 身份验证 AWS Managed Microsoft AD
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad"></a>

*Ramesh Babu Donti，Amazon Web Services*

## Summary
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-summary"></a>

此模式显示如何使用 AWS Directory Service for Microsoft Active Directory () 为 SQL Server 实例的亚马逊关系数据库服务 (Amazon RDS AWS Managed Microsoft AD) 配置 Windows 身份验证。Windows 身份验证允许用户使用其域凭证而不是数据库特定的用户名和密码连接到 RDS 实例。

您可以在创建新的 RDS SQL Server 数据库时启用 Windows 身份验证，也可以通过将其添加到现有数据库实例来启用 Windows 身份验证。数据库实例与集成 AWS Managed Microsoft AD ，为访问 SQL Server 数据库的域用户提供集中身份验证和授权。

此配置利用现有的 Active Directory 基础设施来增强安全性，并且无需为域用户管理单独的数据库凭证。

## 先决条件和限制
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-prereqs"></a>

**先决条件**
+  AWS 账户 具有适当权限的活跃用户
+ 具有以下特性的虚拟私有云（VPC）：
  + 已配置的互联网网关和路由表
  + 公有子网中的 NAT 网关（如果实例需要访问互联网）
+ AWS Identity and Access Management (IAM) 角色：
  + 具有以下 AWS 托管策略的域角色：
    + `AmazonSSMManagedInstanceCore`启用 AWS Systems Manager
    + `AmazonSSMDirectoryServiceAccess`，可提供将实例加入目录的权限
  + RDS 增强监控角色（如果启用了增强监控）
+ 安全组：
  + 允许使用 Active Directory 通信端口的目录服务安全组
  + 允许 RDP `3389` 和域名通信的亚马逊弹性计算云 (Amazon EC2) 安全组
  + RDS 安全组，允许来自授权来源的 SQL Server 端口 `1433`
+ 网络连接：
  + 正确的 DNS 解析以及子网之间的网络连接

**限制**
+ 有关 RDS AWS 区域 for SQL Server 的支持 AWS Managed Microsoft AD 的信息，请参阅[区域和版本可用性](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_SQLServerWinAuth.html#USER_SQLServerWinAuth.RegionVersionAvailability)。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

## 架构
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-architecture"></a>

**源技术堆栈**
+ 本地活动目录或 AWS Managed Microsoft AD

**目标技术堆栈**
+ Amazon EC2
+ Amazon RDS for Microsoft SQL Server
+ AWS Managed Microsoft AD

**目标架构**

![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/e02f6059-6631-46f6-819c-5961af7ba4ae/images/1aa50e3b-b4f6-4d44-9f9e-6cbb248a159c.png)


该架构包括以下内容：
+ 将 Amazon EC2 实例加入 AWS Managed Microsoft AD 域名的 IAM 角色。
+ 用于数据库管理和测试的亚马逊 EC2 Windows 实例。
+ Amazon VPC，其私有子网用于托管 Amazon RDS 实例和跨可用区的内部资源。
+ 网络访问控制安全组：
  + Amazon RDS 安全组，用于控制来自授权来源的 SQL Server 端口 `1433` 的入站访问。
  + 一个 Amazon EC2 安全组，用于通过端口`3389`和域通信端口管理 RDP 访问。
  + Active Directory 的目录服务安全组，可通过端口 `53`、`88`、`389` 和 `445` 进行通讯。
+ AWS Managed Microsoft AD 为 Windows 资源提供集中式身份验证和授权服务。
+ 私有子网中的 Amazon RDS for SQL Server 数据库实例，并且已启用 Windows 身份验证。

## 工具
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-tools"></a>

**AWS 服务**
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ Amazon Relational Database Service（Amazon RDS）可帮助您在 AWS 云中设置、操作和扩展关系数据库。
+ [AWS Directory Service](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/what_is.html)提供了多种使用微软 Active Directory (AD) 的方法， AWS 服务 例如亚马逊弹性计算云 (亚马逊 EC2)、适用于 SQL Server 的亚马逊关系数据库服务 (Amazon RDS) 和 FSx 适用于 Windows 文件服务器的亚马逊。
+ [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)允许你的目录感知工作负载和 AWS 资源使用中的 Microsoft Active Directory。 AWS 云
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。

**其他服务**
+ [Microsoft SQL Server Management Studio (SSMS)](https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms) 是一款用于管理 SQL Server 的工具，包括访问、配置和管理 SQL Server 组件。

## 最佳实践
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-best-practices"></a>
+ 有关一般最佳实践，请参阅 [Amazon RDS 的最佳实践](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html)。

## 操作说明
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-epics"></a>

### 配置 AWS Managed Microsoft AD
<a name="configure-managed-ad"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置目录类型。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置目录信息。 | 在**目录信息**部分中，输入所需信息，并保留可选值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置 VPC 和子网。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 审视和创建目录。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 

### 创建和配置 Amazon EC2 实例
<a name="create-and-configure-an-ec2-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 Windows 配置 AMI。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置网络设置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置存储。 | 根据需要配置 Amazon EBS 卷。 | 数据库管理员、工程师 DevOps  | 
| 配置高级详细信息并启动实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 

### 使用 Windows 身份验证创建和配置 RDS for SQL Server
<a name="create-and-configure-rds-for-sql-server-with-windows-authentication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建数据库并配置引擎选项。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| Choose a template。 | 选择符合您要求的示例模板。 | 数据库管理员、工程师 DevOps  | 
| 配置数据库设置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置实例。 | 在**实例配置**部分的**数据库实例类**下，选择符合您要求的实例大小。 | 数据库管理员、工程师 DevOps  | 
| 配置存储。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置连接。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置 Windows 身份验证。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置监控。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html)注意：若您想了解不同进程或线程对 CPU 的使用差异，指标非常有用。 CloudWatch 如果启用了错误日志，您也可以将**错误日志**导出到 Amazon。 | 数据库管理员、工程师 DevOps  | 
| 配置其他设置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 查看成本并创建数据库。 | 查看**月度估算费用**部分，然后选择**创建数据库**。 | 数据库管理员、工程师 DevOps  | 

### 配置数据库访问和测试连接
<a name="configure-database-access-and-test-connections"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 连接到 Windows 计算机。 | 连接到您的 Windows 计算机并启动 SQL Server Management Studio。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置 SSMS 连接。 | 使用 Windows 身份验证设置数据库连接。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 配置安全设置。 | 为 SSMS 版本 20 或更高版本设置所需的安全参数。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 
| 创建 Windows 登录。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html)<pre>CREATE LOGIN [<domainName>\<user_name>] FROM WINDOWS;<br />GO</pre> | 数据库管理员、工程师 DevOps  | 
| 测试 Windows 身份验证。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-windows-authentication-for-amazon-rds-using-microsoft-ad.html) | 数据库管理员、工程师 DevOps  | 

## 相关资源
<a name="configure-windows-authentication-for-amazon-rds-using-microsoft-ad-resources"></a>
+ [创建你的 AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started_create_directory.html)
+ [将亚马逊 EC2 Windows 实例加入你的 AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/launching_instance.html)
+ [Amazon RDS 中支持 Kerberos 身份验证的区域和数据库引擎](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.KerberosAuthentication.html)
+ [什么是 SQL Server Management Studio（SSMS）？](https://learn.microsoft.com/en-us/ssms/sql-server-management-studio-ssms)

# 配置对 Amazon DynamoDB 的跨账户访问
<a name="configure-cross-account-access-to-amazon-dynamodb"></a>

*Shashi Dalmia、Imhoertha Ojior 和 Esteban Serna Parra，Amazon Web Services*

## Summary
<a name="configure-cross-account-access-to-amazon-dynamodb-summary"></a>

此模式说明了使用基于资源的策略来配置对 Amazon DynamoDB 的跨账户访问的步骤。对于使用 DynamoDB 的工作负载而言，采用[工作负载隔离策略](https://aws.amazon.com/solutions/guidance/workload-isolation-on-aws/?did=sl_card&trk=sl_card)来最大限度地降低安全威胁并满足合规性要求已日渐盛行。实施工作负载隔离策略通常需要使用 AWS Identity and Access Management 基于身份的 (IAM) 策略跨账户和跨区域访问 DynamoDB 资源。这包括设置 IAM 权限并在两者之间建立信任关系 AWS 账户。

[DynamoDB 基于资源的策略](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html)极大地简化了跨账户工作负载的安全态势。此模式提供了步骤和示例代码，用于演示如何将 AWS Lambda 函数合而为一， AWS 账户 以便将数据写入其他账户的 DynamoDB 数据库表。

## 先决条件和限制
<a name="configure-cross-account-access-to-amazon-dynamodb-prereqs"></a>

**先决条件**
+ 两个活跃 AWS 账户。此模式将这些账户称为*账户 A* 和*账户 B*。
+ AWS Command Line Interface (AWS CLI) [已安装](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)并[配置为](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)访问账户 A，以创建 DynamoDB 表。此模式中的其他步骤提供了有关使用 IAM、DynamoDB 和 Lambda 控制台的说明。如果您打算 AWS CLI 改用，请将其配置为同时访问两个帐户。

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

## 架构
<a name="configure-cross-account-access-to-amazon-dynamodb-architecture"></a>

下图显示了单账户架构。 AWS Lambda、亚马逊 Elastic Compute Cloud（亚马逊 EC2）和 DynamoDB 都在同一个账户中。在这种情况下，Lambda 函数和亚马逊 EC2 实例可以访问 DynamoDB。要授予对 DynamoDB 表的访问权限，您可以在 IAM 中创建基于身份的策略，也可以在 DynamoDB 中创建基于资源的策略。

![\[使用 IAM 权限访问同一账户中的 DynamoDB 表。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/cbb009eb-422d-4833-a1bc-0c571d83c21f.png)


下图显示了多账户架构。如果一个中的资源 AWS 账户 需要访问其他账户中的 DynamoDB 表，则需要在 DynamoDB 中设置基于资源的策略来授予所需的访问权限。例如，在下图中，使用基于资源的策略向账户 B 中的 Lambda 函数授予访问账户 A 中的 DynamoDB 表的权限。

![\[使用基于资源的策略以访问另一账户中的 DynamoDB 表。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/bfc32fe8-5db0-4cac-a30f-b870a1a82875/images/9f9165a8-b767-4427-a2ae-31b5b8c83326.png)


此模式描述了 Lambda 和 DynamoDB 之间的跨账户访问。 AWS 服务 如果两个账户都配置了相应的权限，则可以对其他账户使用类似的步骤。例如，如果您想向 Lambda 函数提供对账户 A 中 Amazon Simple Storage Service（Amazon S3）存储桶的访问权限，则可以在 Amazon S3 中创建[基于资源的策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)，并将权限添加到账户 B 中的 [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html) 执行角色。

## 工具
<a name="configure-cross-account-access-to-amazon-dynamodb-tools"></a>

**AWS 服务**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用您的 AWS 资源，从而帮助您安全地管理对这些资源的访问。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。

**代码**

此模式包含[其他信息](#configure-cross-account-access-to-amazon-dynamodb-additional)部分中的示例代码，展示了如何在账户 B 中配置 Lambda 函数以写入账户 A 中的 DynamoDB 表。提供的代码仅供说明和测试之用。如果您在生产环境中实现此模式，请使用代码作为参考并针对您自己的环境进行自定义。

## 最佳实践
<a name="configure-cross-account-access-to-amazon-dynamodb-best-practices"></a>
+ 遵循 DynamoDB 文档中[基于资源的策略的最佳实践](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-best-practices.html)。
+ 遵循最低权限原则，并授予执行任务所需的最低权限。有关详情，请参阅 IAM 文档中的[授予最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 操作说明
<a name="configure-cross-account-access-to-amazon-dynamodb-epics"></a>

### 在账户 B 中为 Lambda 函数创建 IAM 策略和角色
<a name="create-an-iam-policy-and-role-for-the-lam-function-in-account-b"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在账户 B 中创建策略。 | 此 IAM 策略允许对账户 A 中的 DynamoDB 表[PutItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html)执行操作。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | 常规 AWS | 
| 在账户 B 中创建角色。 | 账户 B 中的 Lambda 函数使用此 IAM 角色访问账户 A 中的 DynamoDB 表。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)有关创建角色的更多信息，请参阅 [IAM 文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。 | 常规 AWS | 
| 记下 角色 ARN。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | 常规 AWS | 

### 在账户 A 中创建 DynamoDB 表
<a name="create-a-ddb-table-in-account-a"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 DynamoDB 表。 | 使用以下 AWS CLI 命令创建 DynamoDB 表。<pre> aws dynamodb create-table \<br />    --table-name Table-Account-A \<br />    --attribute-definitions \<br />      AttributeName=category,AttributeType=S \<br />      AttributeName=item,AttributeType=S \<br />    --key-schema \<br />      AttributeName=category,KeyType=HASH \<br />      AttributeName=item,KeyType=RANGE \<br />    --provisioned-throughput \<br />      ReadCapacityUnits=5,WriteCapacityUnits=5 \<br />    --resource-policy \<br />      '{         <br />          "Version": "2012-10-17",		 	 	 <br />          "Statement": [<br />            {                    <br />               "Sid": "Statement1",<br />               "Effect": "Allow",<br />               "Principal": {<br />                  "AWS": "arn:aws:iam::<Account-B-ID>:role/<Role-Name>"<br />               },<br />               "Action": "dynamodb:PutItem",<br />               "Resource": "arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A"<br />            }            <br />         ]<br />      }'</pre>在此代码命令示例中，替换以下内容：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)您可以使用 `--resource-policy` 标志在 `create-table` 语句中指定基于资源的策略配置。此策略引用账户 A 中 DynamoDB 表的 ARN有关创建表的更多信息，请参阅 [DynamoDB 文档](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)。 | 常规 AWS | 

### 在账户 B 中，创建 Lambda 函数
<a name="create-a-lam-function-in-account-b"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个 Lambda 函数，以向 DynamoDB 写入数据。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html)有关创建 Lambda 函数的更多信息，请参阅 [Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)。 | 常规 AWS | 

### 清理
<a name="clean-up"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除资源。 | 要避免产生与在此模式中创建的资源相关的成本，请执行以下操作，删除这些资源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-cross-account-access-to-amazon-dynamodb.html) | 常规 AWS | 

## 问题排查
<a name="configure-cross-account-access-to-amazon-dynamodb-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 在创建 Lambda 函数时，您会收到 `ResourceNotFoundException` 错误。 | 确认您已正确输入账户 A 的 AWS 区域 和 ID。这些是 DynamoDB 表的 ARN 的一部分。 | 

## 相关资源
<a name="configure-cross-account-access-to-amazon-dynamodb-resources"></a>
+ [DynamoDB 入门](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)（DynamoDB 文档）
+ [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)（Lambda 文档）
+ [使用 DynamoDB 的基于资源的策略](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html)（Dynam oDB 文档）
+ [创建 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)（IAM 文档）
+ [跨账户策略评估逻辑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html)（IAM 文档）
+ [IAM JSON 策略元素参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html)（IAM 文档）

## 附加信息
<a name="configure-cross-account-access-to-amazon-dynamodb-additional"></a>

*示例代码*

```
import boto3
from datetime import datetime

dynamodb_client = boto3.client('dynamodb')

def lambda_handler(event, context):
     now = datetime.now().isoformat()
     data = dynamodb_client.put_item(TableName='arn:aws:dynamodb:<Region>:<Account-A-ID>:table/Table-Account-A', Item={"category": {"S": "Fruit"},"item": {"S": "Apple"},"time": {"S": now}})
     return data
```

**注意**  
对 DynamoDB 客户端执行实例化时，将提供 DynamoDB 表的 ARN，而不是表名。这是必备项，这样 Lambda 函数才能在运行时连接到正确的 DynamoDB 表。

# 在 AWS 上的 SQL Server 的“始终打开”可用性组中配置只读路由
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws"></a>

*Subhani Shaik，Amazon Web Services*

## Summary
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-summary"></a>

此模式介绍如何在 SQL Server“始终打开”中使用备用辅助副本，方法是将只读工作负载从主副本卸载到辅助副本。

数据库镜像具有 one-to-one映射。您无法直接读取辅助数据库，因此必须创建快照。“始终打开”可用性组功能是在 Microsoft SQL Server 2012 中引入的。在后来的版本中，引入了主要功能，包括只读路由。在“始终打开”可用性组中，您可以通过将副本模式更改为只读来直接从辅助副本读取数据。

“始终打开”可用性组解决方案支持高可用性（HA）、灾难恢复（DR）和数据库镜像的替代方案。“始终打开”可用性组在数据库级别工作，可最大限度地提高一组用户数据库的可用性。

SQL Server 使用只读路由机制将传入的只读连接重定向到辅助只读副本。为此，应在连接字符串中添加以下参数和值：
+ `ApplicationIntent=ReadOnly`
+ `Initial Catalog=<database name>`

## 先决条件和限制
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account，拥有一个虚拟私有云（VPC）、两个可用区、私有子网和一个安全组
+ 两台亚马逊弹性计算云 (Amazon EC2) 计算机在实例级别配置了 [SQL Server 2019 企业版亚马逊计算机映像](https://aws.amazon.com/marketplace/pp/prodview-btjcozd246p6w)和 [Windows 服务器故障转移群集 (WSFC)](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-sql-server/ec2-fci.html)，主节点 () 和辅助节点 (`WSFCNODE1`) 之间在 SQL Server 级别配置了 Always On 可用性组，它们属于名为 Microsoft 的 AWS Directory Active Directory 目录目录 `WSFCNODE2` `tagechtalk.com`
+ 配置的一个或多个节点，用于在辅助副本中接受 `read-only`
+ 名为 `SQLAG1` 的侦听器，适用于“始终打开”可用性组
+ SQL Server 数据库引擎，在两个节点上使用相同的服务账户运行
+ 打开 SQL Server Management Studio (SSMS)
+ 名为 `test` 的测试数据库

**产品版本**
+ SQL Server 2014 及更高版本

## 架构
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-architecture"></a>

**目标技术堆栈**
+ Amazon EC2
+ AWS 托管的 Microsoft AD
+ Amazon FSx

**目标架构**

下图显示了“始终打开”可用性组（AG）侦听器如何将连接中包含该 `ApplicationIntent` 参数的查询重定向到相应的辅助节点。

![\[在两个可用区（节点 1 WSFC 和节点 2 WSFC）之间使用 Amazon EFS 的三步流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/19b5937b-da10-4c74-8619-fdcb758f2211/images/f9ba0f89-7dc2-4f4c-8eee-bef56968ad2d.png)


1. 将向“始终打开”可用性组侦听器发送请求。

1. 如果连接字符串没有 `ApplicationIntent` 参数，该请求会发送到主实例。

1. 如果连接字符串包含 `ApplicationIntent=ReadOnly`，则请求将发送到具有只读路由配置的辅助实例，即具有“始终打开”可用性组的 WSFC。

## 工具
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-tools"></a>

**Amazon Web Services**
+ [适用于 Microsoft Active Directory 的 AWS Directory Service](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html) 允许目录感知工作负载和 AWS 资源使用 Amazon Web Services Cloud 中的 Microsoft Active Directory。
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/ec2/) 在 AWS 云中提供可扩展的计算容量。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [Amazon FSx](https://docs.aws.amazon.com/fsx/?id=docs_gateway) 提供的文件系统支持行业标准的连接协议，并可在 AWS 区域之间实现高可用性和复制。

**其他服务**
+ SQL Server Management Studio（SSMS）是用于连接、管理和控制 SQL Server 实例的工具。
+ sqlcmd 是一个命令行实用程序。

## 最佳实践
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-best-practices"></a>

有关“始终打开”可用性组的更多信息，请参阅 [SQL Server 文档](https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/always-on-availability-groups-sql-server?view=sql-server-ver16)。

## 操作说明
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-epics"></a>

### 设置只读路由
<a name="set-up-read-only-routing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将副本更新为只读的。 | 要将主副本和辅助副本更新为只读，请从 SSMS 连接到主副本，然后运行*其他信息*部分中的*步骤 1* 代码。 | 数据库管理员 | 
| 创建路由 URL。 | 要为两个副本创建路由 URL，请运行*其他信息*部分中的*步骤 2* 代码。此代码中，`tagechtalk.com` 是 AWS 托管的 Microsoft AD 目录的名称。 | 数据库管理员 | 
| 创建路由列表。 | 要为两个副本创建路由列表，请运行*其他信息*部分中的步骤 3 代码。 | 数据库管理员 | 
| 验证路由列表。 | 从 SQL Server Management Studio 连接到主实例，然后运行*其他信息*部分中的*步骤 4* 代码来验证路由列表。 | 数据库管理员 | 

### 测试只读路由
<a name="test-the-read-only-routing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 ApplicationIntent 参数连接。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws.html) | 数据库管理员 | 
| 执行失效转移。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws.html) | 数据库管理员 | 

### 使用 sqlcmd 命令行实用程序进行连接
<a name="connect-by-using-the-sqlcmd-command-line-utility"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 sqlcmd 进行连接。 | 要从 sqlcmd 进行连接，请在命令提示符下运行*其他信息*部分中的*步骤 5* 代码。在连接后，请运行以下命令，显示连接的服务器名称。<pre>SELECT SERVERPROPERTY('ComputernamePhysicalNetBios') .</pre>输出将显示当前的辅助副本名称 (`WSFCNODE1`)。 | 数据库管理员 | 

## 问题排查
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 创建侦听器失败，并显示消息“WSFC 集群无法使网络名称资源联机”。 | 有关信息，请参阅 Microsoft 博客文章[创建侦听器失败，并显示消息“WSFC 集群无法使网络名称资源联机”](https://techcommunity.microsoft.com/t5/sql-server-support-blog/create-listener-fails-with-message-the-wsfc-cluster-could-not/ba-p/318235)。 | 
| 潜在问题，包括其他侦听器问题或网络访问问题。 | 请参阅 Microsoft 文档中的[对“始终打开”可用性组配置（SQL Server）进行故障排除](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/troubleshoot-always-on-availability-groups-configuration-sql-server?view=sql-server-ver16)。 | 

## 相关资源
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-resources"></a>
+ [在“始终打开”可用性组中配置只读路由](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/configure-read-only-routing-for-an-availability-group-sql-server?view=sql-server-ver16)
+ [对“始终打开”可用性组配置（SQL Server）进行故障排除](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/troubleshoot-always-on-availability-groups-configuration-sql-server?view=sql-server-ver16)

## 附加信息
<a name="configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws-additional"></a>

**步骤 1：将副本更新为只读的**

```
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE1' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY))
GO
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE2' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY))
GO
```

**步骤 2：创建路由 URL**

```
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE1' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WSFCNode1.tagechtalk.com:1433'))
GO
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WSFCNode2.tagechtalk.com:1433'))
GO
```

**第 3 步：创建路由列表**

```
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE1' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=('WSFCNODE2','WSFCNODE1')));
GO
ALTER AVAILABILITY GROUP [SQLAG1] MODIFY REPLICA ON N'WSFCNODE2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('WSFCNODE1','WSFCNODE2')));
GO
```

**步骤 4：验证路由列表**

```
SELECT AGSrc.replica_server_name AS PrimaryReplica, AGRepl.replica_server_name AS ReadOnlyReplica, AGRepl.read_only_routing_url AS RoutingURL , AGRL.routing_priority AS RoutingPriority FROM sys.availability_read_only_routing_lists AGRL INNER JOIN sys.availability_replicas AGSrc ON AGRL.replica_id = AGSrc.replica_id INNER JOIN sys.availability_replicas AGRepl ON AGRL.read_only_replica_id = AGRepl.replica_id INNER JOIN sys.availability_groups AV ON AV.group_id = AGSrc.group_id ORDER BY PrimaryReplica
```

**第 5 步。SQL 命令实用程序**

```
sqlcmd -S SQLAG1,1433 -E -d test -K ReadOnly
```

# 在 pgAdmin 中使用 SSH 隧道进行连接
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin"></a>

*Jeevan Shetty 和 Bhanu Ganesh Gudivada，Amazon Web Services*

## Summary
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin-summary"></a>

出于安全考虑，最好将数据库放在私有子网中。通过亚马逊云网络服务 (AWS) 云上公有子网中的亚马逊弹性计算云 (Amazon EC2) 堡垒主机进行连接，即可对数据库进行查询。这需要在 Amazon 主机上安装开发人员 DBeaver或数据库管理员常用的软件，例如 pgadmin 或。 EC2 

在 Linux 服务器上运行 pgAdmin 并通过网络浏览器访问它，需要安装其他依赖项、权限设置和配置。

作为替代解决方案，开发人员或数据库管理员可以使用 pgAdmin 从其本地系统启用 SSH 隧道，从而连接到 PostgreSQL 数据库。在这种方法中，pgadmin 在连接到数据库之前使用公有子网中的 EC2 Amazon 主机作为中间主机。*架构*部分的图表显示了设置情况。

**注意**  
确保连接到 PostgreSQL 数据库的安全组允许通过端口 5432 从亚马逊主机进行连接。 EC2 

## 先决条件和限制
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin-prereqs"></a>

**先决条件**
+ 现有 Amazon Web Services account 
+ 具有公有子网和私有子网的虚拟私有云（VPC）
+ 附加了安全组的 EC2 实例
+ 附加了安全组的 Amazon Aurora PostgreSQL 兼容版数据库
+ 用于设置隧道的 Secure Shell (SSH) 密钥对

**产品版本**
+ pgAdmin 版本 6.2\$1
+ Amazon Aurora PostgreSQL 兼容版版本 12.7\$1

## 架构
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin-architecture"></a>

**目标技术堆栈**
+ Amazon EC2
+ 兼容 Amazon Aurora PostgreSQL

**目标架构**

下图显示了使用带有 SSH 隧道的 pgadmin 通过互联网网关连接到连接到数据库 EC2 的实例。

![\[带有 SSH 隧道的 pgadmin 通过互联网网关连接到连接到数据库 EC2 的实例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7d25d570-5685-4f1a-bef0-212e257cb589/images/4556d930-f9b3-4b65-be5d-d40dd9437d5a.png)


## 工具
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩缩 PostgreSQL 部署。
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/ec2/) 在 AWS 云中提供可扩展的计算容量。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。

**其他服务**
+ [pgAdmin](https://www.pgadmin.org/) 是一种适用于 PostgreSQL 的开源管理工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。

## 操作说明
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin-epics"></a>

### 创建连接
<a name="create-the-connection"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个服务器。 | 在 pgAdmin 中，选择**创建**，然后选择**服务器**。有关设置 pgAdmin 以注册服务器、配置连接以及使用服务器对话框通过 SSH 隧道进行连接的其他帮助，请参阅*相关资源*部分中的链接。 | 数据库管理员 | 
| 为服务器提供一个名称。 | 在**常规**选项卡上，输入名称。 | 数据库管理员 | 
| 输入数据库详细信息。 | 在**连接**选项卡上，输入以下各项的值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/connect-by-using-an-ssh-tunnel-in-pgadmin.html) | 数据库管理员 | 
| 输入 Amazon EC2 服务器的详细信息。 | 在 **SSH 隧道**选项卡上，提供公有子网中的 Amazon EC2 实例的详细信息。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/connect-by-using-an-ssh-tunnel-in-pgadmin.html) | 数据库管理员 | 
| 保存并连接。 | 选择**保存**以完成设置并使用 SSH 隧道连接到与 Aurora PostgreSQL 兼容的数据库。 | 数据库管理员 | 

## 相关的资源
<a name="connect-by-using-an-ssh-tunnel-in-pgadmin-resources"></a>
+ [服务器对话框](https://www.pgadmin.org/docs/pgadmin4/latest/server_dialog.html)
+ [连接到服务器](https://www.pgadmin.org/docs/pgadmin4/latest/connect_to_server.html)

# 将 JSON Oracle 查询转换至 PostgreSQL 数据库 SQL
<a name="convert-json-oracle-queries-into-postgresql-database-sql"></a>

*Pinesh Singal 和 Lokesh Gurram，Amazon Web Services*

## Summary
<a name="convert-json-oracle-queries-into-postgresql-database-sql-summary"></a>

从本地迁移至 Amazon Web Services (AWS) Cloud 的迁移过程使用 AWS Schema Conversion Tool (AWS SCT) 将代码从 Oracle 数据库转换为 PostgreSQL 数据库。大部分代码价格 AWS SCT 自动转换。但是，与 JSON 相关的 Oracle 查询不自动转换。

从 Oracle 12.2 版开始，Oracle 数据库支持各种 JSON 函数，这些函数有助于将基于 JSON 的数据转换为基于行的数据。但是，AWS SCT 不会自动将基于 JSON 的数据转换至 PostgreSQL 支持的语言。

这种迁移模式主要侧重于手动使用 `JSON_OBJECT`、`JSON_ARRAYAGG` 和 `JSON_TABLE` 等函数将 JSON 相关的 Oracle 查询从 Oracle 数据库转换为 PostgreSQL 数据库。

## 先决条件和限制
<a name="convert-json-oracle-queries-into-postgresql-database-sql-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 本地 Oracle 数据库实例（已启动并正在运行）
+ Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或Amazon Aurora PostgreSQL-Compatible Edition 数据库实例（已启动并运行）

**限制**
+ 与 JSON 相关的查询需要固定的 `KEY` 和 `VALUE` 格式 不使用此格式会返回错误的结果。
+ 如果 JSON 结构的任何更改在结果节中添加了新的 `KEY` 和 `VALUE` 对，则必须在 SQL 查询中更改相应的过程或函数。
+ 早期版本的 Oracle 和 PostgreSQL 支持部分与 JSON 相关的函数，但功能较少。

**产品版本**
+ Oracle 数据库版本 12.2 及更高版本
+ Amazon RDS for PostgreSQL 或 Aurora PostgreSQL-Compatible 版本 9.5 和更高版本
+ AWS SCT 最新版本（使用版本 1.0.664 进行了测试） 

## 架构
<a name="convert-json-oracle-queries-into-postgresql-database-sql-architecture"></a>

**源技术堆栈**
+ 19c 版本的 Oracle 数据库实例

**目标技术堆栈**
+ Amazon RDS for PostgreSQL 或 Aurora PostgreSQL-Compatible 数据库实例，版本 13

**目标架构**

![\[描述如图所示。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/5e2c3b07-9ef5-417f-b049-bcea58f2c3ec/images/2ff8b00b-8849-4ef1-9be1-579f7b51be10.png)


1. 使用带有 JSON 函数代码的 AWS SCT 将源代码从 Oracle 转换至 PostgreSQL。

1. 转换生成 PostgreSQL 支持的已迁移的 .sql 文件。

1. 手动将未转换的 Oracle JSON 函数代码转换至 PostgreSQL JSON 函数代码。

1. 在兼容 Aurora PostgreSQL 的目标数据库实例上运行 .sql 文件。

## 工具
<a name="convert-json-oracle-queries-into-postgresql-database-sql-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [Amazon Relational Database Service（Amazon RDS）for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展PostgreSQL 关系数据库。
+ [AWS Schema Conversion Tool（AWS SCT）](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)通过自动将源数据库架构和大部分自定义代码转换为与目标数据库兼容的格式来支持异构数据库迁移。

**其他服务**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) 是一个集成的开发环境，可简化传统部署和基于云的部署中 Oracle 数据库的开发和管理。
+ pgadmin 或 DBeaver。 [pgadmin](https://www.pgadmin.org/) 是一款适用于 PostgreSQL 的开源管理工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。 [DBeaver](https://dbeaver.io/)是一个通用的数据库工具。

## 最佳实践
<a name="convert-json-oracle-queries-into-postgresql-database-sql-best-practices"></a>

使用 `JSON_TABLE` 函数时，Oracle 查询的默认类型为 `CAST` 类型。最佳实践是在 PostgreSQL 中也使用 `CAST`，使用双倍大于字符 (`>>`)。

有关更多信息，请参阅*其他信息*部分中的 *Postgres\$1SQL\$1Read\$1JSON*。

## 操作说明
<a name="convert-json-oracle-queries-into-postgresql-database-sql-epics"></a>

### 在 Oracle 和 PostgreSQL 数据库生成 JSON 数据
<a name="generate-the-json-data-in-the-oracle-and-postgresql-databases"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 JSON 数据存储至 Oracle 数据库中。 | 在 Oracle 数据库中创建表，并在 `CLOB` 列中存储 JSON 数据。 使用*其他信息*部分的 *Oracle\$1Table\$1Creation\$1Insert\$1Script*。 | 迁移工程师 | 
| 将 JSON 数据存储至 PostgreSQL 数据库中。 | 在 PostgreSQL 数据库中创建一个表，并在`TEXT`列中存储 JSON 数据。使用*其他信息*部分的 *Postgres\$1Table\$1Creation\$1Insert\$1Script*。 | 迁移工程师 | 

### 将 JSON 转换为 ROW 格式
<a name="convert-the-json-into-row-format"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 转换 Oracle 数据库的 JSON 数据。 | 编写 Oracle SQL 查询，将 JSON 数据读取至 ROW 格式。有关更多详细信息和示例语法，请参阅*其他信息*部分中的 *Oracle\$1SQL\$1Read\$1JSON*。 | 迁移工程师 | 
| 转换 PostgreSQL 数据库中的 JSON 数据。 | 编写 PostgreSQL 查询，将 JSON 数据读取至 ROW 格式。有关更多详细信息和示例语法，请参阅*其他信息*部分中的*Postgres\$1SQL\$1Read\$1JSON*。 | 迁移工程师 | 

### 使用 SQL 查询手动转换 JSON 数据，并以 JSON 格式报告输出
<a name="manually-convert-the-json-data-using-the-sql-query-and-report-the-output-in-json-format"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 对 Oracle SQL 查询执行聚合与验证。 | 若要手动转换 JSON 数据，请对 Oracle SQL 查询执行联接、聚合和验证，并以 JSON 格式报告输出。使用*其他信息*部分的 *Oracle\$1SQL\$1JSON\$1Aggregation\$1Join* 中的代码。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/convert-json-oracle-queries-into-postgresql-database-sql.html) | 迁移工程师 | 
| 对 Postgres SQL 查询执行聚合与验证。 | 若要手动转换 JSON 数据，请对 Postgres SQL 查询执行联接、聚合和验证，并以 JSON 格式报告输出。使用*其他信息*部分的 *Postgres\$1SQL\$1JSON\$1Aggregation\$1Join* 中的代码。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/convert-json-oracle-queries-into-postgresql-database-sql.html) | 迁移工程师 | 

### 将 Oracle 程序转换为包含 JSON 查询的 PostgreSQL 函数
<a name="convert-the-oracle-procedure-into-a-postgresql-function-that-contains-json-queries"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 Oracle 程序中的 JSON 查询转换为行。 | 对于 Oracle 程序示例，使用*其他信息*部分的 *Oracle\$1procedure\$1with\$1JSON\$1Query* 中的 Oracle 查询和代码。 | 迁移工程师 | 
| 将具有 JSON 查询的 PostgreSQL 函数转换至基于行的数据。 | 对于 PostgreSQL 函数示例，使用之前的 PostgreSQL 查询以及*其他信息*部分的 *Postgres\$1function\$1with\$1JSON\$1Query* 中的代码。 | 迁移工程师 | 

## 相关资源
<a name="convert-json-oracle-queries-into-postgresql-database-sql-resources"></a>
+ [Oracle JSON 函数](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/adjsn/generation.html)
+ [PostgreSQL JSON 函数](https://www.postgresql.org/docs/13/functions-json.html)
+ [甲骨文 JSON 函数示例](https://oracle-base.com/articles/12c/sql-json-functions-12cr2)
+ [PostgreSQL JSON 函数示例](https://dba.stackexchange.com/questions/69655/select-columns-inside-json-agg)
+ [AWS Schema Conversion Tool‭](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)

## 附加信息
<a name="convert-json-oracle-queries-into-postgresql-database-sql-additional"></a>

要将 JSON 代码从 Oracle 数据库转换至 PostgreSQL 数据库，请按顺序使用以下脚本。

**1。Oracle\$1Table\$1Creation\$1Insert\$1Script**

```
create table aws_test_table(id number,created_on date default sysdate,modified_on date,json_doc clob);

REM INSERTING into EXPORT_TABLE
SET DEFINE OFF;
Insert into aws_test_table (ID,CREATED_ON,MODIFIED_ON,json_doc)
values (1,to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),TO_CLOB(q'[{
  "metadata" : {
    "upperLastNameFirstName" : "ABC XYZ",
    "upperEmailAddress" : "abc@gmail.com",
    "profileType" : "P"
  },
  "data" : {
    "onlineContactId" : "032323323",
    "displayName" : "Abc, Xyz",
    "firstName" : "Xyz",
    "lastName" : "Abc",
    "emailAddress" : "abc@gmail.com",
    "productRegistrationStatus" : "Not registered",
    "positionId" : "0100",
    "arrayPattern" : " -'",
    "a]')
|| TO_CLOB(q'[ccount" : {
      "companyId" : "SMGE",
      "businessUnitId" : 7,
      "accountNumber" : 42000,
      "parentAccountNumber" : 32000,
      "firstName" : "john",
      "lastName" : "doe",
      "street1" : "retOdertcaShr ",
      "city" : "new york",
      "postalcode" : "XY ABC",
      "country" : "United States"
    },
    "products" : [
      {
        "appUserGuid" : "i0acc4450000001823fbad478e2eab8a0",
        "id" : "0000000046",
]')
|| TO_CLOB(q'[        "name" : "ProView",
        "domain" : "EREADER",
        "registrationStatus" : false,
        "status" : "11"
      }
    ]
  }
}]'));
Insert into aws_test_table (ID,CREATED_ON,MODIFIED_ON,json_doc) values (2,to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),to_date('02-AUG-2022 12:30:14','DD-MON-YYYY HH24:MI:SS'),TO_CLOB(q'[{
  "metadata" : {
    "upperLastNameFirstName" : "PQR XYZ",
    "upperEmailAddress" : "pqr@gmail.com",
    "profileType" : "P"
  },
  "data" : {
    "onlineContactId" : "54534343",
    "displayName" : "Xyz, pqr",
    "firstName" : "pqr",
    "lastName" : "Xyz",
    "emailAddress" : "pqr@gmail.com",
    "productRegistrationStatus" : "Not registered",
    "positionId" : "0090",
    "arrayPattern" : " -'",
    "account" : {
      "companyId" : "CARS",
      "busin]')
|| TO_CLOB(q'[essUnitId" : 6,
      "accountNumber" : 42001,
      "parentAccountNumber" : 32001,
      "firstName" : "terry",
      "lastName" : "whitlock",
      "street1" : "UO  123",
      "city" : "TOTORON",
      "region" : "NO",
      "postalcode" : "LKM 111",
      "country" : "Canada"
    },
    "products" : [
      {
        "appUserGuid" : "ia744d7790000016899f8cf3f417d6df6",
        "id" : "0000000014",
        "name" : "ProView eLooseleaf",
      ]')
|| TO_CLOB(q'[  "domain" : "EREADER",
        "registrationStatus" : false,
        "status" : "11"
      }
    ]
  }
}]'));

commit;
```

**2。Postgres\$1Table\$1Creation\$1Insert\$1Script**

```
create table aws_test_pg_table(id int,created_on date ,modified_on date,json_doc text);
insert into aws_test_pg_table(id,created_on,modified_on,json_doc)
values(1,now(),now(),'{
  "metadata" : {
    "upperLastNameFirstName" : "ABC XYZ",
    "upperEmailAddress" : "abc@gmail.com",
    "profileType" : "P"
  },
  "data" : {
    "onlineContactId" : "032323323",
    "displayName" : "Abc, Xyz",
    "firstName" : "Xyz",
    "lastName" : "Abc",
    "emailAddress" : "abc@gmail.com",
    "productRegistrationStatus" : "Not registered",
    "positionId" : "0100",
    "arrayPattern" : " -",
    "account" : {
      "companyId" : "SMGE",
      "businessUnitId" : 7,
      "accountNumber" : 42000,
      "parentAccountNumber" : 32000,
      "firstName" : "john",
      "lastName" : "doe",
      "street1" : "retOdertcaShr ",
      "city" : "new york",
      "postalcode" : "XY ABC",
      "country" : "United States"
    },
    "products" : [
      {
        "appUserGuid" : "i0acc4450000001823fbad478e2eab8a0",
        "id" : "0000000046",
        "name" : "ProView",
        "domain" : "EREADER",
        "registrationStatus" : false,
        "status" : "11"
      }
    ]
  }
}');


insert into aws_test_pg_table(id,created_on,modified_on,json_doc)
values(2,now(),now(),'{
  "metadata" : {
    "upperLastNameFirstName" : "PQR XYZ",
    "upperEmailAddress" : "pqr@gmail.com",
    "profileType" : "P"
  },
  "data" : {
    "onlineContactId" : "54534343",
    "displayName" : "Xyz, pqr",
    "firstName" : "pqr",
    "lastName" : "Xyz",
    "emailAddress" : "a*b**@h**.k**",
    "productRegistrationStatus" : "Not registered",
    "positionId" : "0090",
    "arrayPattern" : " -",
    "account" : {
      "companyId" : "CARS",
      "businessUnitId" : 6,
      "accountNumber" : 42001,
      "parentAccountNumber" : 32001,
      "firstName" : "terry",
      "lastName" : "whitlock",
      "street1" : "UO  123",
      "city" : "TOTORON",
      "region" : "NO",
      "postalcode" : "LKM 111",
      "country" : "Canada"
    },
    "products" : [
      {
        "appUserGuid" : "ia744d7790000016899f8cf3f417d6df6",
        "id" : "0000000014",
        "name" : "ProView eLooseleaf",
        "domain" : "EREADER",
        "registrationStatus" : false,
        "status" : "11"
      }
    ]
  }
}');
```

**3。Oracle\$1SQL\$1Read\$1JSON**

以下代码块显示了如何将 Oracle JSON 数据转换为行格式。

*查询和语法示例*

```
SELECT   JSON_OBJECT( 
 'accountCounts' VALUE JSON_ARRAYAGG( 
            JSON_OBJECT( 
                'businessUnitId' VALUE business_unit_id, 
                        'parentAccountNumber' VALUE parent_account_number, 
                        'accountNumber' VALUE account_number, 
                        'totalOnlineContactsCount' VALUE online_contacts_count, 
                        'countByPosition' VALUE 
                    JSON_OBJECT( 
                        'taxProfessionalCount' VALUE tax_count, 
                        'attorneyCount' VALUE attorney_count,
                        'nonAttorneyCount' VALUE non_attorney_count, 
                        'clerkCount' VALUE clerk_count
                               ) ) ) ) FROM 
    (SELECT   tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number, 
            SUM(1) online_contacts_count, 
            SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE 0 END) tax_count, 
            SUM(CASE    WHEN tab_data.position_id = '0100' THEN 1 ELSE 0 END) attorney_count, 
            SUM(CASE    WHEN tab_data.position_id = '0090' THEN 1 ELSE 0 END) non_attorney_count,                                       
            SUM(CASE    WHEN tab_data.position_id = '0050' THEN 1 ELSE 0 END) clerk_count 
        FROM aws_test_table scco,JSON_TABLE ( json_doc, '$' ERROR ON ERROR         COLUMNS ( 
          parent_account_number NUMBER PATH
           '$.data.account.parentAccountNumber',
            account_number NUMBER PATH '$.data.account.accountNumber',
            business_unit_id NUMBER PATH '$.data.account.businessUnitId',
            position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )
            ) AS tab_data 
            INNER JOIN JSON_TABLE ( '{ 
        "accounts": [{ 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }, { 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }] 
      }', '$.accounts[*]' ERROR ON ERROR 
      COLUMNS (
      parent_account_number PATH '$.parentAccountNumber',
      account_number PATH '$.accountNumber',
      business_unit_id PATH '$.businessUnitId')
      ) static_data 
      ON ( static_data.parent_account_number = tab_data.parent_account_number 
           AND static_data.account_number = tab_data.account_number  
           AND static_data.business_unit_id = tab_data.business_unit_id ) 
        GROUP BY 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number );
```

JSON 文档将数据存储为集合。每个集合可以有 `KEY` 和 `VALUE` 对。每个 `VALUE` 都可以有嵌套 `KEY` 和 `VALUE` 对。下表提供了有关从 JSON 文档中读取特定 `VALUE` 的信息。


| 
| 
| 键 | 用于获取值的层次结构或者路径 | 值 | 
| --- |--- |--- |
| `profileType` | `metadata` -> `profileType` | "P" | 
| `positionId` | `data` -> `positionId` | "0100" | 
| `accountNumber` | `data` -> 账户 -> `accountNumber` | 42000 | 

在上表中，`KEY` `profileType` 是 `metadata` `KEY` 中的 `VALUE`。`KEY` `positionId` 是 `data` `KEY` 中的 `VALUE`。`KEY` `accountNumber` 是 `account` `KEY` 中的 `VALUE`，`account` `KEY` 是 `data` `KEY` 中的 `VALUE`。

*JSON 文档示例*

```
{
  "metadata" : {
    "upperLastNameFirstName" : "ABC XYZ",
    "upperEmailAddress" : "abc@gmail.com",
"profileType" : "P"
  },
  "data" : {
    "onlineContactId" : "032323323",
    "displayName" : "Abc, Xyz",
    "firstName" : "Xyz",
    "lastName" : "Abc",
    "emailAddress" : "abc@gmail.com",
    "productRegistrationStatus" : "Not registered",
"positionId" : "0100",
    "arrayPattern" : " -",
    "account" : {
      "companyId" : "SMGE",
      "businessUnitId" : 7,
"accountNumber" : 42000,
      "parentAccountNumber" : 32000,
      "firstName" : "john",
      "lastName" : "doe",
      "street1" : "retOdertcaShr ",
      "city" : "new york",
      "postalcode" : "XY ABC",
      "country" : "United States"
    },
    "products" : [
      {
        "appUserGuid" : "i0acc4450000001823fbad478e2eab8a0",
        "id" : "0000000046",
        "name" : "ProView",
        "domain" : "EREADER",
        "registrationStatus" : false,
        "status" : "11"
      }
    ]
  }
}
```

*用于从 JSON 文档中获取选定字段的 SQL 查询*

```
select parent_account_number,account_number,business_unit_id,position_id from aws_test_table aws,JSON_TABLE ( json_doc, '$' ERROR ON ERROR
COLUMNS (
parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',
account_number NUMBER PATH '$.data.account.accountNumber',
business_unit_id NUMBER PATH '$.data.account.businessUnitId',
position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'
)) as sc
```

在前面的查询中，`JSON_TABLE` 是 Oracle 中的一个内置函数，用于将 JSON 数据转换为行格式。JSON\$1TABLE 函数要求参数使用 JSON 格式。

`COLUMNS` 中的每个项目都有预定义的 `PATH`，并且会以行格式返回与给定 `KEY` 对应的 `VALUE`。

*上一次查询结果*


| 
| 
| PARENT\$1ACCOUNT\$1NUMBER | ACCOUNT\$1NUMBER | BUSINESS\$1UNIT\$1ID | POSITION\$1ID | 
| --- |--- |--- |--- |
| 32000 | 42000 | 7 | 0100 | 
| 32001 | 42001 | 6 | 0090 | 

**4。Postgres\$1SQL\$1Read\$1JSON**

*****查询和语法示例*

```
select *
from ( 
select (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER as parentAccountNumber, 
(json_doc::json->'data'->'account'->>'accountNumber')::INTEGER as accountNumber, 
(json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER as businessUnitId, 
(json_doc::json->'data'->>'positionId')::VARCHAR as positionId 
from aws_test_pg_table) d ;
```

在 Oracle 中，`PATH` 用于标识特定 `KEY` 和 `VALUE`。但是，PostgreSQL 使用 `HIERARCHY` 模型从 JSON 读取 `KEY` 和 `VALUE`。以下示例中使用了 `Oracle_SQL_Read_JSON` 下所述的相同的 JSON 数据。

*不允许使用 CAST 类型 SQL 查询*

(如果您强制输入 `CAST`，则查询会因语法错误而失败。)

```
select *
from ( 
select (json_doc::json->'data'->'account'->'parentAccountNumber') as parentAccountNumber, 
(json_doc::json->'data'->'account'->'accountNumber')as accountNumber, 
(json_doc::json->'data'->'account'->'businessUnitId') as businessUnitId, 
(json_doc::json->'data'->'positionId')as positionId 
from aws_test_pg_table) d ;
```

使用单个大于运算符 (`>`) 将返回为此 `KEY` 定义的 `VALUE`。例如，`KEY`: `positionId` 和 `VALUE`: `"0100"`。

当您使用单个大于号运算符 (`>`) 时，不允许使用类型 `CAST`。

*允许使用 CAST 类型 SQL 查询*

```
select *
from ( 
select (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER as parentAccountNumber, 
(json_doc::json->'data'->'account'->>'accountNumber')::INTEGER as accountNumber, 
(json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER as businessUnitId, 
(json_doc::json->'data'->>'positionId')::varchar as positionId 
from aws_test_pg_table) d ;
```

要使用类型 `CAST`，必须使用双精度大于运算符。如果您使用单个大于运算符，则查询将返回为此定义的 `VALUE`（例如：和 `KEY`: `positionId` 和 `VALUE`: `"0100"`）。使用双精度大于运算符 (`>>`) 将返回为此定义的 `KEY` 实际值（例如 `KEY`:`positionId` 和 `VALUE`:`0100`，不带双引号）。

在前述例子中，`parentAccountNumber` 是类型 `CAST` 到 `INT` ，`accountNumber` 是类型 `CAST` 到 `INT`，`businessUnitId` 是类型 `CAST` 到`INT`，`positionId` 是类型 `CAST` 到 `VARCHAR`。

下表显示的查询结果解释了单个大于运算符 (`>`) 和双大于运算符 (`>>`) 的作用。

在第一个表中，查询使用单个大于运算符 (`>`) 。每列均采用 JSON 类型，无法转换至其他数据类型。


| 
| 
| parentAccountNumber | accountNumber | businessUnitId | positionId | 
| --- |--- |--- |--- |
| 2003565430 | 2003564830 | 7 | "0100" | 
| 2005284042 | 2005284042 | 6 | "0090" | 
| 2000272719 | 2000272719 | 1 | "0100" | 

在第二个表中，查询使用双精度大于运算符 (`>>`) 。每列都支持基于列值的 `CAST` 类型。例如，在此上下文中的 `INTEGER`。


| 
| 
| parentAccountNumber | accountNumber | businessUnitId | positionId | 
| --- |--- |--- |--- |
| 2003565430 | 2003564830 | 7 | 0100 | 
| 2005284042 | 2005284042 | 6 | 0090 | 
| 2000272719 | 2000272719 | 1 | 0100 | 

**5。Oracle\$1SQL\$1JSON\$1Aggregation\$1Join**

*示例查询*

```
SELECT 
    JSON_OBJECT( 
        'accountCounts' VALUE JSON_ARRAYAGG( 
            JSON_OBJECT( 
                'businessUnitId' VALUE business_unit_id, 
                        'parentAccountNumber' VALUE parent_account_number, 
                        'accountNumber' VALUE account_number, 
                        'totalOnlineContactsCount' VALUE online_contacts_count, 
                        'countByPosition' VALUE 
                    JSON_OBJECT( 
                        'taxProfessionalCount' VALUE tax_count, 
                        'attorneyCount' VALUE attorney_count, 
                        'nonAttorneyCount' VALUE non_attorney_count, 
                        'clerkCount' VALUE clerk_count
                               ) ) ) ) 
FROM 
    (SELECT 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number, 
            SUM(1) online_contacts_count, 
            SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE 0 END) tax_count, 
            SUM(CASE    WHEN tab_data.position_id = '0100' THEN 1 ELSE 0 END) attorney_count,                                                       
            SUM(CASE    WHEN tab_data.position_id = '0090' THEN 1 ELSE 0 END) non_attorney_count,                                                   
            SUM(CASE    WHEN tab_data.position_id = '0050' THEN 1 ELSE 0 END) clerk_count                                                           
        FROM aws_test_table scco,JSON_TABLE ( json_doc, '$' ERROR ON ERROR         COLUMNS ( 
          parent_account_number NUMBER PATH
           '$.data.account.parentAccountNumber',
            account_number NUMBER PATH '$.data.account.accountNumber',
            business_unit_id NUMBER PATH '$.data.account.businessUnitId',
            position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )
            ) AS tab_data 
            INNER JOIN JSON_TABLE ( '{ 
        "accounts": [{ 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }, { 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }] 
      }', '$.accounts[*]' ERROR ON ERROR    
      COLUMNS (
      parent_account_number PATH '$.parentAccountNumber',
      account_number PATH '$.accountNumber',
      business_unit_id PATH '$.businessUnitId')
      ) static_data 
      ON ( static_data.parent_account_number = tab_data.parent_account_number 
           AND static_data.account_number = tab_data.account_number                
           AND static_data.business_unit_id = tab_data.business_unit_id ) 
        GROUP BY 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number 
    );
```

为了将行级数据转换至 JSON 格式，Oracle 内置了函数，例如`JSON_OBJECT`、`JSON_ARRAY`、`JSON_OBJECTAGG` 和 `JSON_ARRAYAGG`。
+ `JSON_OBJECT` 接受两个参数：`KEY` 和 `VALUE`。该 `KEY` 参数本质上应该是硬编码的或静态的。该 `VALUE` 参数源自表输出。
+ `JSON_ARRAYAGG` 接受 `JSON_OBJECT` 作为参数。这有助于将一组 `JSON_OBJECT` 元素分组为一个列表。例如，如果 `JSON_OBJECT` 元素有多条记录 (数据集中有多条 `KEY` 和 `VALUE` 对)，`JSON_ARRAYAGG` 会追加数据集并创建一个列表。根据数据结构语言，`LIST` 是一组元素。在此上下文中，`LIST` 是一组 `JSON_OBJECT` 元素。

以下示例显示了一个 `JSON_OBJECT` 元素。

```
{
   "taxProfessionalCount": 0,
   "attorneyCount": 0,
   "nonAttorneyCount": 1,
   "clerkCount": 0
}
```

下一个示例显示两个 `JSON_OBJECT` 元素，用方括号 (`[ ]`) 表示 `LIST`。

```
[ 
    {
        "taxProfessionalCount": 0,
        "attorneyCount": 0,
        "nonAttorneyCount": 1,
        "clerkCount": 0
      }
,
    {
        "taxProfessionalCount": 2,
        "attorneyCount": 1,
        "nonAttorneyCount": 3,
        "clerkCount":4
      }
]
```

*SQL 查询示例*

```
SELECT 
    JSON_OBJECT( 
        'accountCounts' VALUE JSON_ARRAYAGG( 
            JSON_OBJECT( 
                'businessUnitId' VALUE business_unit_id, 
                        'parentAccountNumber' VALUE parent_account_number, 
                        'accountNumber' VALUE account_number, 
                        'totalOnlineContactsCount' VALUE online_contacts_count, 
                        'countByPosition' VALUE 
                    JSON_OBJECT( 
                        'taxProfessionalCount' VALUE tax_count, 
                        'attorneyCount' VALUE attorney_count, 
                        'nonAttorneyCount' VALUE non_attorney_count, 
                        'clerkCount' VALUE clerk_count
                               ) 
                        ) 
                                           ) 
              ) 
FROM 
    (SELECT 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number, 
            SUM(1) online_contacts_count, 
            SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE   0 END 
            )      tax_count, 
            SUM(CASE    WHEN tab_data.position_id = '0100' THEN        1    ELSE        0 END 
            )      attorney_count,                                                       
            SUM(CASE    WHEN tab_data.position_id = '0090' THEN        1    ELSE        0 END 
            )      non_attorney_count,                                                   
            SUM(CASE    WHEN tab_data.position_id = '0050' THEN        1    ELSE        0 END 
            )      clerk_count                                                           
        FROM 
            aws_test_table scco,  JSON_TABLE ( json_doc, '$' ERROR ON ERROR    
            COLUMNS ( 
            parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',
            account_number NUMBER PATH '$.data.account.accountNumber',
            business_unit_id NUMBER PATH '$.data.account.businessUnitId',
            position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )
            ) AS tab_data 
            INNER JOIN JSON_TABLE ( '{ 
        "accounts": [{ 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }, { 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }] 
      }', '$.accounts[*]' ERROR ON ERROR    
      COLUMNS (
      parent_account_number PATH '$.parentAccountNumber',
      account_number PATH '$.accountNumber',
      business_unit_id PATH '$.businessUnitId')
      ) static_data ON ( static_data.parent_account_number = tab_data.parent_account_number 
                         AND static_data.account_number = tab_data.account_number                
                         AND static_data.business_unit_id = tab_data.business_unit_id ) 
        GROUP BY 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number 
    );
```

*上一个 SQL 查询输出示例*

```
{
  "accountCounts": [
    {
      "businessUnitId": 6,
      "parentAccountNumber": 32001,
      "accountNumber": 42001,
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 0,
        "nonAttorneyCount": 1,
        "clerkCount": 0
      }
    },
    {
      "businessUnitId": 7,
      "parentAccountNumber": 32000,
      "accountNumber": 42000,
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 1,
        "nonAttorneyCount": 0,
        "clerkCount": 0
      }
    }
  ]
}
```

**6。 Postgres\$1SQL\$1JSON\$1Aggregation\$1Join**

PostgreSQL 内置函数 `JSON_BUILD_OBJECT` 和 `JSON_AGG` 将行级数据转换为 JSON 格式。 PostgreSQL `JSON_BUILD_OBJECT` 和 `JSON_AGG` 等同于 Oracle `JSON_OBJECT` 和 `JSON_ARRAYAGG`

*示例查询*

```
select    
JSON_BUILD_OBJECT ('accountCounts', 
    JSON_AGG( 
        JSON_BUILD_OBJECT ('businessUnitId',businessUnitId 
        ,'parentAccountNumber',parentAccountNumber 
        ,'accountNumber',accountNumber 
        ,'totalOnlineContactsCount',online_contacts_count, 
        'countByPosition',
            JSON_BUILD_OBJECT (
            'taxProfessionalCount',tax_professional_count 
            ,'attorneyCount',attorney_count 
            ,'nonAttorneyCount',non_attorney_count 
            ,'clerkCount',clerk_count 
            ) 
        )  
    ) 
) 
from ( 
with tab as (select * from ( 
select (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER as parentAccountNumber, 
(json_doc::json->'data'->'account'->>'accountNumber')::INTEGER as accountNumber, 
(json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER as businessUnitId, 
(json_doc::json->'data'->>'positionId')::varchar as positionId 
from aws_test_pg_table) a ) , 
tab1 as ( select   
(json_array_elements(b.jc -> 'accounts') ->> 'accountNumber')::integer accountNumber, 
(json_array_elements(b.jc -> 'accounts') ->> 'businessUnitId')::integer businessUnitId, 
(json_array_elements(b.jc -> 'accounts') ->> 'parentAccountNumber')::integer parentAccountNumber 
from ( 
select '{ 
        "accounts": [{ 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }, { 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }] 
      }'::json as jc) b) 
select  
tab.businessUnitId::text, 
tab.parentAccountNumber::text, 
tab.accountNumber::text, 
SUM(1) online_contacts_count, 
SUM(CASE WHEN tab.positionId::text = '0095' THEN 1 ELSE 0  END)      tax_professional_count,  
SUM(CASE WHEN tab.positionId::text = '0100' THEN 1 ELSE 0  END)      attorney_count, 
SUM(CASE  WHEN tab.positionId::text = '0090' THEN      1  ELSE      0 END)      non_attorney_count, 
SUM(CASE  WHEN tab.positionId::text = '0050' THEN      1  ELSE      0 END)      clerk_count
from tab1,tab  
where tab.parentAccountNumber::INTEGER=tab1.parentAccountNumber::INTEGER  
and tab.accountNumber::INTEGER=tab1.accountNumber::INTEGER 
and tab.businessUnitId::INTEGER=tab1.businessUnitId::INTEGER 
GROUP BY      tab.businessUnitId::text, 
            tab.parentAccountNumber::text, 
            tab.accountNumber::text) a;
```

*前述查询的输出示例*

Oracle 和 PostgreSQL 输出完全相同。

```
{
  "accountCounts": [
    {
      "businessUnitId": 6,
      "parentAccountNumber": 32001,
      "accountNumber": 42001,
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 0,
        "nonAttorneyCount": 1,
        "clerkCount": 0
      }
    },
    {
      "businessUnitId": 7,
      "parentAccountNumber": 32000,
      "accountNumber": 42000,
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 1,
        "nonAttorneyCount": 0,
        "clerkCount": 0
      }
    }
  ]
}
```

**7.Oracle\$1procedure\$1with\$1JSON\$1Query**

此代码将 Oracle 程序转换为具有 JSON SQL 查询的 PostgreSQL 函数。它显示了查询如何将 JSON 转换至行，反之亦然。

```
CREATE OR REPLACE PROCEDURE p_json_test(p_in_accounts_json IN varchar2,   p_out_accunts_json  OUT varchar2)
IS
BEGIN
/*
p_in_accounts_json paramter should have following format:
       { 
        "accounts": [{ 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }, { 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }] 
      }
*/
SELECT 
    JSON_OBJECT( 
        'accountCounts' VALUE JSON_ARRAYAGG( 
            JSON_OBJECT( 
                'businessUnitId' VALUE business_unit_id, 
                        'parentAccountNumber' VALUE parent_account_number, 
                        'accountNumber' VALUE account_number, 
                        'totalOnlineContactsCount' VALUE online_contacts_count, 
                        'countByPosition' VALUE 
                    JSON_OBJECT( 
                        'taxProfessionalCount' VALUE tax_count, 
                        'attorneyCount' VALUE attorney_count, 
                        'nonAttorneyCount' VALUE non_attorney_count, 
                        'clerkCount' VALUE clerk_count
                               ) ) ) ) 
into p_out_accunts_json
FROM 
    (SELECT 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number, 
            SUM(1) online_contacts_count, 
            SUM(CASE WHEN tab_data.position_id = '0095' THEN  1 ELSE 0 END) tax_count, 
            SUM(CASE    WHEN tab_data.position_id = '0100' THEN 1 ELSE 0 END) attorney_count,                                                       
            SUM(CASE    WHEN tab_data.position_id = '0090' THEN 1 ELSE 0 END) non_attorney_count,                                                   
            SUM(CASE    WHEN tab_data.position_id = '0050' THEN 1 ELSE 0 END) clerk_count                                                           
        FROM aws_test_table scco,JSON_TABLE ( json_doc, '$' ERROR ON ERROR    
            COLUMNS ( 
            parent_account_number NUMBER PATH '$.data.account.parentAccountNumber',
            account_number NUMBER PATH '$.data.account.accountNumber',
            business_unit_id NUMBER PATH '$.data.account.businessUnitId',
            position_id VARCHAR2 ( 4 ) PATH '$.data.positionId'    )
            ) AS tab_data 
            INNER JOIN JSON_TABLE ( p_in_accounts_json, '$.accounts[*]' ERROR ON ERROR    
      COLUMNS (
      parent_account_number PATH '$.parentAccountNumber',
      account_number PATH '$.accountNumber',
      business_unit_id PATH '$.businessUnitId')
      ) static_data 
      ON ( static_data.parent_account_number = tab_data.parent_account_number 
           AND static_data.account_number = tab_data.account_number                
           AND static_data.business_unit_id = tab_data.business_unit_id ) 
        GROUP BY 
            tab_data.business_unit_id, 
            tab_data.parent_account_number, 
            tab_data.account_number 
    ); 
EXCEPTION 
WHEN OTHERS THEN
   raise_application_error(-20001,'Error while running the JSON query');
END;
/
```

*运行程序*

以下代码块介绍了如何运行前面创建的 Oracle 程序，并将示例 JSON 输入用于该程序。它还会为您提供此程序的结果或输出。

```
set serveroutput on;
declare
v_out varchar2(30000);
v_in varchar2(30000):= '{ 
        "accounts": [{ 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }, { 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }] 
      }';
begin
  p_json_test(v_in,v_out);
  dbms_output.put_line(v_out);
end;
/
```

*程序输出*

```
{
  "accountCounts": [
    {
      "businessUnitId": 6,
      "parentAccountNumber": 32001,
      "accountNumber": 42001,
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 0,
        "nonAttorneyCount": 1,
        "clerkCount": 0
      }
    },
    {
      "businessUnitId": 7,
      "parentAccountNumber": 32000,
      "accountNumber": 42000,
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 1,
        "nonAttorneyCount": 0,
        "clerkCount": 0
      }
    }
  ]
}
```

**8.Postgres\$1function\$1with\$1JSON\$1Query**

*示例函数*

```
CREATE OR REPLACE  FUNCTION f_pg_json_test(p_in_accounts_json  text)
RETURNS text  
LANGUAGE plpgsql  
AS  
$$  
DECLARE  
 v_out_accunts_json   text;  
BEGIN  
SELECT    
JSON_BUILD_OBJECT ('accountCounts',
    JSON_AGG(
        JSON_BUILD_OBJECT ('businessUnitId',businessUnitId
        ,'parentAccountNumber',parentAccountNumber
        ,'accountNumber',accountNumber
        ,'totalOnlineContactsCount',online_contacts_count,
        'countByPosition',
            JSON_BUILD_OBJECT (
            'taxProfessionalCount',tax_professional_count
            ,'attorneyCount',attorney_count
            ,'nonAttorneyCount',non_attorney_count
            ,'clerkCount',clerk_count
            ))))
INTO v_out_accunts_json
FROM (
WITH tab AS (SELECT * FROM (
SELECT (json_doc::json->'data'->'account'->>'parentAccountNumber')::INTEGER AS parentAccountNumber,
(json_doc::json->'data'->'account'->>'accountNumber')::INTEGER AS accountNumber,
(json_doc::json->'data'->'account'->>'businessUnitId')::INTEGER AS businessUnitId,
(json_doc::json->'data'->>'positionId')::varchar AS positionId
FROM aws_test_pg_table) a ) ,
tab1 AS ( SELECT  
(json_array_elements(b.jc -> 'accounts') ->> 'accountNumber')::integer accountNumber,
(json_array_elements(b.jc -> 'accounts') ->> 'businessUnitId')::integer businessUnitId,
(json_array_elements(b.jc -> 'accounts') ->> 'parentAccountNumber')::integer parentAccountNumber
FROM (
SELECT p_in_accounts_json::json AS jc) b)
SELECT  
tab.businessUnitId::text,
tab.parentAccountNumber::text,
tab.accountNumber::text,
SUM(1) online_contacts_count,
SUM(CASE WHEN tab.positionId::text = '0095' THEN 1 ELSE 0  END)      tax_professional_count,  
SUM(CASE WHEN tab.positionId::text = '0100' THEN 1 ELSE 0  END)      attorney_count,
SUM(CASE  WHEN tab.positionId::text = '0090' THEN      1  ELSE      0 END)      non_attorney_count,
SUM(CASE  WHEN tab.positionId::text = '0050' THEN      1  ELSE      0 END)      clerk_count
FROM tab1,tab  
WHERE tab.parentAccountNumber::INTEGER=tab1.parentAccountNumber::INTEGER  
AND tab.accountNumber::INTEGER=tab1.accountNumber::INTEGER
AND tab.businessUnitId::INTEGER=tab1.businessUnitId::INTEGER
GROUP BY      tab.businessUnitId::text,
            tab.parentAccountNumber::text,
            tab.accountNumber::text) a;
RETURN v_out_accunts_json;          
END;  
$$;
```

*运行函数*

```
select    f_pg_json_test('{ 
        "accounts": [{ 
          "accountNumber": 42001, 
          "parentAccountNumber": 32001, 
          "businessUnitId": 6 
        }, { 
          "accountNumber": 42000, 
          "parentAccountNumber": 32000, 
          "businessUnitId": 7 
        }] 
      }')   ;
```

*函数输出*

以下输出与 Oracle 程序输出类似。不同之处在于此输出为文本格式。

```
{
  "accountCounts": [
    {
      "businessUnitId": "6",
      "parentAccountNumber": "32001",
      "accountNumber": "42001",
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 0,
        "nonAttorneyCount": 1,
        "clerkCount": 0
      }
    },
    {
      "businessUnitId": "7",
      "parentAccountNumber": "32000",
      "accountNumber": "42000",
      "totalOnlineContactsCount": 1,
      "countByPosition": {
        "taxProfessionalCount": 0,
        "attorneyCount": 1,
        "nonAttorneyCount": 0,
        "clerkCount": 0
      }
    }
  ]
}
```

# 使用跨账户复制 Amazon DynamoDB 表 AWS Backup
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup"></a>

*Ramkumar Ramanujam，Amazon Web Services*

## Summary
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup-summary"></a>

在使用 Amazon DynamoDB AWS时，常见的用例是在开发、测试或暂存环境中将 DynamoDB 表与生产环境中的表数据复制或同步。标准做法是，在每个环境使用不同的 AWS 账户。 

AWS Backup 支持 DynamoDB、亚马逊简单存储服务 (Amazon S3) Service 等的跨区域和跨账户备份和恢复数据。 AWS 服务此模式提供了使用 AWS Backup 跨账户备份和还原在两者之间复制 DynamoDB 表的步骤。 AWS 账户

## 先决条件和限制
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup-prereqs"></a>

**先决条件**
+ 属于同 AWS 账户 一个组织的两个活跃分子 AWS Organizations
+ 在两个账户中创建 DynamoDB 表的权限
+ AWS Identity and Access Management (IAM) 创建和使用文件 AWS Backup 库的权限

**限制**
+ 来源和目标 AWS 账户 应属于同一个组织 AWS Organizations。

## 架构
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup-architecture"></a>

**目标技术堆栈**
+ AWS Backup 
+ Amazon DynamoDB

**目标架构**

![\[在备份库之间复制表描述如下图所示。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/ef6e7393-edb6-4744-be26-43f1cbff9de9/images/fa9f3f2f-7a01-4093-9bd5-fc355e57ba67.png)


1. 在源账户的备份库中 AWS Backup 创建 DynamoDB 表备份。

1. 将备份复制至目标账户的备份库中。

1. 使用目标账户备份库中的备份，还原目标账户中的 DynamoDb 表。

**自动化和扩展**

您可以使用 AWS Backup 将备份安排为按特定时间间隔运行。

## 工具
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup-tools"></a>
+ [AWS Backup](https://docs.aws.amazon.com/aws-backup/latest/devguide/whatisbackup.html)是一项完全托管的服务，用于在云端和内部 AWS 服务集中和自动化数据保护。使用此服务，您可以一站式配置备份策略并监控 AWS 资源活动。它允许您自动执行和整合之前按服务执行的备份任务，并且无需创建自定义脚本和手动流程。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一种全托管 NoSQL 数据库服务，提供快速而可预测的性能，能够实现无缝扩展。

## 操作说明
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup-epics"></a>

### 开启源账户和目标账户中的 AWS Backup 功能
<a name="turn-on-bkp-features-in-the-source-and-target-accounts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启用 DynamoDB 和跨账户备份高级功能。 | 在源和目标系统中 AWS 账户，执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-aws-backup.html) | AWS DevOps，迁移工程师 | 

### 在源和目标账户中创建备份库
<a name="create-backup-vaults-in-the-source-and-target-accounts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建备份库。 | 在源和目标系统中 AWS 账户，执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-aws-backup.html)在 ARNs 源账户和目标账户之间复制 DynamoDB 表备份时，将需要源和目标备份存储库。 | AWS DevOps，迁移工程师 | 

### 使用备份库执行备份和还原
<a name="perform-backup-and-restore-using-backup-vaults"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在源账户中，创建 DynamoDB 表备份。 | 要在源账户中为 DynamoDB 表创建备份，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-aws-backup.html)创建了新的备份作业。 要监视备份作业的状态，请在 “ AWS Backup **作业**” 页面上选择 “**备份作业**” 选项卡。此选项卡上列出了所有活动、正在进行和已完成备份任务。 | AWS DevOps、数据库管理员、迁移工程师 | 
| 将备份从源账户复制到目标账户。 | 备份任务完成后，将 DynamoDB 表备份从源账户的备份库复制到目标账户的备份库。要复制备份库，请在源账户执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-aws-backup.html) | AWS DevOps，迁移工程师，数据库管理员 | 
| 还原目标账户中的备份。 | 在目标中 AWS 账户，执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-aws-backup.html) | AWS DevOps、数据库管理员、迁移工程师 | 

## 相关资源
<a name="copy-amazon-dynamodb-tables-across-accounts-using-aws-backup-resources"></a>
+ [AWS Backup 与 DynamoDB 搭配使用](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/backuprestore_HowItWorksAWS.html)
+ [跨创建备份副本 AWS 账户](https://docs.aws.amazon.com/aws-backup/latest/devguide/create-cross-account-backup.html)
+ [AWS Backup 定价](https://aws.amazon.com/backup/pricing/)

# 使用自定义实施，跨账户复制 Amazon DynamoDB 表
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation"></a>

*Ramkumar Ramanujam，Amazon Web Services*

## Summary
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-summary"></a>

在Amazon Web Services (AWS) 上使用 Amazon DynamoDB 时，常见的用例是将开发、测试或模拟环境中的 DynamoDB 表与生产环境中的表数据进行复制或同步。标准做法是，在每个环境使用不同的 Amazon Web Services account。

DynamoDB 现在支持使用 AWS Backup 执行跨账户备份。有关使用 AWS Backup 时的相关存储成本信息，请参阅 [AWS Backup 定价](https://aws.amazon.com/backup/pricing/)。当您使用 AWS Backup 跨账户复制时，源账户和目标账户必须是 AWS Organizations 组织的组成部分。还有其他使用 AWS 服务的跨账户备份和还原解决方案，如 AWS Glue。但是，使用这些解决方案会增加应用程序占用空间，因为有更多的 Amazon Web Services 需要部署和维护。 

您也可使用 Amazon DynamoDB Streams 来捕获源账户中的表更改。然后，您可启动 AWS Lambda 函数，并在目标账户的目标表中进行相应的更改。但是从解决方案适用于源表和目标表必须始终保持同步的用例。它可能不适用于数据更新频率较高的开发、测试和模拟环境。

此模式提供了实施自定义解决方案，以将 Amazon DynamoDB 表从一个账户复制到另一个账户的步骤。这种模式可使用 C\$1、Java 和 Python 等常见编程语言来实现。我们建议使用 [AWS SDK](https://aws.amazon.com/tools/) 支持的语言。

## 先决条件和限制
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-prereqs"></a>

**先决条件**
+ 两个有效的 Amazon Web Services account 
+ 两个账户中的 DynamoDB 表
+ 了解 AWS Identity and Access Management (IAM) 角色和策略
+ 了解如何使用任何常用编程语言（例如 C\$1、Java 或 Python）访问 Amazon DynamoDB 表

**限制**

这种模式适用于大约 2 GB 或以内的 DynamoDB 表。通过额外的逻辑处理连接或会话中断、节流以及失败和重试，它可以用于更大的表。

从源表读取项目的 DynamoDB 扫描操作，在一次调用中最多只能获取 1 MB 的数据。对于大于 2 GB 的大表，此限制会增加执行完整表复制的总时间。

## 架构
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-architecture"></a>

下图显示了源和目标 AWS 账户之间的自定义实施。IAM 策略和安全令牌可与自定义实施一起使用。从源账户中的 Amazon DynamoDB 读取数据，然后将数据写入目标账户中的 DynamoDB。

![\[使用自定义实施进行复制的源和目标账户架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/ba8175be-9809-4c2e-b2d1-6b9180ed056c/images/d9d4c2c8-ff04-443f-9137-e37b8e23ccb5.png)


 

**自动化和扩展**

这种模式适用于较小（大约 2 GB）的 DynamoDB 表。 

若要将此模式应用于较大的表，请解决以下问题：
+ 在表复制操作期间，使用不同安全令牌维护两个活动会话。如表复制操作花费的时间超过令牌到期时间，则必须设置逻辑来刷新安全令牌。 
+ 如果未配置足够的读取容量单位 (RCUs) 和写入容量单位 (WCUs)，则源表或目标表的读取或写入可能会受到限制。请务必捕捉并处理异常情况。 
+ 处理任何其他失败或异常情况，并建立重试机制，以重试或从复制操作失败的地方继续操作。

## 工具
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-tools"></a>

**工具**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – Amazon DynamoDB 是一种全托管 NoSQL 数据库服务，提供快速而可预测的性能，能够实现无缝扩展。 
+ 所需其他工具将根据您为实现选择的编程语言而异。例如，如果你使用 C\$1，则需要微软 Visual Studio 和以下 NuGet 软件包：
  + `AWSSDK`
  + `AWSSDK.DynamoDBv2`

**代码**

以下 Python 代码段使用 Boto3 库，删除并重新创建 DynamoDB 表。

请勿使用 IAM 用户的 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY`，因为这些都是长期凭证，在编程访问 Amazon Web Services 时应避免使用这些凭证。有关临时凭证的更多信息，请参阅*最佳实践*部分。

以下代码段中使用的 `AWS_ACCESS_KEY_ID` 、`AWS_SECRET_ACCESS_KEY` 和 `TEMPORARY_SESSION_TOKEN`，是从 AWS Security Token Service (AWS STS) 获取的临时凭证。

```
import boto3
import sys
import json

#args = input-parameters = GLOBAL_SEC_INDEXES_JSON_COLLECTION, ATTRIBUTES_JSON_COLLECTION, TARGET_DYNAMODB_NAME, TARGET_REGION, ...

#Input param: GLOBAL_SEC_INDEXES_JSON_COLLECTION
#[{"IndexName":"Test-index","KeySchema":[{"AttributeName":"AppId","KeyType":"HASH"},{"AttributeName":"AppType","KeyType":"RANGE"}],"Projection":{"ProjectionType":"INCLUDE","NonKeyAttributes":["PK","SK","OwnerName","AppVersion"]}}]

#Input param: ATTRIBUTES_JSON_COLLECTION
#[{"AttributeName":"PK","AttributeType":"S"},{"AttributeName":"SK","AttributeType":"S"},{"AttributeName":"AppId","AttributeType":"S"},{"AttributeName":"AppType","AttributeType":"N"}]

region = args['TARGET_REGION']
target_ddb_name = args['TARGET_DYNAMODB_NAME']

global_secondary_indexes = json.loads(args['GLOBAL_SEC_INDEXES_JSON_COLLECTION'])
attribute_definitions = json.loads(args['ATTRIBUTES_JSON_COLLECTION'])

# Drop and create target DynamoDB table
dynamodb_client = boto3.Session(
        aws_access_key_id=args['AWS_ACCESS_KEY_ID'],
        aws_secret_access_key=args['AWS_SECRET_ACCESS_KEY'],
        aws_session_token=args['TEMPORARY_SESSION_TOKEN'],
    ).client('dynamodb')
    
# Delete table
print('Deleting table: ' + target_ddb_name + ' ...')

try:
    dynamodb_client.delete_table(TableName=target_ddb_name)

    #Wait for table deletion to complete
    waiter = dynamodb_client.get_waiter('table_not_exists')
    waiter.wait(TableName=target_ddb_name)
    print('Table deleted.')
except dynamodb_client.exceptions.ResourceNotFoundException:
    print('Table already deleted / does not exist.')
    pass

print('Creating table: ' + target_ddb_name + ' ...')

table = dynamodb_client.create_table(
    TableName=target_ddb_name,
    KeySchema=[
        {
            'AttributeName': 'PK',
            'KeyType': 'HASH'  # Partition key
        },
        {
            'AttributeName': 'SK',
            'KeyType': 'RANGE'  # Sort key
        }
    ],
    AttributeDefinitions=attribute_definitions,
    GlobalSecondaryIndexes=global_secondary_indexes,
    BillingMode='PAY_PER_REQUEST'
)
    
waiter = dynamodb_client.get_waiter('table_exists')
waiter.wait(TableName=target_ddb_name)
    
print('Table created.')
```

## 最佳实践
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-best-practices"></a>

**临时凭证**

作为安全最佳实践，在以编程方式访问 AWS 服务时，请避免使用 IAM 用户 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY`，因为它们是长期凭证。请务必尝试使用临时凭证，以编程方式访问 Amazon Web Services。

例如，开发人员在开发过程中对应用程序中的 IAM 用户的 `AWS_ACCESS_KEY_ID` 和 `AWS_SECRET_ACCESS_KEY` 进行了硬编码，但在将更改推送至代码存储库之前，无法删除硬编码值。这些暴露的凭证可能被意外用户或恶意用户使用，这可能会产生严重影响（尤其是在暴露的凭证具有管理员权限的情况下）。应使用 IAM 控制台或 AWS 命令行界面（AWS CLI）立即停用或删除这些公开的凭证。

要获得以编程方式访问 Amazon Web Services 的临时凭证，请使用 AWS STS。临时凭证仅在指定时间内有效（从 15 分钟到 36 小时不等）。临时凭证允许的最长持续时间因角色设置和角色链接等因素而异。有关 AWS STS 的更多信息，请参阅[文档](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)。

## 操作说明
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-epics"></a>

### 设置 DynamoDB 表
<a name="set-up-dynamodb-tables"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 DynamoDB 表。 | 在源和目标 Amazon Web Services account 中创建带索引的 DynamoDB 表。将容量配置设置为按需模式，这样 DynamoDB 就可以根据工作负载动态 read/write 扩展容量。 或者，您可以将预配置容量与 4000 RCUs 和 4000 配合使用。 WCUs | 应用程序开发人员，数据库管理员，迁移工程师 | 
| 填充源表格。 | 使用测试数据填充源账户的 DynamoDB 表。拥有至少 50 MB 或更多的测试数据有助于您查看表复制期间的峰值和平均 RCUs 消耗量。然后，您可根据需要更改容量配置。 | 应用程序开发人员，数据库管理员，迁移工程师 | 

### 设置用于访问 DynamoDB 表的凭证
<a name="set-up-credentials-to-access-the-dynamodb-tables"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 IAM 角色，以访问源表和目标 DynamoDB 表。 | 在源账户中创建 IAM 角色，该角色有权访问（读取）源账户中的 DynamoDB 表。将源账户添加至该角色的可信实体。在目标账户中创建一个 IAM 角色，该角色有权访问（创建、读取、更新、删除）目标账户中的 DynamoDB 表。 将目标账户添加至该角色的可信实体。 | AWS 应用程序开发人员 DevOps | 

### 将表数据从一个账户复制至另一个账户
<a name="copy-table-data-from-one-account-to-another"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 获取 IAM 角色的临时凭证。 | 获取在源账户中创建的 IAM 角色的临时凭证。获取在目标账户中创建的 IAM 角色的临时凭证。获取 IAM 角色临时凭证的一种方法是在 AWS CLI 中使用 AWS STS。<pre>aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<role-name> --role-session-name <session-name> --profile <profile-name></pre>使用相应的 AWS 配置文件（对应于源账户或目标账户）。有关获取临时凭证的不同方式的详细信息，请参阅以下内容：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html) | 应用程序开发人员、迁移工程师 | 
| 初始化 DynamoDB 客户端，以便访问源与目标 DynamoDB。 | 为源表和目标 DynamoDB 表初始化 AWS 开发工具包所提供的 DynamoDB 客户端。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)有关使用 IAM 临时凭证发出请求的更多信息，请参阅 [AWS 文档](https://docs.aws.amazon.com/AmazonS3/latest/userguide/AuthUsingTempSessionToken.html)。 | 应用程序开发人员 | 
| 删除和重新创建目标表。 | 使用目标账户 DynamoDB 客户端，在目标账户中删除并重新创建目标 DynamoDB 表（以及索引）。从 DynamoDB 表中删除所有记录是一项代价高昂的操作，因为它会消耗预配置。 WCUs删除并重新创建表，可以避免这些额外费用。您可在创建表之后向其添加索引，但这会延长 2-5 分钟。通过将索引集传递至 `createTable` 调用，在创建表期间创建索引的效率更高。 | 应用程序开发人员 | 
| 执行表格复制。 | 重复以下步骤，直至复制完所有数据：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation.html)有关更多信息，请参阅*附件*部分中的 C\$1 参考实现（用于删除、创建和填充表）。还附上了示例表配置 JavaScript 对象表示法 (JSON) 文件。 | 应用程序开发人员 | 

## 相关资源
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-resources"></a>
+ [Amazon DynamoDB 文档](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)
+ [在您的 Amazon Web Services account 中创建 IAM 用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)
+ [AWS SDKs](https://aws.amazon.com/tools/)
+ [将临时凭证用于 AWS 资源](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)

## 附加信息
<a name="copy-amazon-dynamodb-tables-across-accounts-using-a-custom-implementation-additional"></a>

此模式是使用 C\$1 实现的，用于复制包含 200,000 个项目（平均项目大小为 5 KB，表大小为 250 MB）的 DynamoDB 表。目标 DynamoDB 表的预配置容量为 4000 和 4000。 RCUs WCUs

完整的表复制操作（从源账户到目标账户），包括删除和重新创建表，花了 5 分钟。消耗的总容量单位：30,000 个 RCUs 和大约 40 万个 WCUs。

有关 DynamoDB 容量模式的更多信息，请参阅 AWS 文档中的[读/写容量模式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html)。

## 附件
<a name="attachments-ba8175be-9809-4c2e-b2d1-6b9180ed056c"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/ba8175be-9809-4c2e-b2d1-6b9180ed056c/attachments/attachment.zip)

# 为 Amazon RDS 和 Amazon Aurora 创建详细的成本和使用情况报告
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora"></a>

*Lakshmanan Lakshmanan 和 Sudarshan Narasimhan，Amazon Web Services*

## Summary
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora-summary"></a>

此模式显示如何通过配置[用户定义的成本分配标签](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/custom-tags.html)来跟踪 Amazon Relational Database Service （Amazon RDS） 或 Amazon Aurora 集群的使用成本。您可以使用这些标签在 AWS Cost Explorer 成本管理服务中为跨多个维度的集群创建详细的成本和使用情况报告。例如，您可以在团队、项目或成本中心级别跟踪使用成本，然后在 Amazon Athena 中分析数据。

## 先决条件和限制
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 一个或多个 [Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) 或 [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html) 实例

**限制**

有关标记限制，请参阅 [Amazon Web Services Billing 用户指南](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html)。

## 架构
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora-architecture"></a>

**目标技术堆栈**
+ Amazon RDS 或 Amazon Aurora
+ AWS 成本和使用报告
+ AWS Cost Explorer 成本管理服务
+ Amazon Athena

**工作流程和架构**

标记和分析工作流程包含以下步骤：

1. 数据工程师、数据库管理员或 AWS 管理员为 Amazon RDS 或 Aurora 集群创建用户定义的成本分配标签。

1. AWS 管理员激活标签。

1. 标签将元数据报告给 AWS Cost Explorer 成本管理服务。

1. 数据工程师、数据库管理员或 AWS 管理员创建[月度成本分配报告](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/configurecostallocreport.html#allocation-viewing)。

1. 数据工程师、数据库管理员或 AWS 管理员使用 Amazon Athena 分析月度成本分配报告。

下图显示了如何应用标签来跟踪 Amazon RDS 或 Aurora 实例的使用成本。

 

![\[应用标签以跟踪数据库实例和集群的使用成本\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/eab5001d-5115-4aa6-bdd2-23063b08b262/images/63292b18-01d6-4523-b8ac-2c3b12b11b84.png)


以下架构图显示了如何将成本分配报告与 Amazon Athena 集成以进行分析。

![\[在 Athena 中查询成本分配报告\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/eab5001d-5115-4aa6-bdd2-23063b08b262/images/9c028405-1e93-4f6a-a0e5-36154e2b8eab.png)


月度成本分配报告存储在您指定的 Amazon S3 存储桶中。当你使用 AW CloudFormation S 模板设置 AThena 时，如史诗部分所述，*该*模板会预配置几个额外的资源，包括 AWS Glue 爬虫、AWS Glue 数据库、亚马逊简单通知系统 (Amazon SNS) 事件、AWS Lambda 函数以及 Lambda 函数的 AWS 身份和访问管理 (IAM) 角色。当新的成本数据文件到达 S3 存储桶时，事件通知将用于将这些文件转发到 Lambda 函数进行处理。Lambda 函数启动 AWS Glue 爬网程序作业，以创建或更新 AWS Glue Data Catalog 中的表。然后，此表用于查询 Athena 中的数据。

 

## 工具
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora-tools"></a>
+ [Amazon Athena](https://aws.amazon.com/athena/) 是一种交互式查询服务，方便使用标准 SQL 分析 Amazon S3 的数据。
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展关系数据库。
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/) 是一项基础设施即代码 (IaC) 服务，可让您轻松建模、配置和管理 AWS 和第三方资源。
+ [AWS Cost Explorer 成本管理服务](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/ce-what-is.html)可助您您查看和分析成本与使用情况。

## 操作说明
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora-epics"></a>

### 为您的 Amazon RDS 或 Aurora 集群创建和激活标签
<a name="create-and-activate-tags-for-your-amazon-rds-or-aurora-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为您的 Amazon RDS 或 Aurora 集群创建用户定义的成本分配标签。 | 要向新的或现有的 Amazon RDS 或 Aurora 集群添加标签，请按照 *Amazon Aurora 用户指南*中的[添加、列出和删除标签](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_Tagging.html#Tagging.HowTo)中的说明操作。有关如何设置 Amazon Aurora 集群的信息，请参阅 *Amazon Aurora 用户指南*中有关 [MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.Aurora.html) 和 [PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html) 的说明。 | AWS 管理员、数据工程师、数据库管理员 | 
| 激活用户定义的成本分配标签。 | 按照 *Amazon Web Services Billing 用户指南*中的[激活用户定义的成本分配标签](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/activating-tags.html)中的说明操作。 | AWS 管理员 | 

### 创建成本和使用报告
<a name="create-cost-and-usage-reports"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为集群创建和配置成本和使用情况报告。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora.html)数据将在 24 小时内提供。 | 应用程序所有者、AWS 管理员、数据库管理员、常规 AWS、数据工程师 | 

### 分析成本和使用情况报告数据
<a name="analyze-cost-and-usage-report-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 分析成本和使用报告数据。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora.html)<pre>select status from cost_and_usage_data_status</pre>有关更多信息，请参阅*《AWS 成本和使用情况报告用户指南》*中的[运行 Amazon Athena 查询](https://docs.aws.amazon.com/cur/latest/userguide/cur-ate-run.html)。当您运行 SQL 查询时，请确认从下拉列表中选择了正确的数据库。 | 应用程序所有者、AWS 管理员、数据库管理员、常规 AWS、数据工程师 | 

## 相关资源
<a name="create-detailed-cost-and-usage-reports-for-amazon-rds-and-amazon-aurora-resources"></a>

**参考**
+ [使用 A CloudFormation WS 模板设置 Athena](https://docs.aws.amazon.com/cur/latest/userguide/use-athena-cf.html)（推荐）
+ [手动设置 Athena](https://docs.aws.amazon.com/cur/latest/userguide/cur-ate-manual.html)
+ [运行 Amazon Athena 查询](https://docs.aws.amazon.com/cur/latest/userguide/cur-ate-run.html)
+ [将报告数据加载到其他资源](https://docs.aws.amazon.com/cur/latest/userguide/cur-query-other.html)

**教程和视频**
+ 使用 [Amazon Athena 分析成本和使用情况报告](https://youtu.be/KEeJEZTYE8E)（YouTube 视频）

# 使用 Terraform 在亚马逊 EC2 和亚马逊 FSx 上部署 SQL Server 故障转移集群实例
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx"></a>

*Mark Hudson 和 Matt Burgess，Amazon Web Services*

## Summary
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-summary"></a>

这种模式使用 Terraform 在亚马逊弹性计算云（亚马逊FCIs）上的 Windows 服务器故障转移群集 (WSFC) 节点上部署 SQL Server 故障转移群集实例 ()。 EC2此外，该模式使用 Amazon FSx 共享存储空间来存储数据和日志文件。

将 SQL Server 数据库迁移到时 AWS，首选是 Amazon RDS for SQL Server。但是，有时适用于 SQL Server 的 Amazon RDS 并不合适，SQL Server 必须采用高度可用的架构部署 EC2 在亚马逊上。在此解决方案中，SQL Server 安装 FCIs 在 WSFC 节点上。

此模式中包含的 Terraform 模块最多可配置两个 Amazon EC2 SQL Server 实例。Amazon FSx for Windows 文件服务器文件系统充当法定人数见证人，存储共享的数据和日志文件。无论配置了多少个实例，SQL Server 实例节点始终会创建并加入 FCI 群集，以确保环境奇偶校验。（通常，会为开发配置一个实例，为生产环境配置两个实例。） 对于使用两个节点以实现高可用性的配置，会预调配一个内部网络负载均衡器。网络负载均衡器使用在 FCI 集群上配置的运行状况探针，来识别哪个节点是主节点。

## 先决条件和限制
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ Amazon Virtual Private Cloud（Amazon VPC），其中包含两个位于不同可用区的子网。
+ Amazon VPC [DHCP 选项集](https://docs.aws.amazon.com/vpc/latest/userguide/DHCPOptionSet.html)。配置域名以解析您的 Active Directory 域名，并配置域和 NetBIOS 名称服务器，使其指向您的 Active Directory 域控制器。有关更多信息，请参阅[其他信息](#deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-additional)中的 *VPC 配置*。
+ AWS Directory Service for Microsoft Active Directory (AWS Managed Microsoft AD).
+ 自定义亚马逊机器映像（AMI） 有关更多详细信息，请参阅[其他信息](#deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-additional)中的 *AMI 配置*。
+ 包含 SQL Server ISO 映像的 Amazon Simple Storage Service（Amazon S3）存储桶。只有在使用带有所提供`component.yaml`文件的 [EC2 Image Builder 来构建](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html)自定义 AMI 时，才需要此先决条件。
+ AWS Key Management Service (AWS KMS) 加密密钥。
+ 默认情况下，可使用开发者版产品密钥来安装 SQL Server。生产系统应使用由相关变量传递给模块的有效产品密钥。

**限制**
+ 此解决方案需要 AWS Managed Microsoft AD。但是，如果您愿意，也可以改用自管理 Active Directory 实施。为此，请修改随附的 Amazon FSx Terraform 模块以删除该属性。`active_directory_id`然后，按照 [Terraform](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/fsx_windows_file_system) 文档中所示说明，添加自管理 Active Directory 所需的四个属性。
+ SQL Server 已设置为使用混合模式身份验证。如果您愿意，也可以使用仅 Windows 身份验证。为此，请在提供的用户数据脚本中，移除提供给 `setup.exe` 命令的 `/SECURITYMODE` 和 `/SAPWD` 参数。您可以移除 `sql_accounts.tf` 文件，也可以修改 `instances.tf` 文件以移除 `sql_sa_password` 条目。
+ 删除已部署的集群时，您必须移除 Active Directory 中相应的虚拟计算机对象和单个计算机对象。要移除对象，请使用 Active Directory 管理工具。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然后选择相应服务的链接。

**产品版本**

此解决方案已使用以下版本进行测试：
+ Windows Server 2019
+ SQL Server 2019
+ [Terraform v0.13.0](https://developer.hashicorp.com/terraform/language/v1.1.x/upgrade-guides/0-13)

## 架构
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-architecture"></a>

**源技术堆栈**
+ SQL Server

**目标技术堆栈**
+ 使用亚马逊在 WSFC 节点上使用 SQL Server FCI EC2
+  FSx 适用于 Windows 文件服务器的亚马逊
+ 亚马逊 S3 存储桶
+ AWS Secrets Manager
+ AWS Managed Microsoft AD
+ AWS KMS
+ AWS Identity and Access Management (IAM)

**目标架构**

下图显示了该解决方案的架构。

![\[跨亚马逊上的 Windows 服务器故障转移群集节点部署 SQL Server 故障转移群集实例的架构 EC2。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/45f3ab19-d240-4353-ab6e-f6e565f537a4/images/0bff16f2-94e7-4e86-91ea-7ab5f3725620.png)


此图显示以下内容：
+ 一个 IAM 角色为 EC2 实例提供访问权限 AWS KMS 和 Secrets Manager
+ 两个 SQL Server 节点部署在跨两个可用区的私有子网中的 Amazon EC2 实例上
+ 一个网络负载均衡器，用于促进与活动 SQL Server 实例的连接（设置单节点集群时未部署）
+ Amazon f FSx or Windows 文件服务器文件系统部署在两个私有子网中，由 SQL Server 节点共享存储
+ Secrets Manager，用于存储 Active Directory 和 SQL Server 凭证和配置
+ Amazon S3 存储桶，用于存储 SQL Server 安装映像
+ AWS Managed Microsoft AD 用于 Windows 身份验证
+ AWS KMS 用于创建加密密钥

**自动化和扩展**

[您可以使用存储库中的 Terraform 模块自动部署目标架构。GitHub ](https://github.com/aws-samples/cluster-amazon-elastic-compute-cloud-amazon-fsx-microsoft-sql-server)您必须修改 `terraform.tfvars` 文件以包含特定于您的环境的变量值。Amazon S3 存储桶、 AWS Managed Microsoft AD 组件、 AWS KMS 加密密钥和一些机密是此次部署的先决条件，不包含在 Terraform 代码中。

## 工具
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-tools"></a>

**AWS 服务**
+ [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)允许你的目录感知工作负载和 AWS 资源使用中的 Microsoft Active Directory。 AWS 云在这种模式中，用 AWS Managed Microsoft AD 于 Windows 服务器和 SQL Server 身份验证以及 DNS。
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。在这种模式下，SQL Server 故障转移群集实例安装在亚马逊 EC2 实例上。
+ [EC2 Image Builder](https://docs.aws.amazon.com/imagebuilder/latest/userguide/what-is-image-builder.html) 可帮助您自动创建、管理和部署自定义服务器映像。
+ [亚马逊版 Window FSx s 文件服务器](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html)在 Windows 服务器上提供完全托管的共享存储。在这种模式中， FSx 适用于 Windows 的文件服务器为 SQL Server 数据和日志文件以及法定见证人提供共享存储。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 可帮助您创建和控制加密密钥以帮助保护您的数据。在这种模式中，它用于加密 Secrets Manager 的密钥、亚马逊弹性区块存储 (Amazon EBS) 卷上的 SQL Server 存储以及 FSx 适用于 Windows 文件服务器的文件系统。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 进行的 API 调用，以便以编程方式检索此密钥。在此模式中，用于安装和运行 SQL Server 的 Active Directory 凭证、`sa` 用户凭证和数据库连接信息存储在 Secrets Manager 中。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。此模式使用 Amazon S3 存储桶来存储 SQL Server 安装映像。
+ [Amazon Virtual Private Cloud（亚马逊 VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络，并具有使用 AWS的可扩展基础设施的优势。

** ****其他工具**
+ [微软 SQL Server FCIs](https://learn.microsoft.com/en-us/sql/sql-server/failover-clusters/windows/always-on-failover-cluster-instances-sql-server?view=sql-server-ver15) 安装在 Windows 服务器群集节点上。此外，可跨多个子网进行安装。在此模式中，可跨 WSFC 节点安装 SQL Server FCI 实例。
+ [Terraform](https://www.terraform.io/) 是一款基础设施即代码（IaC）工具，可帮助您使用代码来预调配和管理云基础设施和资源。在此模式中，Terraform 可用于创建资源和配置 SQL Server FCI 实例。
+ [Windows Server 失效转移群集](https://learn.microsoft.com/en-us/sql/sql-server/failover-clusters/windows/windows-server-failover-clustering-wsfc-with-sql-server?view=sql-server-ver15)提供了数项基础设施功能，可支持托管服务器应用程序（例如 SQL Server）的高可用性。在此模式中，FCI 节点利用 WSFC 功能，可通过冗余在实例级别提供本地高可用性。

**代码存储库**

此模式的代码可在 [cloud-amazon-fsx-microsoft-sql GitHub cluster-amazon-elastic-compute-s](https://github.com/aws-samples/cluster-amazon-elastic-compute-cloud-amazon-fsx-microsoft-sql-server) erver 存储库中找到。存储库中提供了以下资源：
+ `README.md` 文件，提供解决方案以及其他安装和使用信息的概述
+ 一组基本的 Terraform 配置文件和一个用于为此模式配置组件的 Amazon FSx 特定模块
+ 作为 Amazon EC2 用户数据脚本运行的实例设置脚本
+ 一个 `component.yam`l 文件，Image Builder 可用它来创建自定义 AMI

## 最佳实践
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-best-practices"></a>

**安全和修补**
+ AMI 先决条件安装和配置是部署 SQL Server FCI 集群的最低要求。可能需要额外的软件和配置才能符合组织的标准和安全要求。
+ 部署完成后，持续修补 Windows。要么直接修补正在运行的实例，要么使用最新的 Windows 补丁创建新 AMI，然后使用新的 AMI 替换实例（一次一个）。 AWS AMIs 每月发布新的 Windows，其中包含最新的操作系统补丁、驱动程序和启动代理。我们建议您在启动新实例或构建自己的自定义映像时检查最新的 AMI。
+ Amazon EC2 实例配置为允许所有传出流量。在生产环境中部署时，应在安全组中设置出站规则，以限制此流量进入所需目标。
+  FSx 适用于 Windows File Server 的文件系统可以自动记录文件共享以及文件和文件夹访问的审核日志，并在您的环境中需要时将其发送到所需的目的地。
+ 定期自动轮换 Secrets Manager 密钥。对于亚马逊 EC2 实例密钥对，请考虑使用自动轮换解决方案，如[如何使用 AWS Secrets Manager 安全存储和轮换 SSH 密钥对](https://aws.amazon.com/blogs/security/how-to-use-aws-secrets-manager-securely-store-rotate-ssh-key-pairs/)中所述。对于 Active Directory 凭证和 SQL Server `sa` 凭证密钥，请根据您的密码管理策略设置自动轮换。

**Active Directory 管理**
+ 作为 FCI 集群的一部分，Windows 会在 Active Directory 中生成一个计算机名称对象（CNO）。CNO 响应 DNS 请求并将流量转发到活跃 SQL 节点。我们*不*建议使用这个 Active Directory 提供的 DNS。TTL 太高而无法提供合理的失效转移时间，并且通常需要 5 分钟以上的时间才能反映出新的主要 IP 地址。相比之下，对于高度可用的安装，内部网络负载均衡器会配置为在 30 秒内进行失效转移。
+ 需要 Active Directory 域管理员才能创建集群。由于在 Active Directory 中创建集群对象和修改权限需要提升权限，因此才会有此要求。但是，SQL Server 服务不需要以域管理员身份运行。因此，我们建议您针对此目的创建第二个 Active Directory 用户。但是，如果服务将以域管理员用户身份运行，则可消除该用户。在这种情况下，必须将域管理员用户添加到作为此模式的一部分创建的 Active Directory 管理员组中。

## 操作说明
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-epics"></a>

### 设置集群凭证
<a name="set-up-cluster-credentials"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Active Directory 组。 | 在中 AWS Managed Microsoft AD，创建以下群组：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.html)有关更多详细信息，请参阅 AWS 文档中的[创建 AWS Managed Microsoft AD 群组](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_create_group.html)。 | AD 管理员 | 
| 创建 Active Directory 用户。 | 在 AWS Managed Microsoft AD中，创建以下用户[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.html)有关更多详细信息，请参阅 AWS 文档中的[创建 AWS Managed Microsoft AD 用户](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_manage_users_groups_create_user.html)。 | AD 管理员 | 
| 将 Active Directory 凭证添加到密钥。 | 使用 Secrets Manager 创建四个密钥，以存储以下信息：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.html)有关更多详细信息，请参阅 AWS 文档中的[创建 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html)。 | AWS 管理员 | 

### 准备环境
<a name="prepare-the-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Windows AMI。 | 创建包含必备软件和配置的自定义 Windows AMI。有关更多详细信息，请参阅[其他信息](#deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-additional)。 | AWS 管理员，AWS DevOps | 
| 安装 Terraform。 | 要安装 Terraform，请按照 [Terraform](https://learn.hashicorp.com/tutorials/terraform/install-cli) 网站上的说明进行操作。 | AWS DevOps | 
| 克隆存储库。 | 克隆此模式的[存储库](https://github.com/aws-samples/cluster-amazon-elastic-compute-cloud-amazon-fsx-microsoft-sql-server)。有关更多详细信息，请参阅 GitHub 网站上[的 “克隆仓库](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)”。 | AWS DevOps | 

### 安装集群
<a name="install-the-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改 Terraform 变量。 | 更新提供的 `terraform.tfvars` 文件，将所有变量设置为适合您环境的值。例如，更新 `domain_group_administrators` 和 `domain_group_rdp_users` 变量，以使用您的 Active Directory 域名和之前创建的 Active Directory 组的名称。 | AWS DevOps | 
| 初始化 Terraform。 | 要查看建议的部署，请导航至存储库的根目录。使用 Terraform 命令行界面（CLI）运行 `terraform init`，然后运行 `terraform plan`。 | AWS DevOps | 
| 部署资源。 | 要部署 SQL 集群和关联的资源，请使用 Terraform CLI 运行 `terraform apply`。 | AWS DevOps，AWS 管理员 | 
| 验证部署。 | 要验证部署，请使用以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.html) | 数据库管理员、AWS 系统管理员 | 

## 问题排查
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| Terraform 预调配已完成，但是 Windows 失效转移群集管理器未显示集群已创建或集群处于不可操作状态。 | 资源的整个安装和集群的配置可能需要 45-60 分钟。Terraform 完成后，用户数据脚本必须运行直至完成，而这一过程需要多次重启。要监控进度，您可以使用 `C:\` 驱动程序中的 `Checkpoints` 目录和 `C:\Program Data\Microsoft SQL Server\150\Log` 中的 SQL Server 安装日志。完成后，`C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log` 文件中将显示**安装完成**消息。 | 
| 预调配运行正常的集群后，使用 Terraform 删除并重新创建集群并未成功。Terraform 已完成，但集群未正确设置。 | 预调配过程的一部分涉及将计算机和虚拟对象注册到 Active Directory 和 Active Directory DNS。如果存在 Amazon EC2 群集节点和群集节点的计算机名称，FCI 将无法正确初始化，因此配置将失败。要修复这一问题，请执行以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.html) | 

## 相关资源
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-resources"></a>

**AWS 文档**
+ [使用 Image Builder 创建自定义镜像](https://docs.aws.amazon.com/imagebuilder/latest/userguide/create-images.html)
+ [创建 KMS 密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)
+ [创建通用存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)
+ [创建密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)
+ [创建你的 AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started_create_directory.html)

## 附加信息
<a name="deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-additional"></a>

**Terraform 模块信息**

该模块混合使用 AMI 配置和用户数据配置，以实现预调配时间和稳定性的良好平衡。在预调配期间，Windows 需要多次重启和等待。为防止在重新启动持久性用户数据期间出现无限循环，我们已实施了一种检查点方法。用户数据配置为持久。因此，用户数据配置脚本必须开发为幂等性，而且必须继续保持为幂等性。幂等性可简化更新过程，允许在更新周期内交换实例，无需手动配置即可重新加入或重新创建 FCI 集群。

**SQL Server 连接字符串和失效转移群集**

该模块将发布一个密钥，其中包含应在此数据库的连接字符串中使用的端点地址。此密钥名称遵循以下格式：`{environment_name}/sqlserver/{cluster_name}/endpoint`。对于仅使用一个节点的安装，您可以预期这是亚马逊 EC2 实例 SQL Server 接口的 IP 地址。对于高可用性安装（两个实例），您可以预期这是内部网络负载均衡器的 DNS 名称。

此模块 IPs 不支持虚拟故障转移群集。虚拟 IP 必须保持在同一个子网中才能正常运作。在中 AWS，单个子网不能跨越多个可用区。因此，使用虚拟 IPs 将使该模块无法被视为高可用性。

每个 Amazon EC2 实例都有三个私有 IP 地址。其用法如下所示：
+ **网络流量的主要 IP** – 出口流量的源 IP。
+ **FCI 通信** – 用于维护失效转移群集的状态和同步。
+ **SQL Server（TCP 端口 1433）**– 侦听器，还可以侦听心跳流量以确定哪个实例是主实例。

**VPC 配置**

[先决条件](#deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx-prereqs)列出了配置为使用 Active Directory for DNS 解析的 DHCP 选项集。但是，此先决条件并非硬性要求。硬性要求是，这些 EC2 实例必须能够解析您的 Active Directory 域名。可以通过其他方式来满足此要求，例如使用 Amazon Route 53 Resolver 端点。有关更多信息，请参阅[将目录服务的 DNS 解析与 Amazon Route 53 解析器集成](https://aws.amazon.com/blogs/networking-and-content-delivery/integrating-your-directory-services-dns-resolution-with-amazon-route-53-resolvers/)（AWS 博客文章）。

**AMI 配置**

此模式中使用的 AMI 必须包含以下必备软件和配置：

1. 下载 SQL Server 2019 安装文件并将其扩展为 `C:\SQL_Install_media`。

1. 安装以下 Windows 功能：
   + `Install-WindowsFeature Failover-Clustering`
   + `Install-WindowsFeature RSAT-AD-PowerShell`
   + `Install-WindowsFeature RSAT-AD-Tools`
   + `Install-WindowsFeature RSAT-Clustering-Mgmt`
   + `Install-WindowsFeature RSAT-Clustering-PowerShell`
   + `Install-WindowsFeature RSAT-Clustering-CmdInterface`

1. 禁用 Windows 防火墙，如下所示：
   + `Get-NetFirewallProfile | Set-NetFirewallProfile -Enabled False`

1. 启用 CredSSP 身份验证方法（将 `<domain>` 替换为组织的 Windows 域名），如下所示：
   + `Enable-WSManCredSSP -Role "Server" -Force`
   + `Enable-WSManCredSSP -Role "Client" -DelegateComputer *.<domain>.com -Force`

1. 设置以下注册表项：
   + 允许 NTLM 身份验证凭证：
     + `HKLM:\Software\Policies\Microsoft\Windows\CredentialsDelegation`
       + 名称: `AllowFreshCredentialsWhenNTLMOnly`
       + 值：1
       + 类型：`REG_DWORD`
   + 允许本地域计算机从以下位置使用 NTLM： PowerShell
     + 路径：`HKLM:\Software\Policies\Microsoft\Windows\CredentialsDelegation\AllowFreshCredentialsWhenNTLMOnly`
       + 名称: `1`
       + 值：`wsman/*.<domain>.com`
       + 类型：`REG_SZ`

1. 按如下方式设置[PowerShell 图库](https://learn.microsoft.com/en-us/powershell/gallery/overview?view=powershellget-3.x)：
   + `[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12`
   + `Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force`
   + `Set-PSRepository -Name PSGallery -InstallationPolicy Trusted`

1. 安装以下 Windows PowerShell 模块`*`：
   + `Install-Module -Name ComputerManagementDsc`
   + `Install-Module -Name FailOverClusterDsc`
   + `Install-Module -Name PSDscResources`
   + `Install-Module -Name xSmbShare`
   + `Install-Module -Name xActiveDirectory`
   + `Install-Module -Name SqlServer`

要使用 Image Builder 创建 AMI，请按照 [Image Builder 文档中使用 EC2 映像生成器控制台向导创建映像管道](https://docs.aws.amazon.com/imagebuilder/latest/userguide/start-build-image-pipeline.html)中的说明进行操作。要创建具有先决条件的配方组件，请使用以下步骤：

1. [从存储库的[`ami `文件夹中下载 component.yaml](https://github.com/aws-samples/cluster-amazon-elastic-compute-cloud-amazon-fsx-microsoft-sql-server/blob/main/ami/component.yaml) 文件。GitHub ](https://github.com/aws-samples/cluster-amazon-elastic-compute-cloud-amazon-fsx-microsoft-sql-server)

1. 将内容复制到新的 Image Builder 组件中。

1. 使用您的信息更新以下占位符：
   + `<domain>` – 您的 Active Directory 域名
   + `<bucket_name>` – 包含 SQL Server 映像的 Amazon S3 存储桶的名称

# 在 Amazon Aurora PostgreSQL 中模拟 Oracle PL/SQL 关联数组和适用于 PostgreSQL 的亚马逊 RDS
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql"></a>

*Rajkumar Raghuwanshi、Bhanu Ganesh Gudivada 和 Sachin Khanna，Amazon Web Services*

## Summary
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-summary"></a>

[此模式描述了如何在 Amazon Aurora PostgreSQL 和 [Amazon RDS for PostgreSQL 环境中模拟索引位置为](https://aws.amazon.com/rds/aurora/)空的 Oracle PL/SQL 关联数组。](https://aws.amazon.com/rds/postgresql/)它还描述了 Oracle PL/SQL 关联数组和 PostgreSQL 数组之间在迁移期间如何处理空索引位置方面的一些区别。

就在迁移 Oracle 数据库时处理空索引位置方面，我们提供了 PostgreSQL 替代方案，而不是使用 `aws_oracle_ext` 函数。此模式使用附加列来存储索引位置，并且保留了 Oracle 对稀疏数组的处理方式，同时还整合了原生 PostgreSQL 功能。

**Oracle**

在 Oracle 中，集合可以初始化为空，并使用 `EXTEND` 集合方法进行填充，而该方法会将 `NULL` 元素附加到数组中。使用索引的 PL/SQL 关联数组时`PLS_INTEGER`，该`EXTEND`方法按顺序添加`NULL`元素，但也可以在非序列索引位置初始化元素。任何未显式初始化的索引位置均保留为空。

这种灵活性允许稀疏数组结构，其中元素可以填充到任意位置。使用具有 `FIRST` 和 `LAST` 的 `FOR LOOP` 迭代集合时，仅会处理已初始化的元素（无论是 `NULL` 还是具有定义的值），而空位置则会被跳过。

**PostgreSQL（Amazon Aurora 和 Amazon RDS）**

PostgreSQL 处理空值的方式与处理 `NULL` 值的方式有所不同。它将空值存储为不同实体，且仅会占用一个字节存储空间。当数组包含空值时，PostgreSQL 会像处理非空值一样分配顺序索引位置。但是顺序索引需要额外的处理，因为系统必须迭代所有索引位置，包括空位置。因此，相较于稀疏资料集，传统数组创建的效率更低。

**AWS Schema Conversion Tool**

[AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/) 通常使用`aws_oracle_ext`函数处理 Oracle-to-PostgreSQL迁移。在此模式中，我们提出了一种替代方法，该方法使用原生 PostgreSQL 功能，将 PostgreSQL 数组类型与用于存储索引位置的附加列相结合。然后，系统只需使用索引列即可迭代数组。

## 先决条件和限制
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ 具有管理员权限的 AWS Identity and Access Management (IAM) 用户。
+ 一个可与 Amazon RDS 或 Aurora PostgreSQL 兼容的实例。
+ 对关系数据库有基本的了解。

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

**产品版本**

此模式已使用以下版本进行测试：
+ 亚马逊 Aurora PostgreSQL 13.3
+ Amazon RDS for PostgreSQL 13.3
+ AWS SCT 1.0.674
+ Oracle 12c EE 12.2

## 架构
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-architecture"></a>

**源技术堆栈**
+ 本地 Oracle 数据库

**目标技术堆栈**
+ Amazon Aurora PostgreSQL
+ Amazon RDS for PostgreSQL

**目标架构**

![\[alt text not found\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a62d038c-ca3c-41e1-aa7e-74282d2e54f4/images/13aacf00-655a-4149-a4e7-42b66dbea4e1.png)


此图显示以下内容：
+ 一个源 Amazon RDS for Oracle 数据库实例
+ 一个 AWS SCT 用于将 Oracle 函数转换为 PostgreSQL 等效函数的 Amazon EC2 实例
+ 一个可与 Amazon Aurora PostgreSQL 兼容的目标数据库

## 工具
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩缩 PostgreSQL 部署。
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [Amazon Relational Database Service（Amazon RDS）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)可帮助您在 AWS 云中设置、操作和扩展关系数据库。
+ [Amazon Relational Database Service（Amazon RDS）for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html) 可帮助您在 AWS 云中设置、操作和扩缩 Oracle 关系数据库。
+ [Amazon Relational Database Service（Amazon RDS）for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) 可帮助您在 AWS 云中设置、操作和扩展 PostgreSQL 关系数据库。
+ [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html) 通过自动将源数据库架构和大部分自定义代码转换为与目标数据库兼容的格式来支持异构数据库迁移。

**其他工具**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) 是一个集成的开发环境，可简化传统部署和基于云的部署中 Oracle 数据库的开发和管理。
+ [pgAdmin](https://www.pgadmin.org/) 是一种适用于 PostgreSQL 的开源管理工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。在此模式下，pgAdmin 会连接到 RDS for PostgreSQL 数据库实例并查询数据。或者，您可使用 psql 命令行客户端。

## 最佳实践
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-best-practices"></a>
+ 测试数据集边界和边缘场景。
+ 考虑对 out-of-bounds索引条件实现错误处理。
+ 优化查询，以避免扫描稀疏数据集。

## 操作说明
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-epics"></a>

### Oracle 关联数组行为（源）
<a name="oracle-associative-array-behavior-source"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 Oracle 中创建源 PL/SQL 块。 | 在 Oracle 中创建使用以下关联数组的源 PL/SQL 块：<pre>DECLARE<br />    TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer;<br />    cc country_codes;<br />    cc_idx NUMBER := NULL;<br />BEGIN<br />    cc(7) := 'India';<br />    cc(3) := 'UK';<br />    cc(5) := 'USA';<br />    cc(0) := 'China';<br />    cc(-2) := 'Invalid';<br />    dbms_output.put_line('cc_length:' || cc.COUNT);<br />    IF (cc.COUNT > 0) THEN<br />        cc_idx := cc.FIRST;<br />        FOR i IN 1..cc.COUNT LOOP<br />            dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx));<br />            cc_idx := cc.next(cc_idx);<br />        END LOOP;<br />    END IF;<br />END;</pre> | 数据库管理员 | 
| 运行方 PL/SQL 块。 | 在 Oracle 中运行源代码 PL/SQL 块。如果关联数组的索引值之间存在间隙，也不会在这些间隙中存储任何数据。这样，Oracle 循环就可以仅迭代索引位置。 | 数据库管理员 | 
| 检查输出。 | 五个元素会以非连续的间隔插入到数组 (`cc`) 中。数组计数如以下输出所示：<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | 数据库管理员 | 

### PostgreSQL 关联数组行为（目标）
<a name="postgresql-associative-array-behavior-target"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 PostgreSQL 中创建一个目标 PL/pgSQL 区块。 | 在 PostgreSQL 中创建一个使用以下关联数组的目标 PL/pgSQL 块：<pre>DO $$<br />DECLARE<br />    cc character varying(100)[];<br />    cc_idx integer := NULL;<br />BEGIN<br />    cc[7] := 'India';<br />    cc[3] := 'UK';<br />    cc[5] := 'USA';<br />    cc[0] := 'China';<br />    cc[-2] := 'Invalid';<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1)<br />        LOOP<br />            RAISE NOTICE 'cc_idx:% country:%', i, cc[i];<br />        END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | 数据库管理员 | 
| 运行方 PL/pgSQL 块。 | 在 PostgreSQL 中运行目标 PL/pgSQL 区块。如果关联数组的索引值之间存在间隙，也不会在这些间隙中存储任何数据。这样，Oracle 循环就可以仅迭代索引位置。 | 数据库管理员 | 
| 检查输出。 | 数组长度大于 5，因为 `NULL` 存储在索引位置之间的空隙中。如以下输出所示，该循环会完成 10 次迭代，以检索数组中的 5 个值。<pre>cc_length:10<br />cc_idx:-2 country:Invalid<br />cc_idx:-1 country:<NULL><br />cc_idx:0 country:China<br />cc_idx:1 country:<NULL><br />cc_idx:2 country:<NULL><br />cc_idx:3 country:UK<br />cc_idx:4 country:<NULL><br />cc_idx:5 country:USA<br />cc_idx:6 country:<NULL><br />cc_idx:7 country:India</pre> | 数据库管理员 | 

### 模拟 Oracle 关联数组行为
<a name="emulate-oracle-associative-array-behavior"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用数组和用户定义类型创建目标 PL/pgSQL 块。 | 为了优化性能并匹配 Oracle 的功能，我们可以创建用户定义的类型，进而存储索引位置及其对应的数据。这种方法可以保持索引和值之间的直接关联，进而减少不必要的迭代。<pre>DO $$<br />DECLARE<br />    cc country_codes[];<br />    cc_append country_codes := NULL;<br />    i record;<br />BEGIN<br />    cc_append.idx = 7;<br />    cc_append.val = 'India';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 3;<br />    cc_append.val = 'UK';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 5;<br />    cc_append.val = 'USA';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = 0;<br />    cc_append.val = 'China';<br />    cc := array_append(cc, cc_append);<br />    cc_append.idx = - 2;<br />    cc_append.val = 'Invalid';<br />    cc := array_append(cc, cc_append);<br />    RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1);<br />    IF (ARRAY_LENGTH(cc, 1) > 0) THEN<br />        FOR i IN (<br />            SELECT<br />                *<br />            FROM<br />                unnest(cc)<br />            ORDER BY<br />                idx)<br />                LOOP<br />                    RAISE NOTICE 'cc_idx:% country:%', i.idx, i.val;<br />                END LOOP;<br />    END IF;<br />END;<br />$$;</pre> | 数据库管理员 | 
| 运行方 PL/pgSQL 块。 | 运行目标 PL/pgSQL 方块。如果关联数组的索引值之间存在间隙，也不会在这些间隙中存储任何数据。这样，Oracle 循环就可以仅迭代索引位置。 | 数据库管理员 | 
| 检查输出。 | 如以下输出所示，用户定义的类型仅存储已填充的数据元素，这意味着数组长度与值的数量相匹配。因此，`LOOP` 迭代经过优化，仅会处理现有数据，而无需跟踪空位置。<pre>cc_length:5<br />cc_idx:-2 country:Invalid<br />cc_idx:0 country:China<br />cc_idx:3 country:UK<br />cc_idx:5 country:USA<br />cc_idx:7 country:India</pre> | 数据库管理员 | 

## 相关的资源
<a name="emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql-resources"></a>

**AWS 文档**
+ [AWS 数据库博客](https://aws.amazon.com/blogs/database/)
+ [Oracle 至 Aurora PostgreSQL 迁移行动手册](https://docs.aws.amazon.com/dms/latest/oracle-to-aurora-postgresql-migration-playbook/chap-oracle-aurora-pg.html)

**其他文档**
+ [Oracle 关联数组](https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/associative-arrays.html#GUID-8060F01F-B53B-48D4-9239-7EA8461C2170)
+ [PostgreSQL 数组函数和运算符](https://www.postgresql.org/docs/current/functions-array.html)
+ [PostgreSQL 用户定义的类型](https://www.postgresql.org/docs/current/sql-createtype.html)

# 在 Amazon RDS 中为 PostgreSQL 数据库实例启用加密连接
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds"></a>

*Rohit Kapoor，Amazon Web Services*

## Summary
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-summary"></a>

Amazon Relational Database Service（Amazon RDS）支持适用于 PostgreSQL 数据库实例的 SSL 加密。使用 SSL，您可以加密应用程序与 Amazon RDS for PostgreSQL 数据库实例之间的 PostgreSQL 连接。默认情况下，适用于 PostgreSQL 的 Amazon RDS SSL/TLS 使用并期望所有客户端都使用加密进行连接。 SSL/TLS Amazon RDS for PostgreSQL 支持 TLS 版本 1.1 和 1.2。

此模式介绍了如何为 Amazon RDS for PostgreSQL 数据库实例启用加密连接。您可使用相同进程为 Amazon Aurora PostgreSQL-Compatible Edition 启用加密连接。

## 先决条件和限制
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-prereqs"></a>
+ 一个有效的 Amazon Web Services account
+ [Amazon RDS for PostgreSQL 数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_RDS_Configuring.html)
+ [SSL 捆绑包](https://www.postgresql.org/docs/current/ssl-tcp.html)

## 架构
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-architecture"></a>

![\[在 Amazon RDS 中为 PostgreSQL 数据库实例启用加密连接\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/4f87c6a3-b4ff-4248-96d3-a4a498659735/images/ccc5c880-1191-4c12-a255-6908b96b96a5.png)


## 工具
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-tools"></a>
+ [pgAdmin](https://www.pgadmin.org/) 是 PostgreSQL 的开源管理和开发平台。您可在 Linux、Unix、macOS 和 Windows 上使用 pgadmin 来管理 PostgreSQL 10 及更高版本中的数据库对象。
+ [PostgreSQL](https://wiki.postgresql.org/wiki/PostgreSQL_Clients) 编辑器提供了更加用户友好的界面，可帮助您创建、开发和运行查询，并按您的要求编辑代码。

## 最佳实践
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-best-practices"></a>
+ 监控不安全数据库连接。
+ 审核数据库访问权限。
+ 确保对备份和快照进行静态加密。
+ 监控数据库访问。
+ 避免使用不受限制的访问组。
+ 使用 [Amazon](https://docs.aws.amazon.com/guardduty/latest/ug/what-is-guardduty.html) 增强您的通知效果 GuardDuty。
+ 定期监控政策遵守情况。

## 操作说明
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-epics"></a>

### 下载受信任的证书，并将其导入您的信任存储区
<a name="download-a-trusted-certificate-and-import-it-into-your-trust-store"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将受信任的证书加载到您的计算机。 | 要将证书添加到计算机的受信任的根证书颁发机构存储中，请按照以下步骤操作。（这些指令以 Windows Server 为例。）[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html) | DevOps 工程师、迁移工程师、DBA | 

### 强制执行 SSL 连接
<a name="force-ssl-connections"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建参数组和设置 rds.force\$1ssl 参数。 | 如果 PostgreSQL 数据库实例具有自定义参数组，请编辑该参数组并将 `rds.force_ssl` 更改为 1。如果数据库实例使用未启用 `rds.force_ssl` 的默认参数组，则创建新的参数组。您可使用 Amazon RDS API 修改新的参数组，也可以按照以下说明手动修改新的参数组。要创建新参数组，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html)将参数组与您的 PostgreSQL 数据库实例相关联，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html)有关更多信息，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithDBInstanceParamGroups.html)。 | DevOps 工程师、迁移工程师、DBA | 
| 强制执行 SSL 连接。 | 连接到 Amazon RDS for PostgreSQL 数据库实例。不使用 SSL 的连接尝试会被拒绝，并显示错误消息。有关更多信息，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Concepts.General.SSL.html#PostgreSQL.Concepts.General.SSL.Requiring)。 | DevOps 工程师、迁移工程师、DBA | 

### 安装 SSL 扩展
<a name="install-ssl-extension"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 SSL 扩展。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html)有关更多信息，请参阅 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Concepts.General.SSL.html)。 | DevOps 工程师、迁移工程师、DBA | 

### 为您的 PostgreSQL 客户端配置 SSL
<a name="configure-your-postgresql-client-for-ssl"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 SSL 配置客户端。 | 通过使用 SSL，您可启动支持使用 TLS 协议的加密连接的 PostgreSQL 服务器。服务器在同一 TCP 端口上侦听标准连接和 SSL 连接，并与任何连接客户端协商是否使用 SSL。默认情况下，这是一个客户端选项。如果您使用 psql 客户端：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html)对于其他 PostgreSQL 客户端：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html)查看以下客户页面：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.html) | DevOps 工程师、迁移工程师、DBA | 

## 问题排查
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 无法下载 SSL 证书。 | 检查您与网站的连接，然后重试将证书下载到您的本地计算机。 | 

## 相关资源
<a name="enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds-resources"></a>
+ [Amazon RDS for PostgreSQL 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html)
+ [将 SSL 与 PostgreSQL 数据库实例结合使用](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/PostgreSQL.Concepts.General.SSL.html)（Amazon RDS 文档）
+ [使用 SSL 进行安全 TCP/IP 连接](https://www.postgresql.org/docs/9.1/ssl-tcp.html)（PostgreSQL 文档）
+ [使用 SSL](https://jdbc.postgresql.org/documentation/ssl/)（JDBC 文档）

# 加密现有 Amazon RDS for PostgreSQL 数据库实例
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance"></a>

*Piyush Goyal、Shobana Raghu 和 Yaser Raja，Amazon Web Services*

## Summary
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-summary"></a>

此模式说明了如何在 AWS 云中加密现有的 Amazon Relational Database Service（Amazon RDS）for PostgreSQL 数据库实例，同时最大限度地减少停机时间。此进程也适用于 Amazon RDS for MySQL 数据库实例。

您可以在创建 Amazon RDS DB 数据库实例时为其启用加密，而不能在创建数据库实例之后启用加密。但是，您可以对未加密的数据库实例添加加密，方法是创建数据库实例快照，然后创建此快照的加密副本。然后，您可以从加密快照还原数据库实例，从而获得原始数据库实例的加密副本。如果您的项目允许在此活动期间停机（至少对于写入事务来说是如此），那么这就是您所需要做的。当数据库实例的新加密副本可用时，您可将应用程序指向新数据库。但是，如果您的项目不允许此活动出现大量停机时间，则您需要一种替代方法来帮助最大限度地减少停机时间。此模式使用 AWS Database Migration Service (AWS DMS) 迁移并持续复制数据，以便可以在最短的停机时间内完成到新的加密数据库的割接。 

Amazon RDS 加密的数据库实例使用行业标准 AES-256 加密算法，对托管 Amazon RDS 数据库实例的服务器上的数据进行加密。在加密数据后，Amazon RDS 将以透明方式处理访问的身份验证和数据的解密，并且对性能产生的影响最小。您无需修改数据库客户端应用程序来使用加密。

## 先决条件和限制
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 未加密的 Amazon RDS for PostgreSQL 数据库实例
+ 有处理（创建、修改或停止）AWS DMS 任务的经验（请参阅 [AWS DMS 文档中的处理 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.html)）
+ 熟悉用于加密数据库的 AWS Key Management Service (AWS KMS)（[AWS KMS 文档](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)）

**限制**
+ 您只能在创建 Amazon RDS 数据库实例时而不是创建该数据库实例之后启用对该数据库实例的加密。
+ [未记录表](https://www.postgresql.org/docs/current/sql-createtable.html)中的数据不会使用快照进行恢复。有关更多信息，请参阅 [PostgreSQL 最佳实践](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_BestPractices.html#CHAP_BestPractices.PostgreSQL)。
+ 您无法拥有未加密数据库实例的加密只读副本或加密数据库实例的未加密只读副本。
+ 您不能将未加密的备份或快照还原到加密的数据库实例。
+ AWS DMS 不会自动传输序列，因此需要采取额外的步骤来处理此问题。

有关更多信息，请参阅 Amazon RDS 文档中的 [Amazon RDS 加密数据库实例限制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html#Overview.Encryption.Limitations)。

## 架构
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-architecture"></a>

**源架构**
+ 未加密的 RDS 数据库实例

**目标架构 **
+ 加密的 RDS 数据库实例
  + 目标 RDS 数据库实例是通过恢复源 RDS 数据库实例的数据库快照副本来创建的。
  + 还原快照时使用 AWS KMS 密钥加密。
  + AWS DMS 复制任务可用于迁移数据。

![\[该流程使用 AWS DMS 加密现有的 Amazon RDS for PostgreSQL 数据库实例，并将其转换为新数据库。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/820d17c0-0eed-4ed9-9f43-cbada081d924/images/44dd8420-d89d-466e-b7fb-1bdafab8f7f9.png)


## 工具
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-tools"></a>

**用于启用加密的工具：**
+ 用于加密的 AWS KMS 密钥 - 创建加密数据库实例时，您可为 Amazon RDS 选择客户托管密钥或适用于 Amazon RDS 的 AWS 托管式密钥 来加密您的数据库实例。如果您没有为客户托管密钥指定密钥标识符，则 Amazon RDS 会将 AWS 托管式密钥用于您的新数据库实例。Amazon RDS 为您的 Amazon Web Services account 创建用于 Amazon RDS 的 AWS 托管式密钥。您的 Amazon Web Services account 对每个 AWS 区域都有不同的用于 Amazon RDS 的 AWS 托管式密钥。有关使用 KMS 密钥进行 Amazon RDS 加密的更多信息，请参阅[加密 Amazon RDS 资源](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.Encryption.html)。

**用于持续复制的工具**：
+ AWS DMS — 您可使用 AWS Database Migration Service (AWS DMS) 将更改从源数据库复制到目标数据库。保持源数据库和目标数据库同步，最大限度地减少停机时间，这一点很重要。有关设置 AWS DMS 和创建任务的信息，请参阅 [AWS DMS 文档](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html)。

## 操作说明
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-epics"></a>

### 创建源数据库实例快照并加密
<a name="create-a-snapshot-of-the-source-db-instance-and-encrypt-it"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 查看源 PostgreSQL 数据库实例详细信息。 | 在 Amazon RDS 控制台，选择源 PostgreSQL 数据库实例。在**配置**选项卡，确保未为实例启用加密。有关屏幕插图，请参阅[其他信息](#encrypt-an-existing-amazon-rds-for-postgresql-db-instance-additional)部分。 | 数据库管理员 | 
| 创建数据库快照。 | 为待加密的实例创建数据库快照。创建快照所用时间因数据库大小而异。有关说明，请参阅 Amazon RDS 文档中的[创建数据库快照](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html)。 | 数据库管理员 | 
| 加密快照。 | 在 Amazon RDS 控制台导航窗格，选择**快照**，然后选择您创建的数据库快照。对于 **Actions (操作)**，选择 **Copy Snapshot (复制快照)**。在相应的字段中提供目标 AWS 区域和数据库快照副本的名称。选中**启用加密**复选框。对于 **Master Key**，指定用于加密数据库快照副本的 KMS 密钥标识符。选择**复制快照**。有关更多信息，请参阅 Amazon RDS 文档中的[复制快照](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CopySnapshot.html)。 | 数据库管理员 | 

### 准备目标数据库实例
<a name="prepare-the-target-db-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 还原数据库快照。 | 在 Amazon RDS 控制台中，选择**快照**。选择您创建的加密快照。对于**操作**，选择**还原快照**。对于**数据库实例标识符**，请为新数据库实例提供一个唯一名称。查看实例详细信息，然后选择**还原数据库实例**。将根据您的快照创建新的加密数据库实例。有关更多信息，请参阅 Amazon RDS 文档中[从数据库快照还原](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_RestoreFromSnapshot.html)。 | 数据库管理员 | 
| 使用 AWS DMS 迁移数据。 | 在 AWS DMS 控制台，创建 AWS DMS 任务。对于**迁移类型**，请选择**迁移现有数据并复制正在进行的更改**。在**任务设置**，对于**目标表格准备模式**，选择**截断**。有关更多信息，请参阅 AWS DMS 文档中的[创建任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html)。 | 数据库管理员 | 
| 启用数据验证。 | 在**任务设置**中，选择**启用验证**。这使您能够将源数据与目标数据进行比较，以验证数据是否已准确迁移。  | 数据库管理员 | 
| 禁用目标数据库实例限制。 | 在目标数据库实例的[禁用所有触发器和外键约束](https://www.postgresql.org/docs/current/sql-altertable.html)，然后启动 AWS DMS 任务。有关禁用触发器和外键约束的更多信息，请参见 [AWS DMS 文档](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)。 | 数据库管理员 | 
| 验证数据。 | 满载完成后，验证目标数据库实例数据，以查看其是否与源数据匹配。有关更多信息，请参阅 AWS DMS 文档中的[ AWS DMS 数据验证](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Validating.html)。 | 数据库管理员 | 

### 割接到目标数据库实例
<a name="cut-over-to-the-target-db-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止对源数据库实例的写入操作。 | 停止对源数据库实例的写入操作，以应用程序可以开始停机。验证 AWS DMS 是否已完成对管道数据的复制。启用目标数据库实例的触发器与外键。 | 数据库管理员 | 
| 更新数据库序列 | 如果源数据库包含任何序列号，则验证并更新目标数据库中的序列。 | 数据库管理员 | 
| 配置应用程序端点。 | 配置您的应用程序连接，以使用新 Amazon RDS 数据库实例端点。已加密数据库实例。 | 数据库管理员，应用程序所有者 | 

## 相关资源
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-resources"></a>
+ [创建 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html) 
+ [使用 Amazon 监控复制任务 CloudWatch](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Monitoring.html#CHAP_Monitoring.CloudWatch)
+ [监控 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Monitoring.html)
+ [更新 Amazon RDS 加密密钥](https://aws.amazon.com/premiumsupport/knowledge-center/update-encryption-key-rds/)

## 附加信息
<a name="encrypt-an-existing-amazon-rds-for-postgresql-db-instance-additional"></a>

检查源 PostgreSQL 数据库实例的加密：

![\[源 PostgreSQL 数据库实例的摘要页面会显示存储未启用加密。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/820d17c0-0eed-4ed9-9f43-cbada081d924/images/d53d1dab-b5c2-452d-b823-ba3d6508ad15.png)


此示例的其他注意事项：
+ 通过将 `rds.logical_replication` 参数设置为 1，在 PostgreSQL 上启用复制。

**重要说明：**复制槽会保留预写日志 (WAL) 文件，直到 `pg_recvlogical` 文件被外部使用，例如，通过提取、转换、加载（ETL）作业；或由 AWS DMS 使用。当您将 `rds.logical_replication` 参数值设置为 1 时，AWS DMS 会设置 `wal_level`、`max_wal_senders`、`max_replication_slots` 和 `max_connections` 参数。如果存在逻辑复制槽，但复制槽保留的 WAL 文件没有使用者，您可能会看到事务日志磁盘使用量增加，而可用存储空间不断减少。有关解决此问题的更多信息和步骤，请参阅文章[如何确定是什么原因导致 Amazon RDS for PostgreSQL 上出现 “设备上没有剩余空间” 或 “” 错误](https://aws.amazon.com/premiumsupport/knowledge-center/diskfull-error-rds-postgresql/)？DiskFull 在 AWS Support 知识中心中。
+ 创建数据库快照后对源数据库实例所做的任何架构更改，都不会出现在目标数据库实例上。
+ 创建加密的数据库实例后，您无法更改该数据库实例使用的 KMS 密钥。请确保先确定您的 KMS 密钥要求，然后再创建加密的数据库实例。
+ 运行 AWS DMS 任务之前，您必须在目标数据库实例上禁用触发器和外键。任务完成后，您可将它们重新启用。

# 在启动时强制对 Amazon RDS 数据库执行自动标记
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch"></a>

*Susanne Kangnoh 和 Archit Mathur，Amazon Web Services*

## Summary
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch-summary"></a>

Amazon Relational Database Service (Amazon RDS) 是一项 Web 服务，让用户能够在 Amazon Web Services (AWS) 云中更轻松地设置、操作和扩展关系数据库。它为行业标准的关系数据库提供了经济高效、可调整大小的容量，并管理常见的数据库管理任务。

您可使用标签按不同方式对 AWS 资源进行分类。当您的账户中有许多资源并且您希望根据标签快速识别特定资源时，关系数据库标记非常有用。您可使用 Amazon RDS 标签向您的 RDS 数据库实例添加自定义元数据。每个标签都由用户定义的键和值组成。我们建议您创建一组一致的标签以满足您的组织要求。

此模式提供了一个 AWS CloudFormation 模板来帮助您监控和标记 RDS 数据库实例。该模板创建了一个监视 AWS C CloudTrail **re** ate CloudWatch 事件的 Amazon Event DBInstance s 事件。 （将 Amazon RDS 的 API 调用CloudTrail 捕获为事件。） 当它检测到该事件时，它会调用 AWS Lambda 函数，该函数会自动应用您定义的标签键和值。该模板还使用 Amazon Simple Notiﬁcation Service (Amazon SNS) 发出实例已被标记的通知。

## 先决条件和限制
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch-prerequisites-and-limitations"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account。
+ 用于上传 Lambda 代码的 Amazon Simple Storage Service （Amazon S3）存储桶。
+ 您希望接收标记通知的电子邮件地址。

**限制**
+ 该解决方案支持 CloudTrail **创建DBInstance**事件。它不会为任何其他事件创建通知。

## 架构
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch-architecture"></a>

**工作流程架构**

![\[Workflow diagram showing AWS 服务 interaction for RDS instance creation and notification.\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/5541bc1e-e00f-4b5a-94b7-bb1808b5591a/images/ec0bcf92-f986-4af3-bfe7-d2c5e04051c5.png)


 

**自动化和扩缩**
+ 您可以针对不同的 AWS 区域和账户多次使用 AWS CloudFormation 模板。您只需在每个区域或账户中运行该模板一次。

## 工具
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch-tools"></a>

**AWS 服务**
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) — AWS CloudTrail 是一项 AWS 服务，可帮助您对 AWS 账户进行治理、合规以及运营和风险审计。用户、角色或 AWS 服务采取的操作在中记录为事件 CloudTrail。 
+ [Amazon CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) Events — Amazon CloudWatch Events 提供近乎实时的系统事件流，这些事件描述了 AWS 资源的变化。 CloudWatch 通过发送消息以响应环境、激活功能、进行更改和捕获状态信息，事件会在操作变化发生时意识到这些变化，并在必要时采取纠正措施。 
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda 是一项计算服务，使您无需预置或管理服务器即可运行代码。只有在需要时 Lambda 才运行您的代码，并且能自动扩缩，从每天几个请求扩展到每秒数千个请求。您只需为消耗的计算时间付费 - 代码未运行时不产生费用。
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是一项高度可扩展的对象存储服务，可用于各种存储解决方案，包括网站、移动应用程序、备份和数据湖。
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notiﬁcation Service (Amazon SNS) 是一项 Web 服务，可让应用程序、终端用户和设备即时发送和接收来自云端的通知。 

**代码**

此模式包括一个包含两个文件的附件：
+ `index.zip` 是压缩文件，其中包含此模式的 Lambda 代码。
+ `rds.yaml`是部署 Lambda 代码的 CloudFormation 模板。

有关如何使用这些文件的信息，请参阅*操作说明*部分。

## 操作说明
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch-epics"></a>

### 部署 Lambda 代码
<a name="deploy-the-lambda-code"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将代码上传到 S3 存储桶。 | 创建新的 S3 存储桶或使用现有 S3 存储桶上传附加的 `index.zip` 文件（Lambda 代码）。此存储桶必须与要监控的资源 (RDS 数据库实例) 位于同一 AWS 区域中。 | 云架构师 | 
| 部署 CloudFormation 模板。 | 在与 S3 存储桶相同的 AWS 区域中打开 Cloudformation 控制台，然后部署附件中提供的 `rds.yaml` 文件。在下一个操作说明中，提供模板参数的值。 | 云架构师 | 

### 填写 CloudFormation 模板中的参数
<a name="complete-the-parameters-in-the-cloudformation-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 提供 S3 存储桶名称。 | 输入您在第一篇操作说明中创建或选择的 S3 存储桶的名称。此 S3 存储桶包含 Lambda 代码的.zip 文件，并且必须与模板和要监控的 RDS 数据库实例位于相同的 AWS 区域。 CloudFormation  | 云架构师 | 
| 提供 S3 密钥。 | 提供 Lambda 代码 .zip 文件在 S3 存储桶中的位置，不带前导斜杠（例如，`index.zip` 或 `controls/index.zip`）。 | 云架构师 | 
| 提供电子邮箱地址。 | 提供要接收违规通知的活动电子邮件地址。 | 云架构师 | 
| 指定日志记录级别。 | 指定日志级别和详细程度。`Info` 指定有关应用程序进度的详细信息消息，应仅用于调试。`Error` 指定仍允许应用程序继续运行的错误事件。`Warning` 表示潜在的有害情况。 | 云架构师 | 
| 输入 RDS 数据库实例的标签键和值。 | 输入您想要自动应用于 RDS 实例的所需标签键和值。有关更多信息，请参阅 AWS 文档中的[为 Amazon RDS 资源添加标签](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_Tagging.html)。 | 云架构师 | 

### 确认订阅
<a name="confirm-the-subscription"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确认电子邮件订阅。 | 成功部署 CloudFormation 模板后，它会向您提供的电子邮件地址发送订阅电子邮件。要在标记实例时接收通知，您必须确认此电子邮件订阅。 | 云架构师 | 

## 相关资源
<a name="enforce-automatic-tagging-of-amazon-rds-databases-at-launch-related-resources"></a>
+ [创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)（Amazon S3 文档）
+ [为 Amazon RDS 资源添加标签](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_Tagging.html)（Amazon Aurora 文档）
+ [上传对象](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html)（Amazon S3 文档）
+ 使用 [AWS 创建在 AWS API 调用时触发 CloudWatch 的事件规则 CloudTrail](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-CloudTrail-Rule.html)（亚马逊 CloudWatch 文档）

## 附件
<a name="attachments-5541bc1e-e00f-4b5a-94b7-bb1808b5591a"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/5541bc1e-e00f-4b5a-94b7-bb1808b5591a/attachments/attachment.zip)

# 估算按需容量的 DynamoDB 表成本
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity"></a>

*Moinul Al-Mamun，Amazon Web Services*

## Summary
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-summary"></a>

[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) 是 NoSQL 事务数据库，即使在 PB 级规模下，也能提供个位数毫秒的延迟。此款 Amazon Web Services (AWS) 无服务器产品因其稳定的性能和可扩展性而越来越受欢迎。 您无需配置基础设施。您的单个表最多可以扩展至 PB 级。

在按需容量模式下，您按请求为应用程序在表上执行的数据读取和写入付费。AWS 的费用基于一个月内累积的读取请求单位 (RRUsWRUs) 和写入请求单位 ()。DynamoDB 会在整个月中持续监控您的表大小，确定您的存储费用。它支持使用 point-in-time-recovery (PITR) 进行连续备份。DynamoDB 会在整个月中持续监控您的启用 PITR 的表大小，确定您的备份费用。

要估算项目的 DynamoDB 成本，计算在产品生命周期的不同阶段将消耗多少 RRU、WRU 和存储非常重要。要进行粗略的成本估算，您可以使用 [AWS](https://calculator.aws/#/createCalculator/DynamoDB) Pricing Calculator RRUs，但您必须提供表的大致数量 WRUs、和存储要求。这些在项目开始时可能很难估计。AWS Pricing Calculator 不考虑数据增长率或项目大小，也不会分别考虑基表和全局二级索引 (GSIs) 的读取和写入次数。要使用 AWS 定价计算器，您必须估算所有这些方面，以假设 WRU、RRU 和存储大小的大致数字，以获得成本估算。

此模式提供了一种机制和可重复使用的 Microsoft Excel 模板来估算按需容量模式的基本 DynamoDB 成本因素，例如写入、读取、存储、备份和恢复成本。它比 AWS 定价计算器更精细，它会独立考虑基表和 GSIs 需求。它还考虑了每月项目数据的增长率，并预测了三年的成本。

## 先决条件和限制
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-prereqs"></a>

**先决条件**
+ DynamoDB 和 DynamoDB 数据模型设计基础知识
+ [DynamoDB 定价、WRU、RRU、存储以及备份和恢复的基础知识（有关更多信息，请参阅按需容量定价](https://aws.amazon.com/dynamodb/pricing/on-demand/)）
+ 了解 DynamoDB 中的数据、数据模型以及项目大小
+ DynamoDB 知识 GSIs

**限制**
+ 该模板为您提供近似计算，但并非适用于所有配置。要获得更准确的估算值，您必须测量基表中每件商品的单个商品尺寸，然后 GSIs。
+ 为了进行更准确的估计，您必须考虑平均每月每个项目的预期写入（插入、更新和删除）和读取次数。
+ 此模式仅支持根据固定的数据增长假设估算未来几年的写入、读取、存储以及备份和恢复成本。

## 工具
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-tools"></a>

**Amazon Web Services**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。

**其他工具**
+ [AWS 定价计算器](https://calculator.aws/#/createCalculator/DynamoDB)是一款基于 Web 的规划工具，您可用来针对您的 AWS 用例创建估算值。

## 最佳实践
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-best-practices"></a>

为了帮助降低成本，请考虑以下 DynamoDB 设计最佳实践。
+ [分区键设计](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html) - 使用高基数分区键均匀分配负载。
+ [邻接列表设计模式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html) — 使用此设计模式进行 one-to-many管理和 many-to-many关系。
+ [稀疏索引](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-general-sparse-indexes.html) — 为你使用稀疏索引。 GSIs创建 GSI 时，您可以指定分区键和排序键（可选）。只有基表中包含相应 GSI 分区键的项目才会显示在稀疏索引中。这有助于保持 GSIs 体积更小。
+ [索引过载](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-gsi-overloading.html) - 使用相同的 GSI 为各种类型的项目编制索引。
+ [GSI 写入分片](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-gsi-sharding.html) - 明智地分片，将数据分布到各个分区，以实现更高效、更快速的查询。
+ [大项目](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-use-s3-too.html) - 仅在表中存储元数据，将 blob 保存在 Amazon S3 中，将引用保留在 DynamoDB 中。将大项目分成多个项目，并使用排序键有效地编制索引。

有关更多设计最佳实践，请参阅 Amazon DynamoDB [Developer Guide](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices.html)。

## 操作说明
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-epics"></a>

### 从 DynamoDB 数据模型提取项目信息
<a name="extract-item-information-from-your-dynamodb-data-model"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 获取项目大小。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.html) | 数据工程师 | 
| 估算写入成本。 | 要估算按需容量模式下的写入成本，首先必须测量一个月内 WRUs 将消耗多少容量。为此，您要考虑以下因素：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.html)有关更多信息，请参阅*其他信息*部分。 | 数据工程师 | 
| 估算读取成本。 | 要估算按需模式下的读取成本，首先必须衡量一个月内 RRUs 将消耗多少费用。为此，您要考虑以下因素： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.html) | 数据工程师、应用程序开发人员 | 
| 估算存储大小和成本。 | 首先，根据表中的项目大小估算平均每月存储要求。然后，通过将存储大小乘以您的 AWS 区域的每 GB 存储价格来计算存储成本。 如果您已输入数据来估计写入成本，则无需再次输入数据来计算存储大小。否则，要估计存储大小，您需要考虑以下因素： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.html) | 数据工程师 | 

### 在 Excel 模板中输入项目与对象信息
<a name="enter-the-item-and-object-information-in-the-excel-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 从“附件”部分下载 Excel 模板，并针对您的用例表进行调整。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.html) | 数据工程师 | 
| 在 Excel 模板输入信息。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity.html)在模板中，存在三个项目或实体：信息、元数据和关系。有两个 GSIs。对于您的用例，如果您需要更多项目，则请创建新行。如果您需要更多 GSIs，请复制现有的 GSI 块，然后粘贴以创建所需数量的 GSI 块。然后调整 SUM 和 TOTAL 列的计算。 | 数据工程师 | 

## 相关资源
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-resources"></a>

**参考**
+ [按需容量的 Amazon DynamoDB 定价](https://aws.amazon.com/dynamodb/pricing/on-demand/)
+ [适用于 DynamoDB 的 AWS 定价计算器](https://calculator.aws/#/createCalculator/DynamoDB)
+ [使用 DynamoDB 进行设计和架构的最佳实践](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices.html)
+ [DynamoDB 入门](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStartedDynamoDB.html)

**指南和模式**
+ [使用 Amazon DynamoDB 对数据建模](https://docs.aws.amazon.com/prescriptive-guidance/latest/dynamodb-data-modeling/)
+ [估算 Amazon DynamoDB 表的存储成本](https://apg-library.amazonaws.com/content/9b74399d-9655-47ee-b9b3-de46b65bc4e3)

## 附加信息
<a name="estimate-the-cost-of-a-dynamodb-table-for-on-demand-capacity-additional"></a>

**写成本计算示例**

DynamoDB 数据模型设计显示了一个产品的三个项目，平均项目大小为 4 KB。当您将新产品添加到 DynamoDB 基表时，它会消耗项目数量 \$1（项目大小/1 KB 写入单位）= 3 \$1 (4/1) = 12 WRU。在此示例中，每写入 1 KB 时，产品消耗 1 WRU。 

**读取成本计算示例**

要获得 RRU 估算值，请考虑每个项目在一个月内被读取的平均次数。例如，信息项平均每月被读取 10 次，元数据项平均被读取 2 次，关系项平均被读取 5 次。在示例模板中，所有组件的总 RRU = 每月创建的新组件数量 \$1 每个组件每月的 RRU = 1000 万 \$1 17 RRU = 每月 1.7 亿 RRU = 每月 1.7 亿 RRU。

每个月都会添加新的东西（组件或产品），并且产品总数将随着时间的推移而增长。因此，RRU 要求也会随时间的推移而增长。
+ 第一个月的 RRU，消费量将为 1.7亿。
+ 第二个月的 RRU 消耗量将为 2\$11.7 亿=3.4 亿。
+ 第三个月的RRU消耗量将为 3\$11.7 亿=5.1 亿。

下图显示了每月 RRU 消耗量与成本预测。

![\[RRU 消耗量的增长幅度明显大于成本的增长幅度。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/1797b48f-a183-4f25-811f-44921c3a48ee/images/3505bfc8-694d-4acc-8585-cd71258fa315.png)


请注意：图表中的价格仅供说明之用。要为您的使用案例创建准确的预测，请检查 AWS 定价页面，并在 Excel 工作表中使用这些价格。

**存储、备份以及恢复成本计算示例**

DynamoDB 存储、备份和恢复都是相互连接的。备份与存储直接相关，恢复与备份大小直接相关。随着表大小的增加，相应的存储、备份和恢复成本也会成比例增加。

*存储大小和成本*

根据您的数据增长率，存储成本将随着时间的推移而增加。例如，假设基表中组件或产品的平均大小 GSIs 为 11 KB，并且每月将向数据库表中添加 1000 万个新产品。在这种情况下，DynamoDB 表大小将增长 (11 KB \$1 1000 万) /1024/1024 = 每月 105 GB。在第一个月，您的表存储大小将为 105 GB，第二个月将为 105 \$1 105 = 210 GBs，依此类推。
+ 对于您的 AWS 区域，第一个月存储成本将为每 GB 105 GB \$1 的存储价格。 
+ 第二个月的存储成本将为您所在地区每 GB 210 GB \$1 存储价格。
+ 第三个月，您所在地区存储成本将为每 GB 315 GB \$1 的存储价格。

有关未来三年的存储大小和成本，请参阅*存储大小和预测*部分。

*备份成本*

根据您的数据增长率，备份成本将随着时间的推移而增加。使用 point-in-time-recovery (PITR) 开启连续备份时，持续备份费用基于每月平均存储 GB。在一个日历月中，平均备份大小将与表存储大小相同，尽管实际大小可能略有不同。因每个月都会添加新产品，因此总存储大小和备份大小将随着时间的推移而增长。例如，在第一个月，105 GB 的平均备份大小可能会在第二个月增长至 210 GB。
+ 对于您的 AWS 区域，第一个月的备份费用将为每 GB 105 GB \$1 连续备份价格。 
+ 第二个月的备份费用将为您所在地区的每月 210 GB\$1每 GB 的连续备份价格。
+ 第三个月的备份成本将为每月 315 GB \$1 您所在区域的每 GB 连续备份价格。
+ 等等

备份成本包含在*存储大小和成本预测*部分的图表中。

*恢复成本*

当您在启用 PITR 的情况下进行连续备份时，恢复操作费用将根据恢复的大小而定。每次还原时，您都要根据恢复的数据量 (GB) 付费。如果您的表很大，并且一个月内执行多次恢复，那么成本会很高。

为了估算恢复成本，此示例假设您每月在月底执行一次 PITR 恢复。该示例使用每月平均备份大小作为该月的恢复数据大小。第一个月的平均备份大小为 105 GB，月底恢复时，恢复数据大小为 105 GB。第二个月将是 210 GBs，依此类推。

根据您的数据增长率，恢复成本将随着时间的推移而增加。
+ 对于您的 AWS 区域，第一个月的恢复成本为每 GB 105 GB \$1 的恢复价格。 
+ 第二个月，恢复成本将为 210 GB \$1 您所在区域的每 GB 恢复价格。
+ 第三个月，恢复成本将为 315 GB \$1 您所在区域的每 GB 恢复价格。

有关详细信息，请参阅 Excel 模板中的存储、备份和恢复选项卡以及下一节中的图表。

*存储大小和成本预测*

在模板中，实际计费存储大小是通过减去标准表类每月 25 GB 的免费套餐来计算的。在该表中，您将获得一个分为每月值的预测图表。

以下示例图表预测了未来 36 个日历月的每月存储大小（以 GB 为单位）、计费存储成本、按需备份成本和恢复成本。所有费用以美元表示。从图中可以清楚地看出，存储、备份和恢复成本随着存储大小的增加而成比例增加。

![\[存储大小增加到三千以上，而成本却不到一千。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/1797b48f-a183-4f25-811f-44921c3a48ee/images/fd9f06d0-bc9c-4b4e-8cbd-3e527fe09e88.png)


请注意，图表中所用的价格仅用于说明目的。要为您的用例创建准确的价格，请查看 AWS 定价页面，然后在 Excel 模板使用这些价格。

## 附件
<a name="attachments-1797b48f-a183-4f25-811f-44921c3a48ee"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/1797b48f-a183-4f25-811f-44921c3a48ee/attachments/attachment.zip)

# 估算 Amazon DynamoDB 表的存储成本
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table"></a>

*Moinul Al-Mamun，Amazon Web Services*

## Summary
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table-summary"></a>

Amazon DynamoDB 是 NoSQL 事务数据库，即使在 PB 级规模下，也能提供个位数毫秒的延迟。这款广受欢迎的无服务器产品可 AWS 提供稳定的性能和可扩展性。您无需预调配存储，并且您的单个表最多可以扩展至 PB 级。 

DynamoDB 会在整个月中持续监控您的表的大小，以确定您的存储费用。 AWS 然后按平均存储容量（以 GB 为单位）向您收费。您的桌面随着时间的推移而增长的越多，您的存储成本就会增长的越多。[要计算存储成本，你可以使用AWS Pricing Calculator，但你需要提供表的大致大小，包括全局二级索引 (GSIs)，这在项目开始时很难估计。](https://calculator.aws/#/createCalculator/DynamoDB)此外， AWS 定价计算器不考虑数据增长率。

这种模式提供了一种机制和可重复使用的 Microsoft Excel 模板，以计算 DynamoDB 存储大小和成本。它考虑了基表和 GSIs 独立表的存储需求。它通过考虑各个项目的大小和数据增长率随时间而计算存储尺寸。 

要获取估计值，请将两个信息插入模板：
+ 基表的单个项目大小（以千字节为单位）和 GSIs
+ 平均一个月内可以向表格中添加的新对象或产品数量（例如，1000 万个）

该模板会生成未来三年的存储和成本预测图，如以下示例所示。

![\[成本的下部线缓慢上升，较高的存储线更快地向上移动。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/9b74399d-9655-47ee-b9b3-de46b65bc4e3/images/c0436252-cc42-4ea3-ac50-c0455aece39d.png)


 

## 先决条件和限制
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table-prereqs"></a>

**先决条件**
+ DynamoDB（包括 DynamoDB 存储和定价）的基本知识
+ 了解 DynamoDB 中的数据、数据模型以及项目大小
+ DynamoDB 全局二级索引知识 () GSIs

**限制**
+ 该模板为您提供近似计算，但并非适用于所有配置。要获得更准确的估算值，您必须测量基表中每件商品的单个商品尺寸，然后 GSIs。 
+ 该模式支持仅根据固定数据增长假设来估算未来几年的存储尺寸和成本。

## 工具
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table-tools"></a>

**Amazon Web Services**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。

**其他工具**
+ AWS P@@ [ric](https://docs.aws.amazon.com/pricing-calculator/latest/userguide/what-is-pricing-calculator.html) ing Calculator 是一款基于 Web 的规划工具，可用于为 AWS 用例创建估算值。

## 操作说明
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table-epics"></a>

### 从 DynamoDB 数据模型提取项目信息
<a name="extract-item-information-from-your-ddb-data-model"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 获取项目大小。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-storage-costs-for-an-amazon-dynamodb-table.html) | 数据工程师 | 
| 获取一个月内添加的对象数量。 | 估计一个月内平均将有多少组件或对象添加至 DynamoDB 表中。 | 数据工程师 | 

### 在 Excel 模板中输入项目与对象信息
<a name="enter-the-item-and-object-information-in-the-excel-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 下载并调整 Excel 电子表格。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-storage-costs-for-an-amazon-dynamodb-table.html) | 数据工程师 | 
| 在 Excel 模板输入信息。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-storage-costs-for-an-amazon-dynamodb-table.html) | 数据工程师 | 

## 相关资源
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table-resources"></a>
+ 适用于 Amazon DynamoDB 的[按需容量定价](https://aws.amazon.com/dynamodb/pricing/on-demand/)
+ [AWS DynamoDB 定价计算器](https://calculator.aws/#/createCalculator/DynamoDB)

## 附加信息
<a name="estimate-storage-costs-for-an-amazon-dynamodb-table-additional"></a>

请注意，随附的模板预测仅存储大小和标准存储表类的成本。根据对存储成本的预测，并考虑单个项目的规模和产品或对象增长率，您可以估计以下内容：
+ 数据导出成本
+ 备份和恢复成本
+ 数据存储要求。

**Amazon DynamoDB 数据存储成本**

DynamoDB 会持续监控您的表的大小，以确定您的存储费用。DynamoDB 通过将数据的原始字节大小加上数据的原始字节大小加上按项目的存储开销（这取决于您启用的功能）来衡量计费数据的大小。有关更多信息，请参阅 [DynamoDB 开发人员指南](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/CapacityUnitCalculations.html)。 

数据存储的价格取决于您的表类。如果您使用 DynamoDB 标准表类，则每月存储的前 25 GB 是免费的。有关不同标准和不频繁访问表类别的存储成本的更多信息 AWS 区域，请参阅按需容量[定价](https://aws.amazon.com/dynamodb/pricing/on-demand/)。

## 附件
<a name="attachments-9b74399d-9655-47ee-b9b3-de46b65bc4e3"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/9b74399d-9655-47ee-b9b3-de46b65bc4e3/attachments/attachment.zip)

# 使用 AWR 报告估计 Oracle 数据库的 Amazon RDS 引擎大小
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports"></a>

*Abhishek Verma 和 Eduardo Valentim，Amazon Web Services*

## Summary
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-summary"></a>

在将 Oracle 数据库迁移到亚马逊关系数据库服务 (Amazon RDS) 或 Amazon Aurora 时，计算目标数据库的 CPU、内存和磁盘 I/O 是一项关键要求。您可以通过分析 Oracle Oracle Automatic Workload Repository (AWR) 报告来估计目标数据库所需容量。此模式说明了如何使用 AWR 报告估计这些值。

源 Oracle 数据库可以位于本地或托管在亚马逊弹性计算云 (Amazon EC2) 实例上，也可以是 Amazon RDS for Oracle 数据库实例。目标数据库可是任何 Amazon RDS 或 Aurora 数据库。

**注意**  
如果您的目标数据库引擎是 Oracle，则容量估计会更加精确。对于其他 Amazon RDS 数据库，由于数据库架构差异，引擎大小可能会有所不同。

我们建议您在迁移 Oracle 数据库前进行性能测试。

## 先决条件和限制
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-prereqs"></a>

**先决条件**
+ Oracle Database Enterprise Edition 许可证和 Oracle Diagnostics Pack 许可证，用于下载 AWR 报告。

**产品版本**
+ 版本 11g（版本 11.2.0.3.v1 及更高版本）和 12.2 以及 18c、19c 的所有 Oracle 数据库版本。
+ 这种模式不包括 Oracle Engineered Systems 或 Oracle Cloud Infrastructure (OCI)。

## 架构
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-architecture"></a>

**源技术堆栈**

下列情况之一：
+ 本地 Oracle 数据库
+  EC2 实例上的 Oracle 数据库
+ Amazon RDS for Oracle 数据库实例

**目标技术堆栈**
+ 任何 Amazon RDS 或 Amazon Aurora 数据库

**目标架构**

有关完整迁移过程的信息，请参阅[使用 AWS DMS 和 AWS SCT 将 Oracle 数据库迁移至 Aurora PostgreSQL](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-an-oracle-database-to-aurora-postgresql-using-aws-dms-and-aws-sct.html) 的模式。

**自动化和扩缩**

如果您有多个 Oracle 数据库要迁移并且想要使用其他性能指标，您可以按照博客文章[根据 Oracle 性能指标大规模调整 Amazon RDS 实例](https://aws.amazon.com/blogs/database/right-sizing-amazon-rds-instances-at-scale-based-on-oracle-performance-metrics/)中描述的步骤来自动化该过程。

## 工具
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-tools"></a>
+ [Oracle Automatic Workload Repository (AWR)](https://docs.oracle.com/en-us/iaas/performance-hub/doc/awr-report-ui.html)是一个内置在 Oracle 数据库中的存储库。它定期收集和存储系统活动和工作负载数据，然后由 Automatic Database Diagnostic Monitor (ADDM) 对其进行分析。AWR 定期拍摄系统性能数据的快照（默认情况下，每 60 分钟一次）并存储信息（默认情况下，最多 8 天）。 您可使用 AWR 视图和报告来分析这些数据。

## 最佳实践
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-best-practices"></a>
+ 若要计算目标数据库的资源要求，您可以使用单个 AWR 报告、多个 AWR 报告或动态 AWR 视图。我们建议您在高峰负载期间使用多个 AWR 报告估算处理这些峰值负载所需资源。此外，动态视图提供更多数据点，帮助您更准确地计算资源需求。 
+ 您应该仅估算计划迁移的数据库的 IOPS，而不是使用该磁盘的其他数据库和进程的 IOPS。
+ 要计算数据库 I/O 的使用量，请不要使用 AWR 报告的 “负载配置文件” 部分中的信息。改用 “ I/O 配置文件” 部分（如果有），或者跳至 “实例活动统计信息” 部分，查看物理读取和写入操作的总值。
+ 当您估计 CPU 利用率时，我们建议您使用数据库指标方法而不是操作系统 (OS) 统计信息，因为它仅基于数据库使用的 CPU。（操作系统统计信息还包含其他进程的 CPU 使用率。） 您还应查看 ADDM 报告中与 CPU 相关的建议，以提高迁移后的性能。
+ 在确定正确的实例类型时，请考虑特定实例大小的 I/O 吞吐量限制，即 Amazon Elastic Block Store (Amazon EBS) 吞吐量和网络吞吐量。
+ 迁移前运行性能测试，以验证引擎大小。

## 操作说明
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-epics"></a>

### 创建 AWR 报告
<a name="create-an-awr-report"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启用 AWR 报告。 | 若要启用该报告，请按照 [Oracle 文档](https://docs.oracle.com/en/database/oracle/oracle-database/18/tgdba/gathering-database-statistics.html#GUID-26D359FA-F809-4444-907C-B5AFECD9AE29)中的说明进行操作。 | 数据库管理员 | 
| 查看保留期。 | 若要查看 AWR 报告的保留期，请使用以下查询。<pre>SQL> SELECT snap_interval,retention FROM dba_hist_wr_control;</pre> | 数据库管理员 | 
| 生成快照。 | 如果 AWR 快照间隔的精细度不足以捕获峰值工作负载的峰值，您可以手动生成 AWR 报告。要生成手动 AWR 快照，请使用以下查询。<pre>SQL> EXEC dbms_workload_repository.create_snapshot;</pre> | 数据库管理员 | 
| 查看最近的快照。 | 要查看最近的 AWR 快照，请使用以下查询。<pre>SQL> SELECT snap_id, to_char(begin_interval_time,'dd/MON/yy hh24:mi') Begin_Interval,<br /> to_char(end_interval_time,'dd/MON/yy hh24:mi') End_Interval<br /> FROM dba_hist_snapshot<br /> ORDER BY 1;</pre> | 数据库管理员 | 

### 估计磁盘 I/O 需求
<a name="estimate-disk-i-o-requirements"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 选择方法。 | IOPS 是存储设备上每秒输入和输出操作的标准衡量标准，包括读取和写入操作。 如果您要将本地数据库迁移到 AWS，则需要确定数据库 I/O 使用的峰值磁盘。 您可以使用以下方法来估算目标数据库 I/O 的磁盘：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)以下步骤介绍了这四种方法。 | 数据库管理员 | 
| 选项 1：使用负载配置文件。 | 下表显示了 AWR 报告的负载配置文件部分的示例。要获得更准确的信息，我们建议您使用选项 2（I/O 配置文件）或选项 3（实例活动统计信息）来代替负载配置文件。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)根据这些信息，您可以按如下方式计算 IOPs 吞吐量：*IOPS = 读取 I/O 请求：\$1 写入 I/O 请求 = 3,586.8 \$1 574.7 = 4134.5**吞吐量 = 物理读取（块）\$1 物理写入（块）= 13,575.1 \$1 3,467.3 = 17,042.4*由于 Oracle 中的块大小为 8 KB，因此您可按如下方式计算总吞吐量：*以 MB 为单位的总吞吐量是 17042.4 \$1 8 \$1 1024/1024/1024 = 133.2 MB*请勿使用负载配置文件来估算实例大小。它不如实例活动统计数据或 I/O 配置文件那么精确。 | 数据库管理员 | 
| 选项 2：使用实例活动统计信息。 | 如果您使用的是 12c 之前的 Oracle 数据库，则可使用 AWR 报告的实例活动统计信息部分来估计 IOPS 和吞吐量。下表显示了本部分的示例。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)根据这些信息，您可按如下方式计算总 IOPS 和吞吐量：*IOPS 总数 = 3,610.28 \$1 757.11 = 4367**总计 Mbps = 114,482,426.26 \$1 36,165,631.84 = 150648058.1/ 1024/1024 = 143 Mbps* | 数据库管理员 | 
| 选项 3：使用 I/O 配置文件。 | 在 Oracle Database 12c 中，AWR 报告包括一个 “ I/O 配置文件” 部分，该部分在单个表中显示所有信息，并提供有关数据库性能的更准确的数据。下表显示了本部分的示例。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)该表提供了以下吞吐量和总 IOPS 值：*吞吐量 = 143 MBPS（从标有总计的第五行、第二列开始）**IOPS = 4,367.4(从标有总计的第一行、第二列开始)* | 数据库管理员 | 
| 选项 4：使用 AWR 视图。 | 您可使用 AWR 视图查看相同的 IOPS 和吞吐量信息。若要获取此信息，请使用以下查询： <pre>break on report<br /> compute sum of Value on report<br /> select METRIC_NAME,avg(AVERAGE) as "Value"<br /> from dba_hist_sysmetric_summary<br /> where METRIC_NAME in ('Physical Read Total IO Requests Per Sec','Physical Write Total IO Requests Per Sec')<br /> group by metric_name;</pre> | 数据库管理员 | 
|   | （每秒) | 每笔交易 | 每位高管 | 每次通话 | 
| --- |--- |--- |--- |--- |
| **数据库时间（秒）：** | 26.6 | 0.2 | 0.00 | 0.02 | 
| **数据库 CPU：** | 18.0 | 0.1 | 0.00 | 0.01 | 
| **后台 CPU：** | 0.2 | 0.0 | 0.00 | 0.00 | 
| **重做大小（字节）：** | 2,458,539.9 | 17,097.5 |   |   | 
| **逻辑读取（块）：** | 3,371,931.5 | 23,449.6 |   |   | 
| **块更改：** | 21,643.5 | 150.5 |   |   | 
| **物理读取（块）：** | 13,575.1 | 94.4 |   |   | 
| **物理写入（块）：** | 3,467.3 | 24.1 |   |   | 
| **读取 IO 请求：** | 3,586.8 | 24.9 |   |   | 
| **写入 IO 请求：** | 574.7 | 4.0 |   |   | 
| **读取 IO (MB)：** | 106.1 | 0.7 |   |   | 
| **写入 IO (MB)：** | 27.1 | 0.2 |   |   | 
| **IM 扫描行：** | 0.0 | 0.0 |   |   | 
| **会话逻辑读取 IM：** |   |   |   |   | 
| **用户调用：** | 1,245.7 | 8.7 |   |   | 
| **解析 (SQL)：** | 4,626.2 | 32.2 |   |   | 
| **硬解析 (SQL)：** | 8.9 | 0.1 |   |   | 
| **SQL 工作区 (MB)：** | 824.9 | 5.7 |   |   | 
| **登录：** | 1.7 | 0.0 |   |   | 
| **执行次数 (SQL)：** | 136,656.5 | 950.4 |   |   | 
| **回滚：** | 22.9 | 0.2 |   |   | 
| **事务：** | 143.8 |   |   |   | 
| Statistic | Total | （每秒) | 每次传输 | 
| --- |--- |--- |--- |
| **物理读取总数 IO 请求数** | 2,547,333,217 | 3,610.28 | 25.11 | 
| **物理读取总字节数** | 80,776,296,124,928 | 114,482,426.26 | 796,149.98 | 
| **物理写入总量 IO 请求数** | 534,198,208 | 757.11 | 5.27 | 
| **物理写入总字节数** | 25,517,678,849,024 | 36,165,631.84 | 251,508.18 | 
|   | 每秒读取\$1写入次数 | 每秒读取次数 | 每秒写入次数 | 
| --- |--- |--- |--- |
| **请求总数：** | 4,367.4 | 3,610.3 | 757.1 | 
| **数据库请求：** | 4,161.5 | 3,586.8 | 574.7 | 
| **优化的请求：** | 0.0 | 0.0 | 0.0 | 
| **重做请求：** | 179.3 | 2.8 | 176.6 | 
| **总计 (MB)：** | 143.7 | 109.2 | 34.5 | 
| **数据库 (MB)：** | 133.1 | 106.1 | 27.1 | 
| **优化总数 (MB)：** | 0.0 | 0.0 | 0.0 | 
| **重做 (MB)：** | 7.6 | 2.7 | 4.9 | 
| **数据库（块）：** | 17,042.4 | 13,575.1 | 3,467.3 | 
| **通过缓冲区缓存（块）：** | 5,898.5 | 5,360.9 | 537.6 | 
| **直连（块）：** | 11,143.9 | 8,214.2 | 2,929.7 | 

### 估计 CPU 需求
<a name="estimate-cpu-requirements"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 选择方法。 | 您可通过三种方式估算目标数据库所需 CPU：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)如果您要查看已使用的内核数，我们建议您使用数据库指标方法而不是操作系统统计信息，因为它仅基于您计划迁移的数据库使用的 CPU。（操作系统统计信息还包含其他进程的 CPU 使用率。） 您还应查看 ADDM 报告中与 CPU 相关的建议，以提高迁移后的性能。您还可根据 CPU 生成估算需求。如果您使用不同的 CPU 代，则可以按照白皮书《揭开 [v CPUs 数的神秘面纱](https://d1.awsstatic.com/whitepapers/Demystifying_vCPUs.df200b766578b75009ad8d15c72e493d6408c68a.pdf)，实现最佳工作负载性能》中的说明来估算目标数据库所需的 CPU。 | 数据库管理员 | 
| 选项 1：根据可用内核估算需求。 | 在 AWR 报告：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)您可通过两种方式估算可用内核：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)**使用操作系统命令估算可用内核**使用以下命令计算处理器内核。<pre>$ cat /proc/cpuinfo |grep "cpu cores"|uniq<br />cpu cores    : 4<br />cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l </pre>使用以下命令计算处理器插槽数量。<pre>grep "physical id" /proc/cpuinfo | sort -u<br />  physical id     : 0<br />  physical id     : 1</pre>  我们不建议使用 **nmon**和 **sar** 等操作系统命令提取 CPU 利用率。原因是这些计算包括其他进程的 CPU 使用率，可能无法反映数据库使用的实际 CPU。**通过 AWR 报告估算可用内核**您也可从 AWR 报告的第一部分得出 CPU 使用率。报告摘录如下。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)在此示例中， CPUs 计数为 80，这表示它们是逻辑的（虚拟） CPUs。您还可以看到，此配置有两个插槽，每个插槽上有一个物理处理器（总共两个物理处理器），每个物理处理器或插槽有 40 个内核。  | 数据库管理员 | 
| 选项 2：使用操作系统统计信息估计 CPU 使用率。 | 您可以直接在操作系统中查看操作系统 CPU 使用率统计信息（使用 **sar** 或其他主机操作系统实用程序），也可以通过查看 AWR 报告的操作系统统计信息部分中的 IDLE/(IDLE\$1BUSY) 值来查看操作系统 CPU 使用率统计信息。您可以直接从 **v\$1osstat** 中查看消耗的 CPU 秒数。AWR 和 Statspack 报告还在操作系统统计信息部分显示了这些数据。如果同一个框上有多个数据库，则它们对于 BUSY\$1TIME 都有相同的 **v\$1osstat** 值。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)如果系统中没有其他主要的 CPU 使用者，请使用以下公式计算 CPU 利用率的百分比：*利用率 = 忙碌时间/总时间**繁忙时间 = 需求 = v\$1osstat.BUSY\$1TIME**C = 总时间（忙碌 \$1 空闲）**C = 容量 = v\$1ostat.BUSY\$1TIME \$1 v\$1ostat.IDLE\$1TIME**利用率 = BUSY\$1TIME/(BUSY\$1TIME \$1 IDLE\$1TIME)**= -1,305,569,937/(1,305,569,937 \$1 4,312,718,839)**= 23% 利用率* | 数据库管理员 | 
| 选项 3：使用数据库指标估算 CPU 利用率。 | 如果系统中运行多个数据库，您可以使用报告开头显示的数据库指标。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)要获取 CPU 利用率的指标，请使用以下公式：*数据库 CPU 使用率（可用的 CPU 能耗百分比） = CPU 时间/NUM\$1CPUS /已用时间*其中，CPU 使用率由 *CPU 时间*描述，表示在 CPU 上花费的时间，而非等待 CPU 的时间。此计算结果为：*= 312,625.40/11,759.64/80 = 33% 使用中 CPU**内核数量 (33%) \$1 80 = 26.4 个内核**内核总数 = 26.4 \$1 (120%) = 31.68 个内核*您可使用这两个值中的较大值来计算 Amazon RDS 或 Aurora 数据库实例的 CPU 使用率。在 IBM AIX，计算出的利用率与操作系统或数据库中的值不匹配。这些值在其他操作系统确实匹配。 | 数据库管理员 | 
| 数据库名称 | 数据库 ID | 实例 | 实例数 | 开始时间 | 发布版本 | RAC | 
| --- |--- |--- |--- |--- |--- |--- |
| XXXX | <DB\$1ID> | XXXX | 1 | 05-Sep-20 23：09 | 12.1.0.2.0 | 否 | 
| **主机名称** | **平台** | **CPUs** | **内核** | **套接字** | **内存 (GB)** | 
| <host\$1name> | Linux x86 64 位 | 80 | 80 | 2 | 441.78 | 
| Statistic | 值 | 终止值 | 
| --- |--- |--- |
| **FREE\$1MEMORY\$1BYTES** | 6,810,677,248 | 12,280,799,232 | 
| **INACTIVE\$1MEMORY\$1BYTES** | 175,627,333,632 | 160,380,653,568 | 
| **SWAP\$1FREE\$1BYTES** | 17,145,614,336 | 17,145,872,384 | 
| **BUSY\$1TIME** | 1,305,569,937 |   | 
| **IDLE\$1TIME** | 4,312,718,839 |   | 
| **IOWAIT\$1TIME** | 53,417,174 |   | 
| **NICE\$1TIME** | 29,815 |   | 
| **SYS\$1TIME** | 148,567,570 |   | 
| **USER\$1TIME** | 1,146,918,783 |   | 
| **LOAD** | 25 | 29 | 
| **VM\$1IN\$1BYTES** | 593,920 |   | 
| **VM\$1OUT\$1BYTES** | 327,680 |   | 
| **PHYSICAL\$1MEMORY\$1BYTES** | 474,362,417,152 |   | 
| **NUM\$1CPUS** | 80 |   | 
| **NUM\$1CPU\$1CORES** | 80 |   | 
| **NUM\$1CPU\$1SOCKETS** | 2 |   | 
| **GLOBAL\$1RECEIVE\$1SIZE\$1MAX** | 4,194,304 |   | 
| **GLOBAL\$1SEND\$1SIZE\$1MAX** | 2,097,152 |   | 
| **TCP\$1RECEIVE\$1SIZE\$1DEFAULT** | 87,380 |   | 
| **TCP\$1RECEIVE\$1SIZE\$1MAX** | 6,291,456 |   | 
| **TCP\$1RECEIVE\$1SIZE\$1MIN** | 4,096 |   | 
| **TCP\$1SEND\$1SIZE\$1DEFAULT** | 16,384 |   | 
| **TCP\$1SEND\$1SIZE\$1MAX** | 4,194,304 |   | 
| **TCP\$1SEND\$1SIZE\$1MIN** | 4,096 |   | 
|   | 快照 ID | 快照时间 | 会话 | 光标/会话 | 
| --- |--- |--- |--- |--- |
| **开始快照：** | 184662 | 2020 年 9 月 28 日 09:00:42 | 1226 | 35.8 | 
| **结束快照：** | 185446 | 2020 年 10 月 06 日 13：00：20 | 1876 | 41.1 | 
| **用时：** |   | 11,759.64（分钟） |   |   | 
| **数据库时间：** |   | 312,625.40（分钟） |   |   | 

### 估算内存需求
<a name="estimate-memory-requirements"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 通过内存统计数据估算内存需求。 | 您可以使用 AWR 报告计算源数据库的内存并在目标数据库中进行匹配。您还应该检查现有数据库的性能并减少内存需求以节省成本，或增加内存需求以提高性能。这需要对 AWR 响应时间和应用程序的服务水平协议（SLA）进行详细分析。使用 Oracle 系统全局区域 (SGA) 和程序全局区域 (PGA) 使用率之和作为 Oracle 的估计内存利用率。为操作系统额外添加 20%，以确定目标内存大小要求。对于 Oracle RAC，使用所有 RAC 节点上的估计内存利用率的总和并减少总内存，因为它存储在公共块上。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)*使用中实例总内存 = SGA \$1 PGA = 220 GB \$1 45 GB = 265 GB*添加 20% 缓冲区：*实例总内存 = 1.2 \$1 265 GB = 318 GB*由于 SGA 和 PGA 占主机内存 70%，因此总内存需求为： *主机总内存 = 318/0.7 = 464 GB*当您迁移至 Amazon RDS for Oracle 时，PGA 和 SGA 是根据预定义的公式进行预先计算的。确保预先计算的值接近您的估值。 | 数据库管理员 | 
| 缓冲区 Nowait %： | 99.99 | 重做 NoWait %： | 100.00 | 
| --- |--- |--- |--- |
| **缓冲区命中率 %：** | 99.84 | **内存中排序 %：** | 100.00 | 
| **库命中 %：** | 748.77 | **软解析 %：** | 99.81 | 
| **执行到解析 %：** | 96.61 | **锁定命中 %：** | 100.00 | 
| **解析 CPU 到解析已用时间 %：** | 72.73 | **% 非解析 CPU：** | 99.21 | 
| **闪存缓存命中 %：** | 0.00 |   |   | 
|   | 开始 | 早于 | 
| --- |--- |--- |
| **主机内存 (MB)：** | 452,387.3 | 452,387.3 | 
| **SGA 使用量 (MB)：** | 220,544.0 | 220,544.0 | 
| **PGA 使用量 (MB)：** | 36,874.9 | 45,270.0 | 

### 确定目标数据库数据库实例类型
<a name="determine-the-db-instance-type-of-the-target-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 根据磁盘 I/O、CPU 和内存估计确定数据库实例类型。 | 根据前面步骤中的估算，目标 Amazon RDS 或 Aurora 数据库的容量应为：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.html)在目标 Amazon RDS 或 Aurora 数据库中，您可将这些值映射到 db.r5.16xlarge 实例类型，该实例类型的容量为 32 个内核、512 GB 的 RAM 和 13,600 Mbps 的吞吐量。有关更多信息，请参阅 AWS Blog 文章[基于 Oracle 性能指标大规模调整 Amazon RDS 实例大小](https://aws.amazon.com/blogs/database/right-sizing-amazon-rds-instances-at-scale-based-on-oracle-performance-metrics/)。 | 数据库管理员 | 

## 相关的资源
<a name="estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports-resources"></a>
+ [Aurora 数据库实例类](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html)（Amazon Aurora 文档）
+ [Amazon RDS 数据库实例存储](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html)（Amazon RDS 文档）
+ [AWS 矿工工具](https://github.com/tmuth/AWR-Miner/blob/master/release/5.0.8/AWR-Miner-capture-5.0.8/awr_miner.sql)（GitHub 存储库）

# 使用 AWS DMS 将 Amazon RDS for SQL Server 表导出至 S3 存储桶
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms"></a>

*Subhani Shaik，Amazon Web Services*

## Summary
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-summary"></a>

Amazon Relational Database Service (Amazon RDS) for SQL Server 不支持将数据加载到 Amazon Web Services (AWS) 云上的其他数据库引擎链接服务器上。相反，您可以使用 AWS Database Migration Service (AWS DMS) 将 Amazon RDS for SQL Server 表导出到 Amazon Simple Storage Service (Amazon S3) 存储桶，其中的数据可供其他数据库引擎使用。

AWS DMS 可帮助您快速安全地将数据库迁移到 AWS。源数据库可在迁移过程中保持全面运行，从而最大程度地为依赖该数据库的应用程序减少停机时间。AWS DMS 可以在最广泛使用的商用和开源数据库之间迁移数据。

此模式在配置 AWS DMS 端点时使用 AWS Secrets Manager。 服务可帮助您保护访问您的应用程序、服务和 IT 资源所需密钥。您可以使用 Secrets Manager 在数据库凭证、API 密钥和其他密钥的整个生命周期内对其进行轮换、管理和检索。用户和应用程序通过调用 Secrets Manager 来检索机密，从而减少对敏感信息进行硬编码的需要。Secrets Manager 使用 Amazon RDS、Amazon Redshift 和 Amazon DocumentDB 的内置集成提供密钥轮换。此外，该服务还可扩展到其他类型的机密，包括 API 密钥和 OAuth 令牌。Secrets Manager 使您能够使用精细权限控制对机密的访问，并集中审计 AWS Cloud、第三方服务和本地资源的密钥轮换。

## 先决条件和限制
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 一个 S3 存储桶
+ 虚拟私有云（VPC）
+ 数据库子网
+ Amazon RDS for SQL Server
+ 一个 AWS Identity and Acess Management (IAM) 角色，该角色具有代表 Amazon RDS 实例对 S3 存储桶的访问（列出、获取和放置对象）。
+ 用于存储 RDS 实例凭证的 Secrets Manager。

## 架构
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-architecture"></a>

**技术堆栈**
+ Amazon RDS for SQL Server
+ AWS DMS
+ Amazon S3
+ AWS Secrets Manager

**目标架构**

下图显示了借助 AWS DMS 将数据从 Amazon RDS 实例导入到 S3 存储桶的架构。

![\[描述如图所示。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/7ba5756d-44a5-4aa3-97b6-fa3684ae6ce6/images/90f918e1-3ec2-4434-82b8-3ff4ad340fb9.png)


1. 通过源端点连接到源 Amazon RDS 实例的 AWS DMS 迁移任务

1. 从源 Amazon RDS 实例复制数据

1. 通过目标端点连接到目标 S3 存储桶的 AWS DMS 迁移任务

1. 以逗号分隔值 (CSV) 格式将复制的数据导出至 S3 存储桶

## 工具
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-tools"></a>

**Amazon Web Services**
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到 Amazon Web Services Cloud，或者在云和本地设置的组合之间迁移。
+ [AWS Identity and Access Management (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展关系数据库。
+ [Amazon Simple Storage Service(Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 的 API 调用，以便以编程方式检索密钥。

**其他服务**
+ [Microsoft SQL Server Management Studio (SSMS)](https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16) 是一款用于管理 SQL Server 的工具，包括访问、配置和管理 SQL Server 组件。

## 操作说明
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-epics"></a>

### 配置 Amazon RDS for SQL Server 实例
<a name="configure-the-amazon-rds-for-sql-server-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Amazon RDS for SQL Server 实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 
| 设置实例的凭证。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 
| 配置实例类别、存储、自动扩缩以及可用性。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 
| 指定虚拟私有云（VPC）、子网组、公共访问和安全组。 | 根据需要选择 **VPC**、**数据库子网组**和 **VPC 安全组**创建 Amazon RDS 实例。遵循最佳实践，例如：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 
| 配置监控、备份和维护。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 

### 设置数据库和示例数据
<a name="set-up-the-database-and-example-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建表和加载示例数据。 | 在新数据库中创建一个表。使用*其他信息*部分中的示例代码将数据加载到表中。 | 数据库管理员、工程师 DevOps  | 

### 设置凭证
<a name="set-up-credentials"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建密钥。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html)此密钥将用于 AWS DMS 源端点。 | 数据库管理员、工程师 DevOps  | 

### 在数据库和 S3 存储桶间设置访问权限
<a name="set-up-access-between-the-database-and-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 IAM 角色以便访问 Amazon RDS | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 

### 创建 S3 存储桶
<a name="create-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 S3 存储桶。 | 要保存来自 Amazon RDS for SQL Server 的数据，请在控制台上选择 **S3**，然后选择**创建存储桶**。确保 S3 存储桶不可公开访问。 | 数据库管理员、工程师 DevOps  | 

### 在 AWS DMS 和 S3 存储桶间设置访问权限
<a name="set-up-access-between-aws-dms-and-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个用于访问 Athena 和 Amazon S3 的 IAM 角色 | 创建一个 IAM 角色，允许 AWS DMS 列出、获取与放置 S3 存储桶中的对象。 | 数据库管理员、工程师 DevOps  | 

### 配置 AWS DMS
<a name="configure-aws-dms"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为源创建 AWS DMS 端点。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 
| 为目标创建 AWS DMS 端点。 | 创建**目标端点**，选择 Amazon S3 作为**目标引擎**。提供您之前创建的 IAM 角色的 S3 存储桶名称和文件夹名称。 | 数据库管理员、工程师 DevOps  | 
| 创建 AWS DMS 复制实例。 | 在同一个 VPC、子网和安全组中，创建 AWS DMS 复制实例。有关数据库实例类选项的详细信息，请参阅 [AWS 文档](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Types.html#CHAP_ReplicationInstance.Types.Deciding)。 | 数据库管理员、工程师 DevOps  | 
| 启动 AWS DMS 迁移任务。 | 要将数据从 Amazon RDS for SQL Server 导出至 S3 存储桶，请创建数据库迁移任务。对于迁移类型，请选择**迁移现有数据**。选择您创建的 AWS DMS 端点和复制实例。 | 数据库管理员、工程师 DevOps  | 

### 将数据导出至 S3 存储桶
<a name="export-the-data-to-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 运行数据库迁移任务。 | 若要导出 SQL Server 表数据，请启动数据库迁移任务。该任务将以 CSV 格式将数据从 Amazon RDS for SQL Server 导出至 S3 存储桶。 | 数据库管理员、工程师 DevOps  | 

### 清理 资源
<a name="clean-up-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除资源。 | 为了避免产生额外费用，请使用控制台按以下顺序删除资源：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.html) | 数据库管理员、工程师 DevOps  | 

## 相关资源
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-resources"></a>
+ [AWS DMS](https://aws.amazon.com/dms/)
+ [Amazon S3](https://aws.amazon.com/s3/)
+ [Amazon RDS for SQL Server](https://aws.amazon.com/rds/sqlserver/)
+ [Amazon S3 集成](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/oracle-s3-integration.html)

## 附加信息
<a name="export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms-additional"></a>

若要创建数据库和表并加载示例数据，请使用以下代码。

```
--Step1: Database creation in RDS SQL Server
CREATE DATABASE [Test_DB]
 ON  PRIMARY
( NAME = N'Test_DB', FILENAME = N'D:\rdsdbdata\DATA\Test_DB.mdf' , SIZE = 5120KB , FILEGROWTH = 10%)
 LOG ON
( NAME = N'Test_DB_log', FILENAME = N'D:\rdsdbdata\DATA\Test_DB_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO

--Step2: Create Table
USE Test_DB
GO
Create Table Test_Table(ID int, Company Varchar(30), Location Varchar(20))

--Step3: Load sample data.
USE Test_DB
GO
Insert into Test_Table values(1,'AnyCompany','India')
Insert into Test_Table values(2,'AnyCompany','USA')
Insert into Test_Table values(3,'AnyCompany','UK')
Insert into Test_Table values(4,'AnyCompany','Hyderabad')
Insert into Test_Table values(5,'AnyCompany','Banglore')
```

# 在 Aurora PostgreSQL 中处理动态 SQL 语句中的匿名块
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql"></a>

*anuradha chintha，Amazon Web Services*

## Summary
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-summary"></a>

注意：亚马逊 Cloud Directory 不再向新客户开放。[要获取 Cloud Directory 的替代方案，请浏览[亚马逊 DynamoDB 和亚马逊](https://aws.amazon.com/dynamodb/) Neptune。](https://aws.amazon.com/neptune/)如果您需要帮助为自己的用例选择合适的替代方案，或有任何其他问题，请联系[AWS 支持](https://aws.amazon.com/support/)。

此模式向您展示了如何避免在处理动态 SQL 语句中的匿名块时出现的错误。当您使用 AWS Schema Conversion Tool 将 Oracle 数据库转换为 Aurora PostgreSQL-Compatible Edition 数据库时，您会收到一条错误消息。为避免错误，必须知道 `OUT` 绑定变量的值，但是要等到运行 SQL 语句之后才能知道 `OUT` 绑定变量的值。该错误是由于 AWS Schema Conversion Tool（AWS SCT）不理解动态 SQL 语句中的逻辑造成的。AWS SCT 无法在 PL/SQL 代码（即函数、过程和包）中转换动态 SQL 语句。

## 先决条件和限制
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-prereqs"></a>

**先决条件**
+ 有效的 Amazon Web Services account
+ [Aurora PostgreSQL 数据库（DB）实例](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.DBInstanceClass.html)
+ [Amazon Relational Database Service（Amazon RDS）for Oracle 数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)
+ [PostgreSQL 交互式终端 (psql)](https://www.postgresql.org/docs/current/app-psql.html)
+ [SQL \$1Plus](https://docs.oracle.com/cd/B14117_01/server.101/b12170/qstart.htm)
+ 目标数据库中的 `AWS_ORACLE_EXT` 架构（[AWS SCT 扩展包](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_ExtensionPack.html)的一部分）
+ 最新版本的 [AWS Schema Conversion Tool（AWS SCT）](https://aws.amazon.com/dms/schema-conversion-tool/)及其所需驱动程序

## 架构
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-architecture"></a>

**源技术堆栈**
+ 本地 Oracle 数据库 10g 及更高版本

**目标技术堆栈**
+ Amazon Aurora PostgreSQL
+ Amazon RDS for PostgreSQL
+ AWS Schema Conversion Tool (AWS SCT)

**迁移架构**

下图显示了如何使用 AWS SCT 和 Oracle `OUT` 绑定变量来扫描应用程序代码中是否存在嵌入式 SQL 语句，并将代码转换为 Aurora 数据库可以使用的兼容格式。

![\[使用 AWS SCT 和 Oracle OUT 绑定变量的架构图\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/ada89410-b866-4d39-af9c-021be6cc6ae5/images/7c004981-2ed0-4b67-989f-54d8691712ca.png)


下图显示了如下工作流：

1. 使用 Aurora PostgreSQL 作为目标数据库，为源数据库生成 AWS SCT 报告。

1. 识别动态 SQL 代码块中的匿名块（AWS SCT 对此提出了错误）。

1. 手动转换代码块并将代码部署到目标数据库上。

## 工具
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-tools"></a>

**Amazon Web Services**
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩展 PostgreSQL 部署。
+ [Amazon Relational Database Service (Amazon RDS) for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展 Oracle 关系数据库。
+ [AWS Schema Conversion Tool（AWS SCT）](https://aws.amazon.com/dms/schema-conversion-tool/)通过自动将源数据库架构和大部分数据库代码对象转换为与目标数据库兼容的格式，帮助您预测异构数据库迁移。

**其他工具**
+ [pgAdmin](https://www.pgadmin.org/) 允许您连接数据库服务器并与之交互。
+ [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) 是一个集成的开发环境，您可以使用它来开发和管理 Oracle 数据库中的数据库。您可以使用 [SQL \$1Plus](https://docs.oracle.com/cd/B19306_01/server.102/b14357/qstart.htm) 或 Oracle SQL Developer 来实现这种模式。

## 操作说明
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-epics"></a>

### 配置 Oracle 源数据库
<a name="configure-the-oracle-source-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在亚马逊 RDS 或亚马逊上创建 Oracle 实例 EC2。 | 要在 Amazon RDS 上创建 Oracle 数据库实例，请参阅 Amazon RDS 文档中的[创建 Oracle 数据库实例并连接到 Oracle 数据库实例上的数据库](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html)。要在亚马逊弹性计算云 (亚马逊 EC2) 上创建 Oracle 数据库实例，请参阅 AWS Prescriptive [ EC2 Guidence 文档中的亚马逊 For Oracle](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/ec2-oracle.html)。 | 数据库管理员 | 
| 创建用于迁移的数据库架构和对象。 | 您可以使用 Amazon Cloud Directory 创建数据库架构。有关更多信息，请参阅 Cloud Directory 文档中的[创建架构](https://docs.aws.amazon.com/clouddirectory/latest/developerguide/getting_started_create_schema.html)。 | 数据库管理员 | 
| 配置入站和出站安全组。 | 要创建和配置安全组，请参阅 Amazon RDS 文档中的[使用安全组控制访问权限](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Overview.RDSSecurityGroups.html)。 | 数据库管理员 | 
| 确认数据库正在运行。 | 要检查数据库的状态，请参阅 Amazon RDS 文档中的[查看 Amazon RDS 事件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ListEvents.html)。 | 数据库管理员 | 

### 配置 Aurora PostgreSQL 目标数据库
<a name="configure-the-target-aurora-postgresql-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 Amazon RDS 中创建 Aurora PostgreSQL 实例。 | 要创建 Aurora PostgreSQL 数据库实例，请参阅 Amazon RDS 文档中的[创建数据库集群并连接到 Aurora PostgreSQL 数据库集群上的数据库](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html)。 | 数据库管理员 | 
| 配置入站和出站安全组。 | 要创建和配置安全组，请参阅 Aurora 文档中的[通过创建安全组提供对 VPC 中数据库集群的访问](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/CHAP_SettingUp_Aurora.html#CHAP_SettingUp_Aurora.SecurityGroup)。 | 数据库管理员 | 
| 确认 Aurora PostgreSQL 数据库正在运行。 | 要检查数据库的状态，请参阅 Aurora 文档中的[查看 Amazon RDS 事件](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/USER_ListEvents.html)。 | 数据库管理员 | 

### 设置 AWS SCT
<a name="set-up-aws-sct"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 AWS SCT 连接到源数据库。 | 要将 AWS SCT 连接到源数据库，请参阅 AWS SCT 文档中的[作为源连接到 PostgreSQL](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.PostgreSQL.html#CHAP_Source.PostgreSQL.Connecting)。 | 数据库管理员 | 
| 将 AWS SCT 连接到目标数据库。 | 要将 AWS SCT 连接到目标数据库，请参阅 AWS Schema Conversion Tool 用户指南中的[什么是 AWS Schema Conversion Tool？](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)。 | 数据库管理员 | 
| 在 AWS SCT 中转换数据库架构，并将自动转换后的代码保存为 SQL 文件。 | 要保存 AWS SCT 转换后的文件，请参阅 AWS Schema Conversion Tool 用户指南中的[在 AWS SCT 中保存和应用转换后的架构](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Converting.html#CHAP_Converting.SaveAndApply)。 | 数据库管理员 | 

### 迁移代码
<a name="migrate-the-code"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 获取用于手动转换的 SQL 文件。 | 在 AWS SCT 转换后的文件中，提取需要手动转换的 SQL 文件。 | 数据库管理员 | 
| 更新脚本。 | 手动更新 SQL 文件。 | 数据库管理员 | 

## 相关资源
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-resources"></a>
+ [Amazon RDS](https://aws.amazon.com/rds/)
+ [Amazon Aurora 功能](https://aws.amazon.com/rds/aurora/postgresql-features/)

## 附加信息
<a name="handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql-additional"></a>

下面的示例代码显示了如何配置 Oracle 源数据库：

```
CREATE or replace PROCEDURE calc_stats_new1 (
  a NUMBER,
  b NUMBER,
  result out NUMBER)
IS
BEGIN
result:=a+b;
END;
/
```

```
set serveroutput on ;
 
DECLARE
  a NUMBER := 4;
  b NUMBER := 7;
  plsql_block VARCHAR2(100);
  output number;
BEGIN
  plsql_block := 'BEGIN calc_stats_new1(:a, :b,:output); END;';
  EXECUTE IMMEDIATE plsql_block USING a, b,out output;  
  DBMS_OUTPUT.PUT_LINE('output:'||output);
 
END;
```

下面的示例代码显示了如何配置 Aurora PostgreSQL 目标数据库：

```
 w integer,
 x integer)
RETURNS integer
AS
$BODY$
DECLARE
begin
return w + x ;
end;
$BODY$
LANGUAGE  plpgsql;
 
 
CREATE OR REPLACE FUNCTION test_pg.init()
RETURNS void
AS
$BODY$
BEGIN
if aws_oracle_ext.is_package_initialized
      ('test_pg' ) then
      return;
    end if;
    perform aws_oracle_ext.set_package_initialized
      ('test_pg' );
 
PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_output', NULL::INTEGER);
PERFORM aws_oracle_ext.set_package_variable('test_pg', 'v_status', NULL::text);
END;
$BODY$
LANGUAGE  plpgsql;
 

DO $$ 
declare
v_sql text;
v_output_loc int; 
a integer :=1;
b integer :=2;
BEGIN 
perform  test_pg.init();
--raise notice 'v_sql %',v_sql;
execute 'do $a$ declare v_output_l int; begin select * from test_pg.calc_stats_new1('||a||','||b||') into v_output_l;
PERFORM aws_oracle_ext.set_package_variable(''test_pg'', ''v_output'', v_output_l) ; end; $a$'  ; 
v_output_loc := aws_oracle_ext.get_package_variable('test_pg', 'v_output');
raise notice 'v_output_loc %',v_output_loc; 
END ; 
$$
```

# 帮助强制执行 DynamoDB 标签
<a name="help-enforce-dynamodb-tagging"></a>

*Mansi Suratwala，Amazon Web Services*

## Summary
<a name="help-enforce-dynamodb-tagging-summary"></a>

此模式在预定义的 Amazon DynamoDB 标签丢失或从 Amazon Web Services（AWS）云上的 DynamoDB 资源中删除时设置自动通知。 

DynamoDB 是一项完全托管的 NoSQL 数据库服务，可提供快速、可预测的性能和可扩展性。借助 DynamoDB，您可以减轻操作和扩展分布式数据库的管理负担。使用 DynamoDB 时，您不必担心硬件预置、设置和配置、复制、软件修补或集群扩展。

该模式使用 AWS CloudFormation 模板，该模板用于创建亚马逊活动 CloudWatch 事件和一个 AWS Lambda 函数。该事件使用 AWS 监视任何新的或现有的 DynamoDB 标签信息。 CloudTrail如果缺少或删除了预定义的标签，则会 CloudWatch 触发 Lambda 函数，该函数会向您发送亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 通知，告知您违规行为。 

## 先决条件和限制
<a name="help-enforce-dynamodb-tagging-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ Lambda .zip 文件的 Amazon Simple Storage Service（Amazon S3）存储桶，其中包含用于运行 Lambda 函数的 Python 脚本

**限制**
+ 该解决方案仅在`TagResource`或`UntagResource` CloudTrail 事件发生时才起作用。它不会为任何其他事件创建通知。

## 架构
<a name="help-enforce-dynamodb-tagging-architecture"></a>

**目标技术堆栈**
+ Amazon DynamoDB
+ AWS CloudTrail
+ Amazon CloudWatch
+ AWS Lambda
+ Amazon S3
+ Amazon SNS

**目标架构**

![\[缺少 DynamoDB 标签 CloudWatch 会触发事件和 Lambda 函数来发送亚马逊 SNS 通知。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/638d2b87-e031-4a53-8677-2d62e563746b/images/acc448c5-c39b-40b7-94c0-3534d2e725d7.png)


**自动化和扩展**

您可以针对不同的 AWS 区域和账户多次使用 AWS CloudFormation 模板。您只需在每个区域或账户中运行该模板一次。

## 工具
<a name="help-enforce-dynamodb-tagging-tools"></a>

**工具**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) – DynamoDB 是一项完全托管的 NoSQL 数据库服务，可提供快速、可预测的性能和可扩展性。 
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) — CloudTrail 是一项 AWS 服务，可帮助您对 AWS 账户进行治理、合规以及运营和风险审计。用户、角色或 AWS 服务采取的操作在中记录为事件 CloudTrail。 
+ [Amazon CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) Events — Amazon CloudWatch Events 提供近乎实时的系统事件流，这些事件描述了 AWS 资源的变化。 
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda 是一项计算服务，使您无需预置或管理服务器即可运行代码。只有在需要时 Lambda 才运行您的代码，并且能自动扩缩，从每天几个请求扩展到每秒数千个请求。 
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) – Amazon Simple Storage Service (Amazon S3) 是一项高度可扩展的对象存储服务，可用于各种存储解决方案，包括网站、移动应用程序、备份和数据湖。
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notiﬁcation Service (Amazon SNS) 是一项 Web 服务，可让应用程序、终端用户和设备即时发送和接收来自云端的通知。 

**代码**
+ 该项目的 .zip 文件作为附件提供。

## 操作说明
<a name="help-enforce-dynamodb-tagging-epics"></a>

### 删除 S3 存储桶
<a name="define-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 定义 S3 存储桶。 | 在 Amazon S3 控制台上，选择或创建一个具有不包含前导斜杠的唯一名称的 S3 存储桶。此 S3 存储桶将托管 Lambda 代码 .zip 文件。您的 S3 存储桶必须与正在监控的 DynamoDB 资源位于同一 AWS 区域。 | 云架构师 | 

### 将 Lambda 代码上传至 S3 存储桶
<a name="upload-the-lambda-code-to-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 Lambda 代码上传至 S3 存储桶。 | 将*附件*部分中提供的 Lambda 代码 .zip文件上传至 S3 存储桶。S3 存储桶必须与正在监控的 DynamoDB 资源位于同一区域。 | 云架构师 | 

### 部署 AWS CloudFormation 模板
<a name="deploy-the-aws-cloudformation-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 AWS CloudFormation 模板。 | 在 AWS CloudFormation 控制台上，部署 “*附件*” 部分中提供的 AWS CloudFormation 模板。在下一个操作说明中，为参数提供值。 | 云架构师  | 

### 填写 AWS CloudFormation 模板中的参数
<a name="complete-the-parameters-in-the-aws-cloudformation-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 命名 S3 存储桶。 | 输入您在第一个操作说明中创建或选择的 S3 存储桶的名称。 | 云架构师 | 
| 提供 Amazon S3 密钥。 | 提供 Lambda 代码 .zip 文件在 S3 存储桶中的位置，不带前导斜杠（例如，`<folder>/<file-name>.zip`）。 | 云架构师 | 
| 提供电子邮件地址 | 提供有效的电子邮件地址以接收 Amazon SNS 通知。 | 云架构师  | 
| 定义日志记录级别。 | 定义 Lambda 函数的日志记录级别和频率。`Info` 指明有关应用程序进度的详细信息消息。`Error` 指明仍允许应用程序继续运行的错误事件。`Warning` 指明潜在的有害情况。 | 云架构师 | 
| 输入所需 DynamoDB 标签键。 | 确保标记之间用逗号分隔，它们之间没有空格（例如，`ApplicationId,CreatedBy,Environment,Organization`）。Events CloudWatch 事件会搜索这些标签，如果找不到这些标签，则会发送通知。 | 云架构师 | 

### 确认订阅。
<a name="confirm-the-subscription"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确认订阅。 | 成功部署模板后，它会向你提供的电子邮件地址发送订阅电子邮件。要接收违规通知，您必须确认此电子邮件订阅。 | 云架构师  | 

## 相关资源
<a name="help-enforce-dynamodb-tagging-resources"></a>
+ [创建 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)
+ [将文件上传到 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html) 
+ [在 DynamoDB 中为资源添加标签](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.Operations.html)
+ [使用 AWS 创建在 AWS API 调用时触发 CloudWatch 的事件规则 CloudTrail](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-CloudTrail-Rule.html)

## 附件
<a name="attachments-638d2b87-e031-4a53-8677-2d62e563746b"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/638d2b87-e031-4a53-8677-2d62e563746b/attachments/attachment.zip)

# 通过 AWS DMS 和 Amazon Aurora 实施跨区域灾难恢复
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora"></a>

*Mark Hudson，Amazon Web Services*

## Summary
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-summary"></a>

自然或人为灾害可能随时发生，并有可能影响在给定 AWS 区域中运行的服务和工作负载的可用性。为了降低风险，您必须制定一项集成 Amazon Web Services 内置跨区域功能的灾难恢复 (DR) 计划。对于本质上不能提供跨区域功能的 Amazon Web Services，灾难恢复计划还必须提供解决方案来处理其在 AWS 区域间的故障转移。

此模式引导您完成灾难恢复设置，该设置涉及单个区域中的两个 Amazon Aurora MySQL 兼容版数据库集群。为满足灾难恢复要求，数据库集群配置为使用 Amazon Aurora Global Database 功能，单个数据库跨越多个 AWS 区域。AWS Database Migration Service (AWS DMS) 任务在本地区域的集群间复制数据。但是，AWS DMS 当前不支持区域之间的任务失效转移。此模式包含解决该限制，并在两个区域独立配置 AWS DMS 所需步骤。

## 先决条件和限制
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-prereqs"></a>

**先决条件**
+ 支持 [Amazon Aurora Global Database](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraFeaturesRegionsDBEngines.grids.html#Concepts.Aurora_Fea_Regions_DB-eng.Feature.GlobalDatabase) 的精选主和辅助 AWS 区域。
+ 两个独立的 Amazon Aurora MySQL 兼容版数据库集群位于主区域单个账户中。
+ 数据库实例类 db.r5 或以上（推荐）。
+ 主区域中的 AWS DMS 任务，在现有数据库集群间执行持续复制。
+ 灾难恢复区域资源已就绪，可以满足创建数据库实例的要求。有关更多信息，请参见[在 VPC 中使用数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html)。

**限制**
+ 有关 Amazon Aurora Global Database 限制的完整列表，请参阅 [Amazon Aurora Global Database 限制](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html#aurora-global-database.limitations)。

**产品版本**
+ Amazon Aurora MySQL-Compatible Edition 5.7 或 8.0。有关更多信息，请参阅 [Amazon Aurora 版本](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.VersionPolicy.html)。

## 架构
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-architecture"></a>

**目标技术堆栈**
+ Amazon Aurora MySQL-Compatible Edition 全局数据库集群
+ AWS DMS

**目标架构**

下图显示了两个 AWS 区域的全局数据库，一个包含主数据库和报告器数据库以及 AWS DMS 复制，另一个包含辅助主数据库和报告器数据库。

![\[跨区域全局数据库的架构图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/b01f5043-fcb5-4b1e-b79f-999792e89bed/images/3785384c-ed01-454f-b58c-fa09d223d57b.png)


**自动化和扩展**

您可以使用 AWS CloudFormation 在辅助区域创建必备基础设施，例如虚拟私有云 (VPC)、子网和参数组。您还可以使用 AWS CloudFormation 在灾难恢复区域创建辅助集群并将其添加到全局数据库中。如果您使用 CloudFormation 模板在主区域创建数据库集群，则可以用其他模板对其进行更新或扩充，以创建全局数据库资源。有关更多信息，请参阅[创建包含两个数据库实例的 Amazon Aurora 数据库集群](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html#aws-resource-rds-dbcluster--examples)和[为 Aurora MySQL 创建全局数据库集群](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-rds-globalcluster.html#aws-resource-rds-globalcluster--examples)。

最后，您可以在发生故障转移和故障恢复事件 CloudFormation 后使用在主区域和次要区域创建 AWS DMS 任务。有关更多信息，请参阅 [AWS::DMS::ReplicationTask](https://docs.amazonaws.cn/en_us/AWSCloudFormation/latest/UserGuide/aws-resource-dms-replicationtask.html)。

## 工具
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-tools"></a>
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) 是一个与 MySQL 和 PostgreSQL 兼容的完全托管式关系数据库引擎。此模式使用 Amazon Aurora MySQL 兼容版。
+ [Amazon Aurora Global Database](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html) 专为分布在全球的应用程序而设计。一个 Amazon Aurora Global Database 可以跨越多个 AWS 区域。它可以在不影响数据库性能的情况下复制数据。它还支持在每个区域以低延迟实现快速本地读取，并可以从区域范围的中断中提供灾难恢复。
+ [AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 提供一次性迁移或持续复制。正在进行的复制任务可使源数据库与目标数据库保持同步。设置完成后，正在进行的复制任务会以最小延迟持续将源更改应用于目标。所有的 AWS DMS 功能，例如数据验证和转换，可用于任何复制任务。

## 操作说明
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-epics"></a>

### 准备主区域的现有数据库集群
<a name="prepare-the-existing-database-clusters-in-the-primary-region"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改数据库集群参数组。 | 在现有的数据库集群参数组中，通过将 `binlog_format` 参数设置为**行**值来激活行级二进制日志记录。在执行持续的复制或更改数据捕获 (CDC) 时，AWS DMS 要求对兼容 MySQL 的数据库执行行级二进制日志记录。有关更多信息，请参阅 [使用与 AWS 托管的 MySQL 兼容数据库作为 AWS DMS 的来源](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.AmazonManaged)。 | AWS 管理员 | 
| 更新数据库二进制日志保留期。 | 使用安装在最终用户设备上的 MySQL 客户端或亚马逊弹性计算云 (Amazon EC2) 实例，在主数据库集群的写入器节点上运行亚马逊关系数据库服务 (Amazon RDS) 提供的以下存储过程，其中`XX`是保留日志的小时数。<pre>call mysql.rds_set_configuration('binlog retention hours', XX)</pre>可以通过运行以下命令确认设置。<pre>call mysql.rds_show_configuration;</pre>由 AWS 托管的 MySQL 兼容数据库会尽快清除二进制日志。因此，保留期必须足够长，以确保在 AWS DMS 任务运行前不会清除日志。24 小时值通常就足够了，但该值应基于在灾难恢复区域设置 AWS DMS 任务所需时间。 | 数据库管理员 | 

### 更新主区域中现有 AWS DMS 任务
<a name="update-the-existing-aws-dms-task-in-the-primary-region"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 记录 AWS DMS 任务 ARN。 | 使用 Amazon 资源名称（ARN）获取 AWS DMS 任务名称以便稍后使用。要检索 AWS DMS 任务 ARN，请在控制台查看该任务或运行以下命令。<pre>aws dms describe-replication-tasks</pre>ARN 如下所示。<pre>arn:aws:dms:us-east-1:<accountid>:task:AN6HFFMPM246XOZVEUHCNSOVF7MQCLTOZUIRAMY</pre>最后一个冒号之后的字符对应后面步骤中使用的任务名称。 | AWS 管理员 | 
| 修改现有 AWS DMS 任务，以记录检查点。 | AWS DMS 创建包含信息的检查点，以便复制引擎知道更改流的恢复点。若要记录检查点信息，请在控制台中执行以下步骤：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora.html) | AWS 管理员 | 
| 验证检查点信息。 | 使用连接到集群写入器端点的 MySQL 客户端，在报告者数据库集群中查询新的元数据表，以验证该表是否存在并包含复制状态信息。运行如下命令。<pre>select * from awsdms_control.awsdms_txn_state;</pre>ARN 中的任务名称应在 `Task_Name` 此表的列中找到。 | 数据库管理员 | 

### 将两个 Amazon Aurora 集群扩展至灾难恢复区域
<a name="expand-both-amazon-aurora-clusters-to-a-dr-region"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在灾难恢复区域创建基础设施。 | 创建创建和访问 Amazon Aurora 集群所需基本组件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora.html)确保两个参数组的配置与主区域配置相匹配。 | AWS 管理员 | 
| 将灾难恢复区域添加至两个 Amazon Aurora 集群。 | 向主集群和报告集群 Amazon Aurora 添加辅助区域（灾难恢复区域）。有关更多信息，请参阅[将 AWS 区域 添加到 Amazon Aurora Global Database](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-getting-started.html#aurora-global-database-attaching)。 | AWS 管理员 | 

### 执行故障转移
<a name="perform-failover"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止 AWS DMS 任务。 | 故障转移发生后，主区域中的 AWS DMS 任务无法正常运行，应停止该任务以避免出错。 | AWS 管理员 | 
| 执行托管故障转移。 | 对主数据库集群执行灾难恢复区域托管故障转移。有关说明，请参阅[执行 Amazon Aurora Global Database 的托管计划内故障转移](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-disaster-recovery.html#aurora-global-database-disaster-recovery.managed-failover)。主数据库集群的故障转移完成后，在报告器数据库集群执行相同的活动。 | AWS 管理员，数据库管理员 | 
| 将数据加载至主数据库。 | 将测试数据插入灾难恢复数据库集群中的主数据库写入器节点。此数据将用于验证复制是否正常运行。 | 数据库管理员 | 
| 创建 AWS DMS 复制实例。 | 要在灾难恢复区域创建 AWS DMS 复制实例，请参阅[创建复制实例](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.Creating.html)。 | AWS 管理员，数据库管理员 | 
| 创建 AWS DMS 源和目标端点。 | 要在灾难恢复区域创建 AWS DMS 源和目标端点，请参阅[创建源和目标端点](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.Creating.html)。源应指向主数据库集群写入器实例。目标应指向报告器数据库集群写入器实例。 | AWS 管理员，数据库管理员 | 
| 获取复制检查点。 | 若要获取复制检查点，请使用 MySQL 客户端通过对灾难恢复区域报告器数据库集群中的写入节点，运行以下命令来查询元数据表。<pre>select * from awsdms_control.awsdms_txn_state;</pre>在表中，找到与 AWS DMS 任务的 ARN 相对应的 task\$1name 值，该值存在于您在第二个操作说明中获得的主要区域中。 | 数据库管理员 | 
| 创建 AWS DMS 任务。 | 使用控制台在灾难恢复区创建 AWS DMS 任务。在任务中，指定**仅复制数据更改**的迁移方法。有关更多信息，请参阅[创建任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html)。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora.html)将 AWS DMS 任务**启动迁移任务**设置为**创建时自动**。 | AWS 管理员，数据库管理员 | 
| 记录 AWS DMS 任务 ARN。 | 使用 ARN 获取 AWS DMS 任务名称，以供日后使用。若要检索 AWS DMS 任务 ARN，请运行以下命令。<pre>aws dms describe-replication-tasks</pre> | AWS 管理员，数据库管理员 | 
| 验证复制数据。 | 在灾难恢复区域中查询报告器数据库集群，以确认加载到主数据库集群中的测试数据已被复制。 | 数据库管理员 | 

### 执行失效自动恢复
<a name="perform-failback"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止 AWS DMS 任务。 | 失效自动恢复后，灾难恢复区域中的 AWS DMS 任务无法正常运行，应停止任务以避免出错。 | AWS 管理员 | 
| 执行托管失效自动恢复。 | 将主数据库集群故障恢复至主区域。有关说明，请参阅[执行 Amazon Aurora Global Database 的托管计划内故障转移](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-disaster-recovery.html#aurora-global-database-disaster-recovery.managed-failover)。主数据库集群的失效自动恢复完成后，在报告器数据库集群执行相同的活动。 | AWS 管理员，数据库管理员 | 
| 获取复制检查点。 | 若要获取复制检查点，请使用 MySQL 客户端通过对灾难恢复区域报告器数据库集群中的写入节点，运行以下命令来查询元数据表。<pre>select * from awsdms_control.awsdms_txn_state;</pre>在表中，找到与您在第四篇操作说明中获得的灾难恢复区域中存在的 AWS DMS 任务的 ARN 相对应的 `task_name` 值。 | 数据库管理员 | 
| 更新 AWS DMS 源和目标端点。 | 数据库集群故障恢复后，请检查主区域中集群以确定哪些节点是写入器实例。然后验证主区域中的现有 AWS DMS 源和目标端点是否指向写入器实例。如果不是，请使用写入器实例的域名系统（DNS）名称更新端点。 | AWS 管理员 | 
| 创建 AWS DMS 任务。 | 通过控制台在主区域创建 AWS DMS 任务。在任务中，指定**仅复制数据更改**的迁移方法。有关更多信息，请参阅[创建任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html)。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora.html) | AWS 管理员，数据库管理员 | 
| 记录 AWS DMS 任务 Amazon 资源名称（ARN）。 | 使用 ARN 获取 AWS DMS 任务名称，以供日后使用。若要检索 AWS DMS 任务 ARN，请运行以下命令：<pre>aws dms describe-replication-tasks</pre>在执行其他托管故障转移或灾难恢复场景事，将需要任务名称。 | AWS 管理员，数据库管理员 | 
| 删除 AWS DMS 任务。 | 删除主区域中的原始（当前已停止）AWS DMS 任务和辅助区域中的现有 AWS DMS 任务（当前已停止）。 | AWS 管理员 | 

## 相关资源
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-resources"></a>
+ [配置 Amazon Aurora 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraSettingUp.html)
+ [使用 Amazon Aurora Global Database](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database.html)
+ [使用 Amazon Aurora MySQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMySQL.html)
+ [使用 AWS DMS 复制实例](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_ReplicationInstance.html)
+ [使用 AWS DMS 端点](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Endpoints.html)
+ [使用 AWS DMS 任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.html)
+ [什么是 AWS CloudFormation？](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)

## 附加信息
<a name="implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora-additional"></a>

本示例中使用 Amazon Aurora Global Database 进行灾难恢复，因为它们提供了 1 秒的有效恢复时间目标（RTO）和小于 1 分钟的恢复点目标（RPO），两者都低于传统的复制解决方案，非常适合灾难恢复方案。

Amazon Aurora Global Database 还具有许多其他优势，包含：
+ 具有本地延迟的全球读取 - 全球消费者可以在本地延迟的情况下访问本地区域的信息。
+ 可扩展的辅助 Amazon Aurora 数据库集群 — 辅助集群可独立扩展，最多可添加 16 个只读副本。
+ 从主到辅助 Amazon Aurora DB 集群的快速复制 – 复制对主集群的性能影响很小。它发生在存储层，典型的跨区域复制延迟应小于 1 秒。

此模式还使用 AWS DMS 复制。Amazon Aurora 数据库提供了创建只读副本的功能，这可简化复制过程和灾难恢复设置。但是，当需要进行数据转换或目标数据库需要源数据库没有的其他索引时，通常会使用 AWS DMS 进行复制。

# 将含有 100 多个参数的 Oracle 函数和过程迁移到 PostgreSQL
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql"></a>

*Srinivas Potlachervoo，Amazon Web Services*

## Summary
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-summary"></a>

此模式显示如何将含有 100 多个参数的 Oracle 数据库函数和过程迁移到 PostgreSQL。例如，您可以使用此模式将 Oracle 函数和过程迁移到以下与 PostgreSQL 兼容的 AWS 数据库服务之一：
+ Amazon Relational Database Service (Amazon RDS) for PostgreSQL
+ Amazon Aurora PostgreSQL 兼容版

PostgreSQL 不支持含有 100 多个参数的函数和过程。解决方法是，您可以定义一种新的数据类型，其类型字段与源函数的参数相匹配。然后，您可以创建并运行使用自定义数据类型作为参数的 PL/pgSQL 函数。

## 先决条件和限制
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ [Amazon RDS Oracle 数据库（DB）实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)
+ 一个 [Amazon RDS for PostgreSQL 数据库实例](https://aws.amazon.com/getting-started/hands-on/create-connect-postgresql-db/)或 [Aurora PostgreSQL-Compatible 数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_GettingStartedAurora.CreatingConnecting.AuroraPostgreSQL.html)

**产品版本**
+ Amazon RDS Oracle 数据库实例版本 10.2 及更高版本
+ Amazon RDS PostgreSQL 数据库实例版本 9.4 及更高版本，或者 Aurora PostgreSQL-Compatible 数据库实例版本 9.4 及更高版本
+ Oracle SQL 开发人员版本 18 及更高版本
+ pgAdmin 版本 4 及更高版本

## 架构
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-architecture"></a>

**源技术堆栈**
+ Amazon RDS Oracle 数据库实例版本 10.2 及更高版本

**目标技术堆栈**
+ Amazon RDS PostgreSQL 数据库实例版本 9.4 及更高版本，或者 Aurora PostgreSQL-Compatible 数据库实例版本 9.4 及更高版本

## 工具
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-tools"></a>

**Amazon Web Services**
+ [Amazon Relational Database Service（Amazon RDS）for PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展 PostgreSQL 关系数据库。
+ [Amazon Aurora PostgreSQL 兼容版](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)是一个完全托管的、与 ACID 兼容的关系数据库引擎，可帮助您建立、运行和扩展 PostgreSQL 部署。

**其他服务**
+ [Oracle SQL Developer](https://www.oracle.com/database/technologies/appdev/sqldeveloper-landing.html) 是一个集成的开发环境，可简化传统部署和基于云的部署中 Oracle 数据库的开发和管理。
+ [pgAdmin](https://www.pgadmin.org/) 是一种适用于 PostgreSQL 的开源管理工具。它提供了一个图形界面，可帮助您创建、维护和使用数据库对象。

## 最佳实践
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-best-practices"></a>

确保您创建的数据类型与源 Oracle 函数或过程中包含的类型字段相匹配。

## 操作说明
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-epics"></a>

### 运行含有 100 多个参数的 Oracle 函数或过程
<a name="run-an-oracle-function-or-procedure-that-has-more-than-100-arguments"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建或标识具有超过 100 个参数的现有 Oracle/PLSQL 函数或过程。 | 创建参数超过 100 的 Oracle/PLSQL 函数或过程。–或者–标识具有超过 100 个参数的现有 Oracle/PLSQL 函数或过程。有关更多信息，请参阅 Oracle 数据库文档中的[第 14.7 节 创建函数语句](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/CREATE-FUNCTION-statement.html#GUID-B71BC5BD-B87C-4054-AAA5-213E856651F2)和[第 14.11 节创建过程语句](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnpls/CREATE-PROCEDURE-statement.html#GUID-5F84DB47-B5BE-4292-848F-756BF365EC54)。 | Oracle/PLSQL 知识 | 
| 编译 Oracle/PLSQL 函数或过程。 | 编译 Oracle/PLSQL 函数或过程。有关更多信息，请参阅 Oracle 数据库文档中的[编译函数](https://docs.oracle.com/cd/E37097_01/doc.42/e35128/GUID-6B7B6F82-616D-4915-82BE-D4AE7F59CF37.htm#AEUTL165)。 | Oracle/PLSQL 知识 | 
| 运行该 Oracle/PLSQL 函数。 | 运行 Oracle/PLSQL 函数或过程。然后，保存输出。 | Oracle/PLSQL 知识 | 

### 定义与源函数或过程的参数相匹配的新数据类型
<a name="define-a-new-data-type-that-matches-the-source-functionapos-s-or-procedureapos-s-arguments"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 PostgreSQL 中定义一种新的数据类型。 | 在 PostgreSQL 中定义一种新的数据类型，该数据类型包括源 Oracle 函数或过程的参数中出现的所有相同字段。有关更多信息，请参阅 PostgreSQL 文档中的[创建类型](https://www.postgresql.org/docs/current/sql-createtype.html)。 | PostgreSQL 知识 PL/pgSQL  | 

### 创建一个包含新的 TYPE 参数的 PostgreSQL 函数
<a name="create-a-postgresql-function-that-includes-the-new-type-argument"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个包含新的数据类型的 PostgreSQL 函数。 | 创建一个包含新的 `TYPE` 参数的 PostgreSQL 函数。要查看示例函数，请参阅此模式的**其他信息**部分。 | PostgreSQL 知识 PL/pgSQL  | 
| 编译 PostgreSQL 函数。 | 编译 PostgreSQL 中的 函数。如果新的数据类型字段与源函数或过程的参数相匹配，则该函数成功编译。 | PostgreSQL 知识 PL/pgSQL  | 
| 运行 PostgreSQL 函数。 | 运行 PostgreSQL 函数。 | PostgreSQL 知识 PL/pgSQL  | 

## 问题排查
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 函数返回以下错误：**错误：“<statement>”附近有语法错误** | 确保函数的所有语句都以分号（`;`）结尾。 | 
| 函数返回以下错误：**错误：“<variable>”不是已知变量** | 确保函数正文中使用的变量列在函数的 `DECLARE`部分中。 | 

## 相关资源
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-resources"></a>
+ [使用Amazon Aurora PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraPostgreSQL.html)（*适用于 Aurora 的 Amazon Aurora 用户指南*）
+ [创建类型](https://www.postgresql.org/docs/11/sql-createtype.html)（PostgreSQL 文档）

## 附加信息
<a name="migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql-additional"></a>

**包含 TYPE 参数的 PostgreSQL 函数示例**

```
CREATE OR REPLACE FUNCTION test_proc_new
(
    IN p_rec type_test_proc_args
) 
RETURNS void
AS
$BODY$
BEGIN

    /*
    **************
    The body would contain code to process the input values.
    For our testing, we will display couple of values.
    ***************
    */
    RAISE NOTICE USING MESSAGE = CONCAT_WS('', 'p_acct_id: ', p_rec.p_acct_id);
    RAISE NOTICE USING MESSAGE = CONCAT_WS('', 'p_ord_id: ', p_rec.p_ord_id);
    RAISE NOTICE USING MESSAGE = CONCAT_WS('', 'p_ord_date: ', p_rec.p_ord_date);
   
END;
$BODY$
LANGUAGE plpgsql 
COST 100;
```

# 将 Redis 工作负载迁移至 Redis Enterprise Cloud on AWS
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws"></a>

*Antony Prasad Thevaraj，Amazon Web Services*

*Srinivas Pendyala，Redis*

## Summary
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-summary"></a>

此模式介绍了在 Amazon Web Services (AWS) 上将 Redis 工作负载迁移至 Redis Enterprise Cloud 的高级流程。它描述了迁移步骤，提供了有关可用工具选择的信息，并介绍了使用每种工具的优缺点和步骤。或者，如果您在从 Redis 迁移工作负载时需要其他帮助，可使用 Redis 专业服务。

如果您在本地运行 Redis OSS 或 Redis Enterprise Software，您就能熟悉在数据中心维护 Redis 数据库所带来的巨大管理开销和操作复杂性。通过将工作负载迁移到云端，您可以显著减轻运营负担，并充分利用 [Redis Enterprise Cloud](https://redis.com/redis-enterprise-cloud/overview/)，这是一款完全托管的数据库即服务 (DBaaS) 产品。这种迁移有助于提高业务灵活性、提高应用程序可靠性并降低总体成本，同时您可访问最新的 Redis Enterprise Cloud on AWS 功能，例如 99.999% 的可用性、架构简洁性和可扩展性。

Redis Enterprise Cloud 在金融服务、零售、医疗保健和游戏领域以及需要欺诈检测、实时库存、索赔处理和会话管理解决方案的用例中都有潜在应用。您可以使用 Redis 企业云连接到您的 AWS 资源，例如，连接到在亚马逊弹性计算云 (Amazon EC2) 实例上运行的应用程序服务器，或者连接到作为 AWS Lambda 服务部署的微服务。

## 先决条件和限制
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-prereqs"></a>

**假设**
+ 您当前正在操作要迁移至云端的本地数据库系统。
+ 您已经确定了工作负载迁移要求，包括：
  + 数据一致性要求。
  + 基础设施和系统环境要求
  + 数据映射与转换要求
  + 功能测试要求
  + 性能测试要求
  + 验证要求
  + 定义的割接策略
+ 您已经评测迁移所需时间表和成本估算。
+ 您的要求会考虑工作范围以及确定为迁移一部分的系统和数据库。
+ 您已经在负责任、负责、咨询、知情 (RACI) 矩阵中确定了利益相关者及其角色和责任。
+ 您已获得所有利益相关者的必要同意与批准。

**成本**

根据现有源数据库的技术规格（例如内存大小、吞吐量和总数据大小），Redis 解决方案架构师可以在 Redis Enterprise Cloud 上调整目标系统的大小。 有关一般定价信息，请参阅 Redis 网站上的 [Redis 定价](https://redis.com/redis-enterprise-cloud/pricing)。

**人员与技能**

迁移过程涉及以下角色与职责。


| 
| 
|  角色 | 说明 | 所需技能 | 
| --- |--- |--- |
| **迁移解决方案架构师** | 在定义、规划和实施迁移策略方面具有专长的技术架构师 | 对源系统和目标系统的技术和应用程序级理解；具有将工作负载迁移至云端的经验 | 
| **数据架构师** | 技术架构师，在为各种数据库定义、实施和提供数据解决方案方面拥有丰富的经验 | 结构化和非结构化数据建模，在为企业实施数据库方面有深刻的理解和经验 | 
| **Redis 解决方案架构师** | 技术架构师，可以根据适当的用例帮助架构大小最优的 Redis 集群 | 在为各种用例设计和部署 Redis 解决方案方面有专长 | 
| **云解决方案架构师** | 对云解决方案（尤其是 AWS 上的解决方案）有更深入了解的技术架构师 | 云解决方案架构方面的专长；工作负载迁移和应用程序现代化经验 | 
| **企业架构师** | 技术架构师，对组织的技术格局有全面的了解，对未来的路线图有共同的愿景，并且在组织中的所有团队中实践和建立标准化架构最佳实践 | 软件架构认证，如 TOGAF、基础软件工程技能、解决方案架构和企业架构专长 | 
| **IT 或 DevOps 工程师** | 负责创建和维护基础设施的工程师，职责包括监控基础设施是否存在问题、执行维护任务以及根据需要进行更新。 | 对各种技术有深刻了解，包括操作系统、网络和云计算；熟悉 Python、Bash 和 Ruby 等编程语言以及 Docker、Kubernetes 和 Ansible 等工具 | 

## 架构
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-architecture"></a>

**迁移选项  **

下图显示了将您的本地（基于 Redis 或其他）数据来源迁移至 AWS 的选项。它显示了几种可供选择的迁移工具，例如使用 Redis 复制功能或使用 AWS DMS，将 Redis 数据库 (RDB) 文件导出到 Amazon Simple Storage Service (Amazon S3)。

![\[将本地数据来源迁移至 Redis Enterprise Cloud on AWS 的选项\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/384309f6-7218-4a46-83a5-f37ff95c8832/images/4b242a29-d283-49a3-aaea-a970813db6be.png)


1. 本地数据来源：不基于 Redis 数据库，例如 MySQL、PostgreSQL、Oracle、SQL Server 或 MariaDB。 

1. 本地数据来源：基于 Redis 协议数据库，例如 Redis OSS 和 Redis 企业软件。

1. 从基于 Redis 的数据库迁移数据的最简单方法是导出 RDB 文件、并将其导入 AWS 上的目标 Redis Enterprise Cloud。

1. 或者，您可使用 Redis 中的复制功能 (`ReplicaOf`) 将数据从源迁移到目标。

1. 如果您的数据迁移要求包括数据转换，则可以使用 Redis Input/Output 工具 (RIOT) 来迁移数据。

1. 或者，您还可使用 AWS Data Migration Service (AWS DMS) 从基于 SQL 的数据库中迁移数据。 

1. 您必须使用 AWS DMS 的虚拟私有云（VPC）对等连接才能将数据成功迁移到 AWS 上的目标 Redis Enterprise Cloud中。

**目标架构**

下图显示了 Redis Enterprise Cloud on AWS 的典型部署架构，并说明了如何将其用于关键 Amazon Web Services。

![\[在 AWS 上部署 Redis Enterprise Cloud 的架构，并与 Amazon Web Services 配合使用\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/384309f6-7218-4a46-83a5-f37ff95c8832/images/f1351537-e710-4a68-8768-89d44870150f.png)


1. 您可在 AWS 上连接由 Redis Enterprise Cloud 支持的业务应用程序。

1. 您可在自己的 Amazon Web Services account 中运行业务应用程序，也可以在该账户的 VPC 中运行业务应用程序。

1. 您可使用 Redis Enterprise Cloud 数据库端点连接到您的应用程序。示例包括在 EC2 实例上运行的应用程序服务器、部署为 AWS Lambda 服务的微服务、亚马逊弹性容器服务 (Amazon ECS) 应用程序或亚马逊 Elastic Kubernetes 服务 (Amazon EKS) 应用程序 (Amazon EKS) 应用程序。

1. 在您的 VPC 运行业务应用程序需要与 Redis Enterprise Cloud VPC 建立 VPC 对等连接。这使业务应用程序能够通过私有端点安全连接。

1. AWS 上的 Redis Enterprise Cloud 是一个内存中 NoSQL 数据库平台，作为 S 部署 DBaa在 AWS 上，完全由 Redis 管理。

1. Redis Enterprise Cloud 部署在 VPC 内的 Redis 创建的标准 Amazon Web Services account 中。

1. 出于安全考虑，Redis Enterprise Cloud 部署至私有子网中，私有和公有端点均可访问该子网。我们建议您将客户端应用程序连接到私有端点上的 Redis。如果您计划使用公共端点，我们强烈建议您[启用 TLS](https://docs.redis.com/latest/rc/security/database-security/tls-ssl/) 来加密您的客户端应用程序和 Redis Enterprise Cloud 之间的数据。

Redis 迁移方法与 AWS 迁移方法一致，AWS Prescriptive Guidance 网站上的[动员您的组织以加快大规模迁移](https://docs.aws.amazon.com/prescriptive-guidance/latest/strategy-migration/overview.html)对此进行了说明。

**自动化和扩缩**

迁移的环境设置任务可以通过 AWS 登录区和基础设施即代码（IaC）模板自动完成，以实现自动化和扩缩。这些将在此模式的[操作说明](#migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-epics)部分中介绍。

## 工具
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-tools"></a>

根据您的数据迁移要求，可从一系列技术选项中进行选择，将您的数据迁移至 Redis Enterprise Cloud on AWS。下表对这些工具进行了描述和比较。


| 
| 
| 工具 | 说明 | 优点 | 缺点 | 
| --- |--- |--- |--- |
| [RDB 导出](https://docs.redis.com/latest/rc/api/examples/back-up-and-import-data/)和[导入](https://docs.redis.com/latest/rc/databases/import-data/) | 您可以 RDB 文件的形式从源（例如 Redis OSS 或 Redis Enterprise Software）数据库中导出数据。如果您的数据库是通过 Redis OSS 集群提供，则可以将每个主分片导出到 RDB。然后，您可一步导入所有 RDB 文件。如果您的源数据库基于 OSS 集群，但目标数据库未使用 OSS 集群 API，则必须更改应用程序源代码，以使用标准 Redis 客户端库。数据转换要求或逻辑数据库合并需要更复杂的过程，本表后面的*逻辑数据库合并部分*对此进行说明。 | 简便。适用于任何可以 RDB 格式导出数据作为源的基于 Redis 的解决方案（包括 Redis OSS 和 Redis Enterprise Software）。通过简单流程实现数据一致性。 | 不满足数据转换要求或者不支持逻辑数据库合并。对于较大数据集非常耗时。不支持 delta 迁移，可能会导致更长的停机时间。 | 
| [Redis 复制功能](https://docs.redis.com/latest/rs/databases/import-export/replica-of/)（主动-被动） | 您可将数据从 Redis OSS、Enterprise Software 或 Enterprise Cloud 数据库持续复制到 Redis Enterprise Cloud 数据库。初始同步后，Redis 复制功能 (`ReplicaOf`) 会执行增量迁移，这就意味着几乎没有观察到应用程序停机时间。Redis 复制功能旨在以主动-被动方式采用。假定目标处于被动状态，并且已完全重新同步（从源数据库刷新和同步）。因此，在源和目标之间割接更复杂。通过将 OSS 集群的所有主分片指定为源，可从 Redis OSS 集群复制到标准集群 Redis Enterprise Cloud 数据库。但是，Redis 复制功能最多可允许 32 个源数据库。 | 支持连续复制（初始数据加载后是增量）。几乎没有停机时间（取决于复制延迟）。实现数据一致性。 | 只有一个站点打算处于活动状态，因此在站点之间割接更为复杂。从 OSS 集群迁移时最多支持 32 项主分片。 | 
| [AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) | 您可使用 AWS DMS 将数据从任何支持的源数据库迁移到目标 Redis 数据存储，最大限度地减少停机时间。有关最新信息，请参阅 AWS DMS 文档中的[使用 Redis 作为 AWS DMS 的目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Redis.html)。 | 支持 NoSQL 和 SQL 数据来源迁移。与其他 Amazon Web Services 良好地协同工作。支持实时迁移和更改数据捕获 (CDC) 用例。 | Redis 键值不能包含特殊字符，如 %。不支持迁移行或字段名中包含特殊字符。不支持完整大型二进制对象 (LOB) 模式。 | 
| 逻辑数据库合并 | 特殊数据库合并要求可能需要自定义的数据迁移解决方案。例如，您在 Redis OSS 中可能有四个逻辑数据库 (`SELECT 0..3`)，但您可能希望使用单个数据库端点，而非将数据移动至多个 Redis Enterprise Cloud 数据库。Redis Enterprise 不支持可选逻辑数据库，因此您必须转换源数据库的物理数据模型。例如，您可将每个数据库索引映射到前缀(`0` 至 `usr`，`1` 至 `cmp`等)，然后使用迁移脚本或提取、转换、加载（ETL）工具输出 RDB 文件，然后可以将其导入目标数据库。 | 在迁移到目标系统的进程中，使用自定义脚本对数据进行精细控制。  | 如果您决定不完成迁移，则回退可能非常困难，尤其是在必须将较新的数据回退到源系统时。如果目标是为一次性迁移构建一次性解决方案，则构建成本可能较高。如果迁移要求频繁变化，则代码、基础设施、开发时间和其他方面维护成本可能会很高。  | 

此外，您还可使用 AWS 提供的以下工具和服务。

评估和发现工具：
+ [Migration Evaluator](https://aws.amazon.com/migration-evaluator/)

应用程序和服务器迁移工具：
+ [AWS Application Migration Service](https://aws.amazon.com/application-migration-service/)

[数据库迁移工具](https://aws.amazon.com/solutions/database-migrations/)：
+ [AWS Schema Conversion Tool (AWS SCT)](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)
+ [AWS Database Migration Service (AWS DMS)](https://aws.amazon.com/dms/)

[数据迁移工具](https://aws.amazon.com/cloud-data-migration/)：
+ [AWS Storage Gateway](https://aws.amazon.com/storagegateway/)
+ [AWS DataSync](https://aws.amazon.com/datasync/)
+ [AWS Direct Connect](https://aws.amazon.com/directconnect/)
+ [AWS Snowball](https://aws.amazon.com/snowball/)
+ [Amazon Data Firehose](https://aws.amazon.com/kinesis/data-firehose/)

AWS 合作伙伴解决方案：
+ [AWS Migration Competency Partners](https://aws.amazon.com/migration/partner-solutions/)

## 操作说明
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-epics"></a>

### 完成发现和评测任务
<a name="complete-discovery-and-assessment-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 识别工作负载。 | 确定要迁移的适当候选工作负载。选择迁移工作负载前，请注意以下各项：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html)理想情况下，选择对业务影响最大、且风险最小的工作负载。保持整个流程的迭代性，并以较小增量进行迁移。 | 数据架构师、商业支持者、迁移项目发起人 | 
| 确定数据来源和需求、设计数据模型。 | Redis 举办了研讨会，以加快发现并定义项目的迁移计划。本次研讨会期间，Redis 团队将确定数据来源和源数据模型要求，并分析如何在 Redis Enterprise Cloud 中对其进行改造。Redis 迁移团队 (Professional Services) 与您的组织一起执行详细的数据模型设计练习。在本次练习中，Redis 团队：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) | Redis 解决方案架构师 | 
| 确定源数据库特点。 | 确定源环境和目标环境中的 Redis 产品。例如：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) | 数据架构师 | 
| 收集当前的系统 SLA 与其他规模调整指标。 | 确定当前的服务级别协议 (SLAs)，以吞吐量（每秒操作数）、延迟、每个数据库的总体内存大小和高可用性 (HA) 要求表示。 | 数据架构师 | 
| 确定目标系统特点。 | 确定以下回答答案：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) | 数据架构师、Redis 解决方案架构师（可选） | 
| 确定依赖项。 | 确定要迁移的当前系统上游和下游依赖项。确保迁移工作与其他依赖系统迁移是否保持一致。例如，如果您计划将其他业务应用程序从本地迁移至 AWS Cloud，请识别这些应用程序并根据项目目标、时间表和利益相关者进行调整。 | 数据架构师、企业架构师 | 
| 确定迁移工具。 | 根据您的数据迁移要求（例如源数据或停机时间要求），您可使用前面[工具](#migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-tools)部分描述的任何工具。此外，您还可使用：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) | 迁移解决方案架构师、Redis 解决方案架构师 | 
| 制定应急计划。 | 制定应急计划进行回退，以防在迁移过程中遇到问题。 | 项目管理、技术团队，包含架构师 | 

### 完成安全与合规任务
<a name="complete-security-and-compliance-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 保护 Redis 管理控制台。 | 要保护管理控制台，请按 [Redis 文档](https://redis.io/docs/latest/operate/oss_and_stack/management/security/)中的说明进行操作。 | IT 基础设施管理员 | 
| 保护 Redis 数据库。 | 有关操作，请参阅 Redis 文档中的以下页面：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) |  | 
| 安全 Redis 云 APIs。 | [启用 API](https://docs.redis.com/latest/rc/api/get-started/enable-the-api/) 后，您可对所有 Redis Cloud 账户拥有者[管理 API 密钥](https://docs.redis.com/latest/rc/api/get-started/manage-api-keys/)。有关 API 安全功能的概述，请参阅 Redis 网站的 [API 身份验证文档](https://docs.redis.com/latest/rc/api/get-started/)。 | IT 基础设施管理员 | 

### 设置新环境
<a name="set-up-the-new-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AWS 设置新环境。 | 此任务包括：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) | IT 或 DevOps 工程师 | 
| 部署迁移架构。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html)现在，您可运行实际数据迁移管道并对其进行测试了。 | IT 或 DevOps 工程师 | 

### 设置联网
<a name="set-up-networking"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 建立连接。 | 在本地基础设施和 Amazon Web Services Cloud 资源之间建立连接。使用安全组、AWS Direct Connect 等资源来实现此功能。有关更多信息，请参阅 AWS 网站上的[将您的数据中心连接到 AWS](https://aws.amazon.com/getting-started/hands-on/connect-data-center-to-aws/)。 | IT 或 DevOps 工程师 | 
| 设置 VPC 对等连接。 | 在 VPCs 运行业务应用程序（或运行迁移工具或 AWS DMS 复制服务器的 EC2 实例）和运行 Redis 企业云的 VPC 之间建立 VPC 对等关系。有关说明，请参阅 Amazon VPC 文档中的 [Amazon VPC 入门](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html)和 Redis 文档中的[启用 VPC 对等](https://docs.redis.com/latest/rc/security/vpc-peering/)。 | IT 或 DevOps 工程师 | 

### 迁移数据
<a name="migrate-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 选择数据迁移工具。 | 查看[工具](#migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-tools)部分的表格，查看这些工具的描述、优点和缺点：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html)以下各行描述了与各种工具相关的数据迁移任务。 | 迁移解决方案架构师 | 
| 选项 1：使用 RDB 导出与导入。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html)有关更多信息，请参阅 [Redis 文档](https://docs.redis.com/latest/rc/databases/import-data/)。 | 迁移解决方案架构师、Redis 解决方案架构师 | 
| 选项 2：使用 Redis 复制功能（主动-被动）。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html)有关更多信息，请参阅 [Redis 文档](https://docs.redis.com/latest/rs/databases/import-export/replica-of/)。 | 迁移解决方案架构师、Redis 解决方案架构师 | 
| 选项 3：使用 AWS DMS。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.html) | 迁移解决方案架构师、Redis 解决方案架构师 | 
| 选项 4：采用逻辑数据库合并。 | 此选项包括使用可以转换源数据库物理数据模型、以及生成 RDB 文件的迁移脚本或 ETL 工具。如有必要，Redis Professional Services 可以帮助完成此步骤。 | 迁移解决方案架构师、Redis 解决方案架构师 | 

### 迁移应用程序
<a name="migrate-your-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 调整项目管理时间表与目标。 | 将应用程序层迁移项目目标、里程碑和时间表与 Redis 数据迁移项目的目标、里程碑和时间表保持一致。 | 项目管理 | 
| 调整测试活动。 | 在 Amazon Web Services Cloud 中对应用程序层进行迁移与现代化改造后，将应用程序层指向 AWS 上新迁移的 Redis Enterprise Cloud 进行测试。 | 测试 | 

### 测试
<a name="test"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 实施测试计划。 | 根据测试要求，在您站点的测试环境中运行在实施阶段开发的数据迁移例程和脚本。 | 测试 | 
| 测试数据质量。 | 迁移数据后，测试数据质量。 | 测试 | 
| 测试功能。 | 测试数据查询与应用程序层，确保应用程序的性能与源系统中的性能相同。 | 测试 | 

### 割接
<a name="cut-over"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 做出割接决定。 | 在所有应用程序级和数据库级测试完成后，执行领导团队和利益相关者将根据测试团队确认的最终结果，就是否割接到 AWS 上的新环境做出最终决定。 | 项目管理，商业拥护者 | 
| 割接至 Amazon Web Services Cloud 中。 | 确认一切准备就绪后，将应用程序层指向新迁移的数据，将客户端指向新 Redis Enterprise Cloud system on AWS 系统运行的新应用程序层。 | IT 或 DevOps 工程师、数据架构师、迁移解决方案架构师、Redis 解决方案架构师 | 

## 相关资源
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-resources"></a>

**Redis 资源**
+ [Redis Enterprise Cloud 文档](https://docs.redis.com/latest/rc/)
+ [RIOT](https://github.com/redis-developer/riot) 工具（GitHub 存储库）
+ [Terraform 提供程序](https://registry.terraform.io/providers/RedisLabs/rediscloud/latest)（下载）

**AWS 资源**
+ [迁移演示](https://aws.amazon.com/getting-started/tutorials/)
+ [AWS 合作伙伴解决方案](https://aws.amazon.com/quickstart/)
+ [文档](https://docs.aws.amazon.com/index.html)
+ [博客文章](https://aws.amazon.com/blogs/database/category/migration/)
+ [白皮书](https://aws.amazon.com/whitepapers/)
+ [教程和视频](https://aws.amazon.com/getting-started/tutorials/)
+ [AWS 云迁移](https://aws.amazon.com/cloud-migration/)
+ [AWS 规范指引](https://aws.amazon.com/prescriptive-guidance/)

## 附加信息
<a name="migrate-redis-workloads-to-redis-enterprise-cloud-on-aws-additional"></a>

有关将 Redis 工作负载迁移到 AWS 云的标准安全要求，请参阅 AWS 网站上的[安全、身份与合规最佳实践](https://aws.amazon.com/architecture/security-identity-compliance/)，以及 Redis 网站上的 [Redis 信任中心](https://trust.redis.io/)。

# 使用具有相同主机名的 SAP HSR 将 SAP HANA 迁移至 AWS
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname"></a>

*Pradeep Puliyampatta，Amazon Web Services*

## Summary
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-summary"></a>

可以使用多种选项执行 SAP HANA 向 Amazon Web Services（AWS）的迁移，包含备份和还原、导出和导入以及 SAP HANA 系统复制（HSR）。特定选项的选择取决于源数据库和目标 SAP HANA 数据库间的网络连接、源数据库的大小、停机注意事项和其他因素。 

当源系统和目标系统之间存在稳定的网络并且整个数据库（SAP HANA 数据库复制快照）可以在 1 天内完全复制时，用于将 SAP HANA 工作负载迁移至 AWS 的 SAP HSR 选项效果良好，这是 SAP HSR 网络吞吐量要求所规定的。这种方法的停机时间要求仅限于在目标 AWS 环境上执行接管、SAP HANA 数据库备份和迁移后任务。

SAP HSR 支持使用不同的主机名（映射到不同 IP 地址的主机名）来传输主系统（源系统）与辅助系统或目标系统之间的复制流量。为此，您可通过在 `global.ini` 中的 `[system_replication_hostname_resolution]` 部分定义这些特定的主机名集来实现。在本节中，必须在每台主机定义主站点和辅助站点的所有主机。有关详细配置步骤，请参阅 [SAP 文档](https://help.sap.com/viewer/eb3777d5495d46c5b2fa773206bbfb46/1.0.12/en-US/c0cba1cb2ba34ec89f45b48b2157ec7b.html)。

此设置的关键要点是，主系统中的主机名必须与辅助系统中的主机名不同。否则，可能会出现如下错误。
+ `"each site must have a unique set of logical hostnames"`
+ `"remoteHost does not match with any host of the source site. All hosts of source and target site must be able to resolve all hostnames of both sites correctly"`

但是，通过在目标 AWS 环境中使用相同的 SAP HANA 数据库主机名，可以减少迁移后的步骤数量。 

此模式为使用 SAP HSR 选项时在源环境和目标环境中使用相同主机名提供了一种解决方法。使用此模式，您可使用 SAP HANA 主机名重命名选项。您可为目标 SAP HANA 数据库分配一个临时主机名，以便 SAP HSR 的主机名具有唯一性。迁移完成目标 SAP HANA 环境的接管里程碑后，您可将目标系统的主机名恢复为源系统的主机名。

## 先决条件和限制
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ 带有虚拟专用网络（VPN）端点或路由器的虚拟私有云（VPC）。
+ AWS Client VPN 或 AWS Direct Connect 配置为将文件从源传输到目标。
+ 源环境和目标环境的 SAP HANA 数据库。在相同 SAP HANA 平台版本中，目标 SAP HANA 数据库补丁级别应等于或高于源 SAP HANA 数据库补丁级别。例如：无法在 HANA 1.0 和 HANA 2.0 系统之间设置复制。若要获取更多信息，请参见 SAP Note 第 15 题：1999880 – 常见问题解答：SAP HANA 系统复制。
+ 目标环境的 SAP 应用程序服务器。
+ 在目标环境红的 Amazon Elastic Block Store（Amazon EBS）卷

**限制**

以下 SAP 文档列表涵盖了与此变通方法相关的已知问题，包含与 SAP HANA 动态分层和横向扩展迁移相关的限制：
+ 2956397 — 重命名 SAP HANA 数据库系统失败
+ 2222694 — 尝试重命名 HANA 系统时，会出现以下错误：“源文件不归初始 sidadm 用户所有 (uid = xxxx)”
+ 2607227 — hdblcm：register\$1rename\$1system：重命名 SAP HANA 实例失败
+ 2630562 — HANA 主机名重命名失败且 HANA 无法启动
+ 2935639 — sr\$1register 没有使用 global.ini 部分中 system\$1replication\$1hostname\$1resolution 指定的主机名
+ 2710211 — 错误：源系统和目标系统的逻辑主机名重叠
+ 2693441 — 由于出现错误，无法重命名 SAP HANA 系统
+ 2519672 — HANA 主级和辅助版的系统 PKI SSFS 数据和密钥不同，或无法检查
+ 2457129 — 当动态分层是环境一部分时，不允许重命名 SAP HANA 系统主机
+ 2473002 — 使用 HANA 系统复制迁移横向扩展系统（SAP 在横向扩展 SAP HANA 系统使用这种主机名重命名方法时，SAP 没有提供任何限制。但是，必须在每台主机上重复该过程。其他横向扩展迁移限制也适用于这种方法。）

**产品版本**
+ 此解决方案适用于 SAP HANA 数据库平台 1.0 和 2.0 版。

## 架构
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-architecture"></a>

**源设置**

源环境安装 SAP HANA 数据库。所有 SAP 应用程序服务器连接和数据库接口都采用相同的主机名进行客户机连接。下图显示了示例源主机名 `hdbhost` 及其对应的 IP 地址。

![\[SAP HANA 数据库源 hdbhost 位于企业数据中心，IP 地址为 10.1.2.1。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/004781c1-96df-43dd-a52e-ed1db5bdf9ef/images/a1b28c3a-93b7-4f82-a5da-81008b74c9ae.png)


**目标设置**

 AWS 云 目标环境使用相同的主机名来运行 SAP HANA 数据库。AWS 上的目标环境包含以下内容：
+ SAP HANA 数据库
+ SAP 应用程序服务器
+ EBS 卷

![\[SAP HANA 数据库以 AWS 云中的 hdbhost 为目标，IP 地址为 172.16.2.1。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/004781c1-96df-43dd-a52e-ed1db5bdf9ef/images/7f45d7aa-9b80-4413-bec9-1616492b650c.png)


**中间配置**

在下图中， AWS 目标环境上的主机名被临时重命名`temp-host`为源环境和目标环境的主机名是唯一的。迁移完成目标环境的接管里程碑后，将使用原始名称重命名目标系统的虚拟主机名为 `hdbhost`。

中间配置包含以下选项之一：
+ AWS Client VPN 使用 Client VPN 端点
+ Direct Connect 正在连接路由器

![\[源系统需连接至目标 AWS 云系统，临时主机 IP 地址为 172.31.5.10。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/004781c1-96df-43dd-a52e-ed1db5bdf9ef/images/e2794477-2e8f-4974-bca3-2275f6809fce.png)


 AWS 目标环境上的 SAP 应用程序服务器可以在复制设置之前或接管之后安装。但是，在设置复制之前安装应用程序服务器可帮助减少安装、配置高可用性和备份过程中的停机时间。

## 工具
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-tools"></a>

**AWS 服务**
+ [AWS Client VPN](https://docs.aws.amazon.com/vpn/latest/clientvpn-user/client-vpn-user-what-is.html)是一项基于客户端的托管 VPN 服务，可让您安全地访问本地网络中的 AWS 资源和资源。
+ [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)通过标准的以太网光纤电缆将您的内部网络链接到某个 Direct Connect 位置。通过此连接，您可以直接创建面向公众的虚拟接口 AWS 服务，绕过网络路径中的互联网服务提供商。
+ [亚马逊弹性区块存储 (Amazon EBS](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html)) Elastic Block Store 提供块级存储卷，用于亚马逊弹性计算云 (Ama EC2 zon) 实例。EBS 卷的行为类似于原始、未格式化的块储存设备。您可以将这些卷作为设备挂载在实例上。

**其他工具**
+ [SAP 应用程序服务器](https://help.sap.com/doc/saphelp_nw73ehp1/7.31.19/en-US/47/a032c0305e0b3ae10000000a42189d/content.htm?no_cache=true) — SAP 应用程序服务器为程序员提供了表达业务逻辑的方法。SAP 应用程序服务器根据业务逻辑执行数据处理。实际数据存储在数据库内，该数据库是一个独立的组件。 
+ [SAP HANA cockpit](https://help.sap.com/viewer/6b94445c94ae495c83a19646e7c3fd56/2.0.03/en-US/da25cad976064dc0a24a1b0ee9b62525.html) 和 [SAP HANA Studio](https://help.sap.com/viewer/a2a49126a5c546a9864aae22c05c3d0e/2.0.00/en-US/c831c3bbbb571014901199718bf7edc5.html) – Both SAP HANA cockpit 和 SAP HANA Studio 都为 SAP HANA 数据库提供了管理界面。在 SAP HANA Studio 中，SAP HANA 管理控制台为系统视图，它为 SAP HANA 数据库管理提供相关内容。 
+ [SAP HANA System Replication](https://help.sap.com/viewer/4e9b18c116aa42fc84c7dbfd02111aba/2.0.04/en-US) – SAP HANA System Replication (SAP HSR) 是 SAP 提供的用于复制 SAP HANA 数据库的标准程序。SAP HSR 所需可执行文件是 SAP HANA 服务器内核本身的一部分。

## 操作说明
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-epics"></a>

### 准备源和目标环境
<a name="prepare-the-source-and-target-environments"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装与配置 SAP HANA 数据库。 | 在源环境和目标环境中，确保按照 SAP HANA 最佳实践安装与配置 SAP HANA 数据库。有关更多信息，请参阅[上的 SAP HANA AWS](https://docs.aws.amazon.com/sap/latest/sap-hana/sap-hana.pdf)。 | SAP Basis 管理 | 
| 映射 IP 地址。 | 在目标环境中，确保将临时主机名分配至内部 IP 地址。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname.html) | AWS 管理 | 
| 解析目标主机名。 | 在辅助 SAP HANA 数据库上，通过更新 `/etc/hosts` 文件中的相关主机名，确认已为 SAP HANA 复制网络解析两个主机名（`hdbhost` 和 `temp-host`）。 | Linux 管理 | 
| 备份源与目标 SAP HANA 数据库。 | 使用 SAP HANA Studio 或 SAP HANA cockpit 在 SAP HANA 数据库上执行备份。 | SAP Basis 管理 | 
| 交换系统 PKI 凭证。 | (仅适用于 SAP HANA 2.0 及以上版本)在主数据库和辅助数据库之间的文件系统 (SSFS) 存储区中的系统公钥基础设施 (PKI) 安全存储区中交换凭证。有关更多信息，请参阅 SAP Note 2369981 — 使用 SAP HANA 系统复制进行身份验证所需配置步骤。 | SAP Basis 管理 | 

### 重命名目标 SAP HANA 数据库
<a name="rename-the-target-sap-hana-db"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止目标客户端连接。 | 在目标环境中，关闭 SAP 应用程序服务器与其他客户端连接。 | SAP Basis 管理 | 
| 将目标 SAP HANA 数据库重命名为临时主机名。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname.html)SAP HANA 数据库的停止和启动将由 `hdblcm` 控制。  | SAP Basis 管理 | 
| 分配复制网络。 | 在源系统的 `global.ini` 文件的 `[system_replication_hostname_resolution]` 标题下，提供源和目标复制网络的详细信息。然后将这些条目复制到目标系统的 `global.ini` 文件中。 | SAP Basis 管理 | 
| 在主服务器上启用复制功能。 | 若要在源 SAP HANA 数据库上启用复制，请运行以下命令。 <pre>hdbnsutil -sr_enable --name=siteA</pre> | SAP Basis 管理 | 
| 将目标 SAP HANA 数据库注册至辅助系统。 | 要将目标 SAP HANA 数据库注册为 SAP HSR 的辅助系统，请选择**异步复制**。 <pre>(sid)adm $> HDB stop<br />(sid)adm $> hdbnsutil -sr_register –name=siteB –remotehost=hdbhost /<br />--remoteInstance=00 –replicationMode=async –operationMode=logreplay<br />(sid)adm $> HDB start</pre>或者，您可选择注册 `–online` 选项。在这种情况下，您无需停止和启动 SAP HANA 数据库。 | SAP Basis 管理 | 
| 验证同步。 | 在源 SAP HANA 数据库上，确认所有日志均已应用于目标系统（因为它是异步复制）。若要验证复制，请在源上运行以下命令。<pre>(sid)adm $> cdpy<br />(sidadm $> python systemReplicationStatus.py</pre> | SAP Basis 管理 | 
| 关闭源 SAP 应用程序与 SAP HANA 数据库。 | 在迁移割接期间，关闭源系统 (SAP 应用程序和 SAP HANA 数据库)。 | SAP Basis 管理 | 
| 对目标执行接管。 | 若要在 AWS 上对目标执行接管，请运行命令 `hdbnsutil -sr_takeover`。 | SAP Basis 管理 | 
| 在目标 SAP HANA 数据库，关闭复制。 | 若要清除复制元数据，请运行命令停止目标系统上的复制 `hdbnsutil -sr_disable`。 符合 SAP Note 2693441 — 由于错误，无法重命名 SAP HANA 系统。 | SAP Basis 管理 | 
| 备份目标 SAP HANA 数据库。 | 接管成功后，我们建议执行完整 SAP HANA 数据库备份。 | SAP Basis 管理 | 

### 恢复至目标系统中的原始主机名
<a name="revert-to-the-original-hostname-in-the-target-system"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将目标 SAP HANA 数据库主机名恢复至原始主机名。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname.html)您可根据需要验证其他选项。但是，请确保不要将主机重命名与 SID 更改混为一谈 (SAP Note 2598814 — hdblcm：SID 重命名失败)。 | SAP Basis 管理 | 
| 调节 hdbuserstore。 | 调整指向源 `hdbuserstore` 细节的 `schema/user` 细节。有关详细步骤，请参阅 [SAP 文档](https://help.sap.com/viewer/b3ee5778bc2e4a089d3299b82ec762a7/2.0.02/en-US/ddbdd66b632d4fe7b3c2e0e6e341e222.html?q=hdbuserstore)。 若要验证此步骤，请运行命令 `R3trans -d`。结果应反映成功连接至 SAP HANA 数据库。 | SAP Basis 管理 | 
| 启动客户端连接。 | 在目标环境中，启动 SAP 应用程序服务器和其他客户端连接。 | SAP Basis 管理 | 

## 相关资源
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-resources"></a>

**SAP 参考**

SAP 经常更新 SAP 文档参考资料。若要了解最新信息，请参阅 SAP Note 2407186 — SAP HANA 高可用性操作指南和白皮书。

*附加 SAP 说明*
+ 2550327 — 如何重命名 SAP HANA 系统
+ 1999880 — 常见问题解答：SAP HANA 系统复制
+ 2078425 — SAP HANA 平台生命周期管理工具 hdblcm 故障排除
+ 2592227 — HANA 系统的 FQDN 后缀更改
+ 2048681 — 在没有 SSH 或根凭证的情况下，在多主机系统上执行 SAP HANA 平台生命周期管理管理任务

*SAP 文档*
+ [系统复制网络连接](https://help.sap.com/docs/SAP_HANA_PLATFORM/4e9b18c116aa42fc84c7dbfd02111aba/47190b425eb1433697b026ecd46ff5f9.html)
+ [系统复制的主机名解析](https://help.sap.com/viewer/eb3777d5495d46c5b2fa773206bbfb46/1.0.12/en-US/c0cba1cb2ba34ec89f45b48b2157ec7b.html)

**AWS 参考**
+ [将 SAP HANA 从其他平台迁移到 AWS](https://docs.aws.amazon.com/sap/latest/sap-hana/migrating-hana-hana-to-aws.html)

## 附加信息
<a name="migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname-additional"></a>

作为主机名重命名活动的一部分，`hdblcm` 所执行的更改合并至以下详细日志中。

![\[代码显示进程在临时主机上停止，在 hdbhost 上启动，并且 SAP HANA 数据库系统已重命名。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/004781c1-96df-43dd-a52e-ed1db5bdf9ef/images/9e0c11ca-6555-484f-9639-107f60f725f5.png)


# 使用迁移微软 SQL Server Always On 可用性组 AWS Application Migration Service
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn"></a>

*Sreenivas Nettem、Bharath Kumar Pammi Ramesh、Anantharaman Seshadri 和 Gireesh Sreekantan，Amazon Web Services*

## Summary
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-summary"></a>

AWS Application Migration Service (AWS MGN) 是重新托管中现有环境的首选工具 AWS 云，它允许客户离开本地数据中心。此模式概述了使用 AWS MGN 迁移带有 Microsoft SQL Server Always On 可用性组的 Windows 群集的过程。

## 先决条件和限制
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-prereqs"></a>

**先决条件**
+ 活跃 AWS 账户的.
+ 用于 AWS MGN 编排的 AWS Identity and Access Management (IAM) 角色。
+ 有权限访问源数据库服务器（SQL Server Always On 可用性组）。
+  AWS 着陆区中的 Active Directory 用于保留 DNS 名称。
+ 可与 Active Directory 进行封闭网络通信的暂存子网。
+ 可与 Active Directory 通信的目标子网。
+ 在目标子网中为 Windows 集群保留两个 IP 地址（每个可用区一个）。
+ 在目标子网中为 SQL Always On 侦听器保留两个 IP 地址（每个可用区一个）。

**产品版本**
+ Windows 服务器 2012 或更高版本
+ SQL Server 2012 或更新

## 架构
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-architecture"></a>

**源技术堆栈**

Microsoft Windows 集群（本地物理机或虚拟机）Microsoft SQL Server Always On 可用性组

**目标技术堆栈**

亚马逊 EC2 Windows 实例

**目标架构**

![\[使用 AWS MGN 迁移 SQL Server Always On 可用性的 AWS 架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/aa94040b-5ecf-42f9-90e3-929d0fa5e715/images/0b85c613-51df-475b-9598-3da3f9cd47c6.png)


## 工具
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-tools"></a>

*AWS 服务*
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [AWS Application Migration Service](https://docs.aws.amazon.com/mgn/latest/ug/what-is-application-migration-service.html)帮助您将应用程序重新托管（移动）到， AWS 云 无需更改且停机时间最短。
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。

*其他工具*
+ [Microsoft SQL Server Management Studio (SSMS)](https://learn.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms) 是一款用于管理 SQL Server 的工具，包括访问、配置和管理 SQL Server 组件。

## 最佳实践
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-best-practices"></a>

有关 AWS MGN 的信息，请参阅[最佳实践。 AWS Application Migration Service](https://docs.aws.amazon.com/mgn/latest/ug/best_practices_mgn.html)

## 操作说明
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-epics"></a>

### 准备目标账户
<a name="prepare-the-target-account"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 初始化 AWS MGN。 | 在目标 AWS 区域中初始化 AWS MGN。这将创建所需的 IAM 角色和策略。有关更多信息，请参阅[使用控制台初始化 Application Migration Service](https://docs.aws.amazon.com/mgn/latest/ug/mgn-initialize-console.html)。 | 云管理员 | 
| 创建复制和启动模板。 | 配置与 AWS MGN 一起使用的复制和启动模板。有关更多信息，请参阅 AWS 文档[中的配置模板](https://docs.aws.amazon.com/mgn/latest/ug/mgn-initialization-templates.html)。 | 云管理员 | 
| 允许通信端口。 | 要启用 AWS MGN 的网络通信，请允许通过 TCP 端口 443 和 1500 进行流量。有关更多信息，请参阅 AWS 文档中的[应用程序迁移服务的网络要求](https://docs.aws.amazon.com/mgn/latest/ug/Network-Requirements.html)。 | 云管理员、网络管理员 | 

### 准备源服务器
<a name="prepare-the-source-server"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证 AWS MGN 先决条件。 | 验证源服务器是否满足 AWS MGN 代理安装的先决条件。有关更多信息，请参阅 AWS 文档中的[安装要求](https://docs.aws.amazon.com/mgn/latest/ug/installation-requirements.html)。 | 迁移工程师 | 
| 安装 AWS MGN 代理。 | 在源服务器上安装 AWS MGN 代理。在安装过程中，选择服务器的迁移 AWS 区域 位置。安装后，代理将与服务通信并开始复制。有关更多信息，请参阅[在 Windows 服务器上安装 AWS 复制代理](https://docs.aws.amazon.com/mgn/latest/ug/windows-agent.html)。 | 迁移工程师 | 
| 检查源服务器的状态。 | 在 AWS MGN 控制台中，检查源服务器的状态。复制开始时，服务器会显示**已准备就绪，可进行测试**。如果您遇到任何错误，请参阅 AWS MGN 文档中的[通信错误疑难解答](https://docs.aws.amazon.com/mgn/latest/ug/Troubleshooting-Communication-Errors.html)。 | 云管理员、迁移工程师 | 
| 优化复制设置。 | SQL Always On 群集使用从主服务器到辅助服务器的高 I/O 同步复制。若要优化复制并避免延迟，请为每个 SQL Always On 服务器使用[专用的复制服务器](https://docs.aws.amazon.com/mgn/latest/ug/replication-settings-template.html)。**如果数据库大于 5 TB，请考虑选择更大的复制服务器实例，例如 **m5.large**，而不是默认的 t3.small**。 | 云管理员、迁移工程师 | 
| 创建启动模板。 | 更新[启动设置](https://docs.aws.amazon.com/mgn/latest/ug/launch-settings.html)，并为 SQL Always On 服务器选择子网。 AWS 可用区 为了实现高可用性，SQL Always On 群集服务器分布在不同的服务器上。 | 迁移工程师、迁移主管 | 
| 更新启动设置。 | 根据您的大小和性能要求，在启动设置中更新实例类型和每秒 input/output 操作数 (IOPS)。（可选）在启动设置中选择现有的弹性网络接口。 | 迁移工程师、迁移主管 | 

### 测试割接
<a name="test-cutover"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证源服务器。 | 在 AWS MGN 控制台中，验证源服务器状态是否为 “**准备测试**”。 | 云管理员、迁移工程师 | 
| 启动测试实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-microsoft-sql-server-always-on-group-using-mgn.html) | 云管理员、迁移工程师 | 
| 测试连通性和数据库完整性。 | 对测试实例的连通性和数据库完整性进行测试。然后在 M AWS GN 控制台中将源服务器标记为 “**准备好切换**”。 | 云管理员、迁移工程师 | 

### 预迁移任务
<a name="pre-migration-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 测试数据库的完整性。 | 这有助于确保在迁移之前，源数据库没有完整性问题。运行 `DBCC CHECKDB` 并指定 `WITH_PHYSICAL_ONLY`。在不使用 `WITH_PHYSICAL_ONLY` 的情况下运行此检查，可能导致源端出现性能问题。为维护数据库完整性，请每周对数据库进行一次全面检查。这些命令通过检测潜在的损坏问题来检查数据库的逻辑和物理完整性。检查时会验证数据库的结构，例如页面、行、索引和系统表。 | 数据工程师、数据库管理员 | 
| 测试与链接服务器的连接。 | 测试所有现有服务器之间的连接，并记录其状态。这有助于确保链接服务器在迁移后仍按预期运行。 | 数据工程师、数据库管理员 | 
| 验证备份。 | 确认源备份的完整性。 | 数据工程师、数据库管理员 | 

### AWS MGN 切换
<a name="aws-mgn-cutover"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止 SQL 服务器和集群服务。 | 停止所有 SQL 集群节点上的 SQL Server 和 Microsoft 集群服务。 | 数据库管理员、迁移工程师 | 
| 验证服务器。 | **在 AWS MGN 控制台中，验证源服务器的状态是否为 “**准备切换**”，以及数据复制状态是否为 “正常”。** | 迁移工程师 | 
| 启动割接。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-microsoft-sql-server-always-on-group-using-mgn.html)有关更多信息，请参阅 AWS MG [N 文档中的启动直接转换实例](https://docs.aws.amazon.com/mgn/latest/ug/launch-cutover-gs.html)。 | 迁移工程师 | 
| 测试启动的服务器。 | 登录已启动的 Amazon EC2 实例并验证集群的运行状况。确认服务器位于正确的子网中、实例大小和 IOPS 设置正确，且见证服务器可供访问。 | 数据库管理员、迁移工程师 | 

### 数据库割接后任务
<a name="database-post-cutover-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 更新集群 IP 地址。 | 使用目标子网中保留的两个 IP 地址更新 Windows 集群的集群 IP 地址。有关更多信息，请参阅[更改失效转移集群实例的 IP 地址](https://learn.microsoft.com/en-us/sql/sql-server/failover-clusters/windows/change-the-ip-address-of-a-failover-cluster-instance?view=sql-server-2016)。 | 数据库管理员、迁移工程师 | 
| 更新 Always On 可用性组侦听器 IPs。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-microsoft-sql-server-always-on-group-using-mgn.html) | 数据库管理员、迁移工程师 | 
| 验证连接。 | 使用 SSMS 连接到 Always On 可用性组侦听器，并确认连接成功。 | 数据库管理员、迁移工程师 | 
| 检查 Always On 可用性组的运行状况。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-microsoft-sql-server-always-on-group-using-mgn.html) | 数据库管理员、迁移工程师 | 
| 检查错误日志。 | 打开错误日志，并验证所报告的有关 SQL Server 实例的所有错误。确保所有数据库的恢复工作都已完成。 | 数据库管理员、迁移工程师 | 
| 测试链接的服务器。 | 测试与链接服务器的连接。如果出现任何连接问题，请确保可以访问目标服务器和端口。 | 数据库管理员、迁移工程师 | 

### 完成割接
<a name="finalize-the-cutover"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 完成割接。 | 验证目标 SQL Always On 集群后，通过 AWS MGN 控制台[完成](https://docs.aws.amazon.com/mgn/latest/ug/launch-cutover-gs.html#revert-finalize-cutover-gs)切换。这将停止从源服务器复制数据，并丢弃复制服务器中的数据。还会移除复制服务器及其关联资源。 | 云管理员、迁移工程师 | 

## 问题排查
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| AWS MGN 疑难解答 | 有关常见问题和解决方案，请参阅 AWS MGN 文档中的[故障排除](https://docs.aws.amazon.com/mgn/latest/ug/troubleshooting.html)和[常见问题解答](https://docs.aws.amazon.com/mgn/latest/ug/FAQ.html)部分。 | 

## 相关资源
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-resources"></a>

*AWS resources*
+ [选项 1 重新托管-() AWS Application Migration ServiceAWS](https://catalog.us-east-1.prod.workshops.aws/workshops/c6bdf8dc-d2b2-4dbd-b673-90836e954745/en-US/04-application-migration/01-mgn)
+ [什么是 AWS Application Migration Service？](https://docs.aws.amazon.com/mgn/latest/ug/what-is-application-migration-service.html)

*SQL Server 资源*
+ [什么是 SQL Server Management Studio（SSMS）？](https://learn.microsoft.com/en-us/ssms/sql-server-management-studio-ssms)

## 附加信息
<a name="migrate-microsoft-sql-server-always-on-group-using-mgn-additional"></a>

有关将工作负载迁移到的标准安全要求 AWS 云，请参阅 AWS 网站上的[安全、身份和合规性最佳实践](https://aws.amazon.com/architecture/security-identity-compliance/)。

# 使用分布式可用性组将 SQL Server 迁移至 AWS
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups"></a>

*Praveen Marthala，Amazon Web Services*

## Summary
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups-summary"></a>

Microsoft SQL Server Always On 可用性组为 SQL Server 提供了高可用性 (HA) 和灾难恢复 (DR) 解决方案。可用性组由一个接受 read/write 流量的主副本和最多八个接受读取流量的辅助副本组成。可用性组是在具有两个或更多节点的 Windows 服务器失效转移群集 (WSFC) 上配置。

Microsoft SQL Server Always On 分布式可用性组提供了一种在两个独立可用性组之间配置两个独立可用性组的解决方案 WFSCs。属于分布式可用性组的可用性组不必位于同一数据中心。一个可用性组可以位于本地，另一个可用性组可以位于另一个域中的亚马逊云服务 (AWS) 云上的亚马逊弹性计算云 (Amazon EC2) 实例上。 

此模式概述了使用分布式可用性组将属于现有可用性组的本地 SQL Server 数据库迁移到在 Amazon 上设置可用组的 SQL Server 的步骤 EC2。通过遵循该模式，您可以将数据库迁移至 Amazon Web Services Cloud 中，同时最大限度地减少割接期间的停机时间。割接后，这些数据库立即在 AWS 上具有高可用性。您还可使用此模式将底层操作系统从本地更改为 AWS，同时保持相同版本的 SQL Server。

## 先决条件和限制
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ AWS Direct Connect 或 AWS Site-to-Site VPN
+ 安装在本地和 AWS 上的两个节点上相同版本 SQL Server 

**产品版本**
+ SQL Server 版本 2016 和更高版本
+ SQL Server 企业版

## 架构
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups-architecture"></a>

**源技术堆栈**
+ 本地具有 Always On 可用性组的 Microsoft SQL Server 数据库

**目标技术堆栈**
+ AWS 云端亚马逊 EC2 上带永久开启可用组的微软 SQL Server 数据库

**迁移架构**

![\[在本地和 AWS 上的可用性组中实现同步复制的 SQL Server。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6e229e30-9b11-4ccb-bccd-cbe6601139c0/images/79ee7911-d68f-4db7-9b94-113dcf09c28b.png)


*术语*
+ WSFC 1 — WSFC 本地
+ WSFC 2 — Amazon Web Services Cloud 上的 WSFC
+ AG 1 — 第一可用性组，位于 WSFC 1 中
+ AG 2 — 第二可用性组，位于 WSFC 2 中
+ SQL Server 主副本 — AG 1 中被视为写入操作的全局主节点
+ SQL Server 转发程序 — AG 2 中从 SQL Server 主副本异步接收数据的节点
+ SQL Server 辅助副本 — AG 1 或 AG 2 中同步接收来自主副本或转发器数据的节点

## 工具
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups-tools"></a>
+ [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) – AWS Direct Connect 通过标准的以太网光纤电缆将您的内部网络链接到 AWS Direct Connect 位置。通过此连接，您可以创建直接连接到公有 Amazon Web Services 的*虚拟接口*，从而绕过网络路径中的互联网服务提供商。
+ [亚马逊 EC2](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/concepts.html) — 亚马逊弹性计算云 (Amazon EC2) 在 AWS 云中提供可扩展的计算容量。您可以根据需要使用 Amazon EC2 启动任意数量或数量的虚拟服务器，也可以进行横向扩展或扩展。
+ [AWS Site-to-Site VP](https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html) Site-to-Site N — AWS VPN 支持创建 site-to-site虚拟专用网络 (VPN)。您可以将 VPN 配置为在 AWS 上启动的实例和您自己的远程网络之间传递流量。
+ [Microsoft SQL Server Management Studio](https://docs.microsoft.com/en-us/sql/ssms/sql-server-management-studio-ssms?view=sql-server-ver15) – Microsoft SQL Server Management Studio (SSMS) 是一个用于管理 SQL Server 基础设施的集成环境。它提供了用户界面和一组工具，其中包含与 SQL Server 交互的丰富脚本编辑器。

## 操作说明
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups-epics"></a>

### 在 AWS 上设置第二可用性组
<a name="set-up-a-second-availability-group-on-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AWS 上创建 WSFC。 | 在带有两个节点的 Amazon EC2 实例上创建 WSFC 2，用于 HA。您将使用此失效转移群集在 AWS 上创建第二可用性组 (AG 2)。 | 系统管理员、 SysOps 管理员 | 
| 在 WSFC 2 上创建第二可用性组。 | 使用 SSMS 在 WSFC 2 中的两个节点创建 AG 2。WSFC 2 中的第一节点将充当转发器。WSFC 2 中的第二节点将作为 AG 2 的辅助副本。在此阶段，AG 2 中没有可用数据库。其为设置分布式可用性组的起点。 | 数据库管理员、开发人员 | 
| 在 AG 2 上创建无恢复选项的数据库。 | 备份本地可用性组 (AG 1) 数据库。 在没有恢复选项的情况下，将数据库还原至 AG 2 的转发器和辅助副本。还原数据库时，请指定足够磁盘空间，以存放数据库数据文件和日志文件。在该阶段，数据库处于还原状态。它们不是 AG 2 或分布式可用性组的一部分，也非同步。 | 数据库管理员、开发人员 | 

### 配置分布式可用性组
<a name="configure-the-distributed-availability-group"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AG 1 上创建分布式可用性组。 | 要在 AG 1 上创建分布式可用性组，请使用带 `DISTRIBUTED` 选项的 `CREATE AVAILABILITY GROUP`。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-sql-server-to-aws-using-distributed-availability-groups.html) | 数据库管理员、开发人员 | 
| 在 AG 2 上创建分布式可用性组。 | 要在 AG 2 上创建分布式可用性组，请通过 `DISTRIBUTED` 选项使用 `ALTER AVAILABILITY GROUP`。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-sql-server-to-aws-using-distributed-availability-groups.html)分布式可用性组在 AG 1 和 AG 2 间创建。AG 2 中的数据库尚未配置为：参与从 AG 1 到 AG 2 的数据流。 | 数据库管理员、开发人员 | 
| 将数据库添加至 AG 2 上的转发器和辅助副本。 | 在 AG 2 的转发器和辅助副本中使用 `SET HADR` `AVAILABILITY GROUP` 选项的 `ALTER DATABASE` 将数据库添加到分布式可用性组。 这将启动 AG 1 和 AG 2 上的数据库间的异步数据流。 全局主服务器接受写入，将数据同步发送至 AG 1 上的辅助副本，并异步向 AG 2 上的转发器发送数据。AG 2 上的转发器将数据同步发送至 AG 2 上的辅助副本。 | 数据库管理员、开发人员 | 

### 监控 AG 1 和 AG 2 间的异步数据流
<a name="monitor-asynchronous-data-flow-between-ag-1-and-ag-2"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用 DMVs 和 SQL Server 日志。 | 使用动态管理视图 (DMVs) 和 SQL Server 日志，监控两个可用性组之间数据流的状态。 DMVs 值得监视的内容包括`sys.dm_hadr_availability_replica_states`和`sys.dm_hadr_automatic_seeding`。要了解转发器同步的状态，在转发器上的 SQL Server 日志中监控*同步状态*。 | 数据库管理员、开发人员 | 

### 为最终迁移执行割接活动
<a name="perform-cutover-activities-for-final-migration"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止所有流向主副本流量。 | 在 AG 1 中阻止主副本传入流量，这样数据库上就不会发生写入活动，数据库就可以迁移了。 | 应用程序所有者、开发人员 | 
| 更改 AG 1 上的分布式可用性组的可用性模式。 | 在主副本上，将分布式可用性组可用性模式设置为同步。 将可用性模式更改为同步模式后，数据将从 AG 1 主副本同步发送至 AG 2 中的转发器。 | 数据库管理员、开发人员 | 
|  LSNs 在两个可用性组中选中。 | 检查 AG 1 和 AG 2 中的最后一个日志序列号 (LSNs)。由于 AG 1 的主副本中没有发生写入操作，因此数据已同步，两个可用性组的最后一次 LSNs 数据应匹配。 | 数据库管理员、开发人员 | 
| 将 AG 1 更新至辅助角色。 | 当您将 AG 1 更新至辅助角色时，AG 1 将失去主副本角色并且不接受写入，两个可用性组之间的数据流将停止。 | 数据库管理员、开发人员 | 

### 故障转移至第二个可用性组
<a name="fail-over-to-the-second-availability-group"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 手动故障转移至 AG 2。 | 在 AG 2 的转发器，更改分布式可用性组以允许数据丢失。由于您已经检查并确认 AG 1 和 AG 2 LSNs 上的最后一个匹配，因此数据丢失不是问题。当您允许 AG 2 中转发器的数据丢失时，AG 1 和 AG 2 的角色会发生变化：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-sql-server-to-aws-using-distributed-availability-groups.html) | 数据库管理员、开发人员 | 
| 更改 AG 2 上的分布式可用性组的可用性模式。 | 在 AG 2 主副本上，将可用性模式更改为异步。这会将数据从 AG 2 移动至 AG 1、从同步移动更改为异步移动。此步骤是为了避免 AG 2 和 AG 1 间的网络延迟（如有），并且不会影响数据库的性能。 | 数据库管理员、开发人员 | 
| 开始向新主副本发送流量。 | 更新连接字符串，以使用 AG 2 上的侦听器 URL 端点向数据库发送流量。AG 2 现在接受写入并向 AG 1 中转发器发送数据，同时在 AG 2 中将数据发送到自己的辅助副本。数据从 AG 2 异步移动至 AG 1。 | 应用程序所有者、开发人员 | 

### 执行割接后的活动
<a name="perform-post-cutover-activities"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AG 2 上删除分布式可用性组。 | 在计划时间内监控迁移情况。在 AG 2 上删除分布式可用性组，以删除 AG 2 和 AG 1 之间的分布式可用性组设置。这将删除分布式可用性组配置，从 AG 2 至 AG 1 的数据流将停止。 目前，AG 2 在 AWS 上具有高可用性，主副本需写入，辅助副本位于同一个可用性组中。 | 数据库管理员、开发人员 | 
| 停用本地服务器。 | 停用属于 AG 1 的 WSFC 1 中的本地服务器。 | 系统管理员、 SysOps 管理员 | 

## 相关资源
<a name="migrate-sql-server-to-aws-using-distributed-availability-groups-resources"></a>
+ [分布式可用性组](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-sql-server/distributed-groups.html)
+ [SQL 文档： 分布式可用性组](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/distributed-availability-groups?view=sql-server-ver15)
+ [SQL 文档：Always On 可用性组：高可用性和灾难恢复解决方案](https://docs.microsoft.com/en-us/sql/database-engine/availability-groups/windows/always-on-availability-groups-sql-server?view=sql-server-ver15)

# 将关系数据库迁移到 MongoDB Atlas AWS
<a name="migrate-relational-database-to-mongodb-atlas"></a>

*Battulga Purevragchaa 和 Igor Alekseev，Amazon Web Services*

*Babu Srinivasan，MongoDB*

## Summary
<a name="migrate-relational-database-to-mongodb-atlas-summary"></a>

此模式描述了如何从 SQL Server、MySQL、PostgreSQL 等关系数据库迁移到 AWS 云中的 MongoDB Atlas。它使用 [MongoDB Relational Migrator](https://www.mongodb.com/products/relational-migrator) 来帮助加速从关系数据库到 MongoDB Atlas 的数据迁移。

该模式与规范性指导网站上的《[迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/)》 AWS 指南一起出现。其中提供了适用于该指南中讨论的其中一个迁移场景的实施步骤。有关其他迁移方案，请参阅 AWS 规范性指导网站上的以下模式：
+ [将自托管 MongoDB 环境迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud.html)
+ [将数据从 IBM Db2、SAP、Sybase 和其他数据库流式传输到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/stream-data-from-ibm-db2-to-mongodb-atlas.html)

该模式适用于 [AWS 系统集成商 (SI) 合作伙伴](https://aws.amazon.com/managed-services/partners/)和 AWS 用户。

## 先决条件和限制
<a name="migrate-relational-database-to-mongodb-atlas-prereqs"></a>

**先决条件**
+ 要迁移到 MongoDB Atlas 的源关系数据库（Oracle 数据库、SQL Server、Postgre SAP/Sybase SQL、MySQL、ASE 等）。
+ 熟悉关系数据库、MongoDB Atlas 和。 AWS 服务此模式从宏观层面阐述了部分迁移步骤。更多细节将在后续版本中添加。

**产品版本**
+ MongoDB 版本 5.0 或更高版本

## 架构
<a name="migrate-relational-database-to-mongodb-atlas-architecture"></a>

下图显示了如何从关系数据库管理系统（RDBMS）数据库迁移到 AWS上的 MongoDB Atlas。

![\[从 RDBMS 迁移到 AWS 上的 MongoDB Atlas 的架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/4e3ea0f1-21e8-4641-a9ee-732355f20baf/images/8eacf3ec-f480-4912-9002-6a50800fe9bf.png)


有关支持不同使用场景的 MongoDB Atlas 参考架构，请参阅规范性指南网站上的[迁移到 MongoDB](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/architecture.html) Atlas。 AWS AWS 

## 工具
<a name="migrate-relational-database-to-mongodb-atlas-tools"></a>
+ [MongoDB](https://www.mongodb.com/atlas) Atlas 是一种完全托管的数据库即服务，用于在DBaa云中部署和管理 MongoDB 数据库。
+ [MongoDB Relational Migrator](https://www.mongodb.com/products/relational-migrator) 可将数据从传统关系数据库顺畅迁移到 MongoDB。它可帮助实现转换过程的自动化，并将关系数据库的结构化数据模型转换为 MongoDB 提供的灵活文档格式。Relational Migrator 保留了数据的完整性和关系，以简化迁移。组织既能利用 MongoDB 提供的可扩展性、高性能和多功能性优势，又能保留对现有数据的熟悉度。

## 最佳实践
<a name="migrate-relational-database-to-mongodb-atlas-best-practices"></a>

有关在 AWS上使用 MongoDB 的最佳实践，请参阅合作伙伴网络博客[AWS 上的](https://aws.amazon.com/blogs/apn/tag/mongodb-atlas/)帖子。

## 操作说明
<a name="migrate-relational-database-to-mongodb-atlas-epics"></a>

### 发现与评测
<a name="discovery-and-assessment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确定关系数据库的参数和大小。 | 使用 Relational Migrator 的建议以及 `db.stats()` 提供的总索引空间信息来估算工作集的大小。假设您的数据空间中有一定比例会被频繁访问。此任务大约需要一周时间。有关此场景以及此操作说明中其他场景的详细信息和示例，请参阅[相关资源](#migrate-relational-database-to-mongodb-atlas-resources)部分。 | 应用程序所有者，数据库管理员 | 
| 估计网络带宽要求。 | 要估计网络带宽要求，请将平均文档大小乘以每秒提供的文档数量。考虑集群中任何节点将承受的最大流量作为基础。要计算从集群到客户端应用程序的下游数据传输速率，请使用一段时间内返回的文档总数的总和。如果您的应用程序从辅助节点读取数据，请将文档总数除以可以提供读取操作的节点数。要查找数据库的平均文档大小，请使用 `db.stats().avgObjSize` 命令。此任务通常需要一天的时间。 | 数据库管理员 | 
| 选择 Atlas 层。 | 按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/sizing-tier-selection/)中的说明选择正确的 Atlas 集群层。 | 数据库管理员 | 
| 制定割接计划。 | 制定应用程序割接计划。 | 数据库管理员、应用程序所有者 | 

### 在上设置新的 MongoDB Atlas 环境 AWS
<a name="set-up-a-new-mongodb-atlas-environment-on-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在上创建新的 MongoDB Atlas 集群。 AWS | 在 MongoDB Atlas 中，选择**构建集群**。在 “**创建新集群**” 对话框中，选择 AWS 作为云提供商。 | 数据库管理员 | 
| 选择 AWS 区域 和全局群集配置。 | 从适用于您的 Atlas 集群 AWS 区域 的列表中进行选择。如果需要，请配置全局集群。 | 数据库管理员 | 
| 选择集群层。 | 选择您的首选集群层。您的层选择决定了内存、存储和 IOPS 规格等因素。 | 数据库管理员 | 
| 配置其他集群设置。 | 配置其他集群设置，例如 MongoDB 版本、备份和加密选项。有关这些选项的更多信息，请参阅[相关资源](#migrate-relational-database-to-mongodb-atlas-resources)部分。 | 数据库管理员 | 

### 配置安全性和合规性
<a name="configure-security-and-compliance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置访问列表。 | 要连接到 Atlas 集群，您必须在项目的访问列表中添加一个条目。Atlas TLS/SSL 用于加密数据库与虚拟私有云 (VPC) 的连接。若要设置项目的访问列表以及有关此操作说明中的场景的详细信息，请参阅[相关资源](#migrate-relational-database-to-mongodb-atlas-resources)部分。 | 数据库管理员 | 
| 对用户进行身份验证和授权。 | 您必须创建并验证将访问 MongoDB Atlas 集群的数据库用户。要访问项目中的集群，用户必须属于该项目，并且可以属于多个项目。 | 数据库管理员 | 
| 创建自定义角色。 | （可选）Atlas 支持在内置的 Atlas 数据库用户权限未涵盖所需权限集的情况下创建自定义角色。 | 数据库管理员 | 
| 设置 VPC 对等连接。 | （可选）Atlas 支持与其他[开启的 VPC](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) VPCs 对等。 AWS | AWS 管理员 | 
| 设置 AWS PrivateLink 终端节点。 | （可选）您可以使用在上 AWS 设置私有终端节点 AWS PrivateLink。有关更多信息，请参阅 [Amazon VPC 文档](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)。 | AWS 管理员 | 
| 启用双因素身份验证。 | （可选）Atlas 支持双因素身份验证 (2FA)，以帮助用户控制对其 Atlas 账户的访问。 | AWS 管理员 | 
| 使用 LDAP 设置用户身份验证和授权。 | （可选）Atlas支持使用轻量级目录访问协议 (LDAP) 执行用户身份验证和授权。 | 数据库管理员 | 
| 设置统一 AWS 接入。 | （可选）某些 Atlas 功能（包括 Atlas Data Lake 和使用客户密钥管理进行静态加密）使用 AWS Identity and Access Management (IAM) 角色进行身份验证。 | AWS 管理员 | 
| 使用设置静态加密 AWS KMS。 | （可选）Atlas 支持使用 AWS Key Management Service (AWS KMS) 加密存储引擎和云提供商备份。 | AWS 管理员 | 
| 设置客户端字段级加密。 | （可选）Atlas 支持客户端字段级加密，包括字段的自动加密。 | AWS 管理员 | 

### 迁移数据
<a name="migrate-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 MongoDB Relational Migrator 添加到访问列表中。 | 将 Relational Migrator 添加到源数据库的访问列表。这有助于准备源环境以连接到目标 Atlas 集群。 | 数据库管理员 | 
| 评估关系数据库对象。 | 启动 MongoDB Relational Migrator 并连接到您的关系数据库。开始评估。 | 数据库管理员 | 
| 接受迁移模式或选择根据业务需求对其进行更改。 | 接受 Relational Migrator 根据初始评估和性能参数推荐的数据库模式，或者选择根据您的业务需求对其进行更改。 | 数据库管理员 | 
| 在 MongoDB Atlas 中启动目标副本集。 | 在 MongoDB Atlas 中启动目标副本集。在 Relational Migrator 中，选择**我已准备好迁移**。 | 数据库管理员 | 

### 配置操作集成
<a name="configure-operational-integration"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 连接到 MongoDB Atlas 集群。 | 确保 MongoDB Atlas 集群连接按预期运行。 | 应用程序所有者 | 
| 与集群数据交互。 | 验证集群数据。 | 数据库管理员 | 
| 监控您的集群。 | 验证集群设置是否正确。 | 数据库管理员 | 
| 备份和恢复集群数据。 | 为集群数据安排定期备份计划。 | 数据库管理员 | 

## 相关的资源
<a name="migrate-relational-database-to-mongodb-atlas-resources"></a>

除非另有说明，否则以下所有链接均指向 MongoDB 文档中的网页。

**迁移指南**
+ [在（规范性指南）上迁移到 MongoDB Atla AWS s](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/)AWS 

**发现与评测**
+ [内存](https://docs.atlas.mongodb.com/sizing-tier-selection/#memory)
+ [使用 Atlas 示例数据集进行大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--the-service-sample-data-sets)
+ [移动应用程序的大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--mobile-app)
+ [网络流量](https://docs.atlas.mongodb.com/sizing-tier-selection/#network-traffic)
+ [集群自动扩缩](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#cluster-auto-scaling)
+ [Atlas 大小调整模板](https://view.highspot.com/viewer/5f438f47a4dfa042e97130c5)

**配置安全性和合规性**
+ [配置 IP 访问列表条目](https://docs.atlas.mongodb.com/security/ip-access-list/)
+ [配置数据库用户](https://docs.atlas.mongodb.com/security-add-mongodb-users/)
+ [配置对 Atlas UI 的访问权限](https://docs.atlas.mongodb.com/organizations-projects/)
+ [配置自定义数据库角色](https://docs.atlas.mongodb.com/security-add-mongodb-roles)
+ [配置数据库用户](https://docs.atlas.mongodb.com/security-add-mongodb-users/#atlas-user-privileges)
+ [设置网络对等连接](https://docs.atlas.mongodb.com/security-vpc-peering/)
+ [了解 Atlas 中的私有端点](https://docs.atlas.mongodb.com/security-private-endpoint/)
+ [管理多重身份验证选项](https://docs.atlas.mongodb.com/security-two-factor-authentication/)
+ [使用 LDAP 设置用户身份验证和授权](https://docs.atlas.mongodb.com/security-ldaps/)
+ [Atlas 数据湖](https://docs.mongodb.com/datalake/)
+ [使用客户密钥管理进行静态加密](https://docs.atlas.mongodb.com/security-kms-encryption/)
+ [承担角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)（IAM 文档）
+ [客户端字段级加密](https://docs.mongodb.com/manual/core/security-client-side-encryption)
+ [自动加密](https://docs.mongodb.com/manual/core/security-automatic-client-side-encryption) 
+ [MongoDB Atlas 安全控制](https://webassets.mongodb.com/_com_assets/cms/MongoDB_Atlas_Security_Controls-v7k3rbhi3p.pdf)
+ [MongoDB 信任中心](https://www.mongodb.com/cloud/trust)
+ [为集群配置安全功能](https://docs.atlas.mongodb.com/setup-cluster-security/)

**在 **AWS** 上设置新的 MongoDB Atlas 环境**
+ [云提供商和地区](https://docs.atlas.mongodb.com/cloud-providers-regions/)
+ [管理全局集群](https://docs.atlas.mongodb.com/global-clusters/)
+ [选择集群层级](https://www.mongodb.com/docs/atlas/manage-clusters/#select-cluster-tier)
+ [配置其他设置](https://docs.atlas.mongodb.com/cluster-additional-settings/)
+ [开始使用 Atlas](https://docs.atlas.mongodb.com/getting-started/)
+ [配置对 Atlas UI 的访问权限](https://docs.atlas.mongodb.com/organizations-projects/)

**迁移数据**
+ [迁移或导入数据](https://www.mongodb.com/docs/atlas/import/)

**监控集群**
+ [监控您的集群](https://docs.atlas.mongodb.com/monitoring-alerts/)

**集成操作**
+ [连接到集群](https://docs.atlas.mongodb.com/connect-to-cluster/)
+ [与您的数据交互](https://docs.atlas.mongodb.com/data-explorer/)
+ [监控您的集群](https://docs.atlas.mongodb.com/monitoring-alerts/)
+ [备份、恢复和存档数据](https://docs.atlas.mongodb.com/backup-restore-cluster/)

# 将自托管 MongoDB 环境迁移到 MongoDB Atlas AWS
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud"></a>

*Battulga Purevragchaa 和 Igor Alekseev，Amazon Web Services*

*Babu Srinivasan，MongoDB*

## Summary
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-summary"></a>

此模式描述了如何从自管理式 MongoDB 环境（包括 MongoDB Community Server、Enterprise Server、Enterprise Advanced、mLab 或任何托管的 MongoDB 集群）迁移到 AWS 云上的 MongoDB Atlas。它使用 [Atlas Live Migration Service](https://www.mongodb.com/cloud/atlas/migrate) 来帮助加速从 MongoDB 到 MongoDB Atlas 的数据迁移。

该模式与规范性指导网站上的《[迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/)》 AWS 指南一起出现。其中提供了适用于该指南中讨论的其中一个迁移场景的实施步骤。有关其他迁移方案，请参阅 AWS 规范性指导网站上的以下模式：
+ [将关系数据库迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-relational-database-to-mongodb-atlas.html)
+ [将数据从 IBM Db2、SAP、Sybase 和其他数据库流式传输到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/stream-data-from-ibm-db2-to-mongodb-atlas.html)

该模式适用于[AWS 系统集成商 (SI) 合作伙伴](https://aws.amazon.com/managed-services/partners/)和 AWS 用户。

## 先决条件和限制
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-prereqs"></a>

**先决条件**
+ 一个可迁移到 MongoDB Atlas 的源 MongoDB Enterprise Advanced、Community Server 或其他自管理式 MongoDB 环境。
+ 熟悉 MongoDB、MongoDB Atlas 和。 AWS 服务此模式从宏观层面阐述了部分迁移步骤。更多细节将在后续版本中添加。

**产品版本**
+ MongoDB 版本 6.0.13 或更高版本

## 架构
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-architecture"></a>

下图显示了 Atlas Live Migration Service，用于将数据从 MongoDB Enterprise Advanced 数据库和 MongoDB Community 数据库迁移到 AWS上的 MongoDB Atlas。如果您需要将大型复杂数据库迁移到 MongoDB Atlas，同时最大限度地减少停机时间并实现持续的数据同步，请使用此服务。此模式使用 Atlas Live Migration Service。

![\[使用 MongoDB Atlas Live Migration Service 迁移数据。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/52cdb923-64ff-4ee2-b129-93b9a139e24b/images/372134c4-ba47-4e48-bd0d-8b43017773b8.png)


下图显示了 MongoDB 镜像服务 `mongomirror` ()，您还可以使用该服务通过安全连接将数据从 MongoDB 企业高级数据库和 MongoDB 社区数据库迁移到 MongoDB Atlas。 AWS [AWS PrivateLink](https://aws.amazon.com/privatelink/)使用 `mongomirror` 在本地 MongoDB 和 MongoDB Atlas 之间进行持续复制数据。此工具非常适合用于灾难恢复或分阶段迁移，但不在此模式的范围之内。

![\[使用 mongomirror 工具迁移数据。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/52cdb923-64ff-4ee2-b129-93b9a139e24b/images/53488a9b-2210-4b3d-b517-b618c1e0182c.png)


有关更多支持不同使用场景的 MongoDB Atlas 参考架构，请参阅规范性指南网站上的[迁移到 MongoDB](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/architecture.html) Atlas。 AWS AWS 

## 工具
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-tools"></a>
+ [MongoDB Atlas](https://www.mongodb.com/atlas) 是一种完全托管式数据库即服务（DbaaS），用于在云中部署和管理 MongoDB 数据库。
+ [Atlas Live Migration Service](https://www.mongodb.com/cloud/atlas/migrate) 是免费的 MongoDB 实用程序，可帮助将数据库迁移到 Atlas。此服务使源数据库与目标数据库保持同步，直到直接割接。当您准备好割接时，您可以停止应用程序实例，将它们指向目标 Atlas 集群，然后重新启动它们。要访问此服务，请从 MongoDB Atlas 集群中选择**数据库选项**。
+ [mongomirror](https://www.mongodb.com/docs/atlas/import/mongomirror/) 用于手动将数据从现有 MongoDB 副本集迁移到 MongoDB Atlas 副本集。`mongomirror` 不需要您关闭现有的副本集或应用程序，不会导入用户或角色数据，也不会复制配置数据库。可以从 [MongoDB 文档](https://www.mongodb.com/docs/atlas/import/mongomirror/#download-mongomirror)下载 `mongomirror`。

## 最佳实践
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-best-practices"></a>

有关在 AWS上使用 MongoDB 的最佳实践，请参阅合作伙伴网络博客[AWS 上的](https://aws.amazon.com/blogs/apn/tag/mongodb-atlas/)帖子。

## 操作说明
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-epics"></a>

### 发现与评测
<a name="discovery-and-assessment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确定集群大小。 | 使用 `db.stats()` 中关于总索引空间的信息来估计工作集大小。假设您的数据空间中有一定比例会被频繁访问。或者，您可以根据自己的假设来估计内存需求。此任务大约需要一周时间。有关此场景以及此操作说明中其他场景的详细信息和示例，请参阅[相关资源](#migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-resources)部分。 | 数据库管理员、应用程序所有者 | 
| 估计网络带宽要求。 | 要估计网络带宽要求，请将平均文档大小乘以每秒提供的文档数量。考虑集群中任何节点将承受的最大流量作为基础。要计算从集群到客户端应用程序的下游数据传输速率，请使用一段时间内返回的文档总数的总和。如果您的应用程序从辅助节点读取数据，请将文档总数除以可以提供读取操作的节点数。要查找数据库的平均文档大小，请使用 `db.stats().avgObjSize` 命令。此任务通常需要一天的时间。 | 数据库管理员 | 
| 选择 Atlas 层。 | 按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/sizing-tier-selection/)中的说明选择正确的 Atlas 集群层。 | 数据库管理员 | 
| 制定割接计划。 | 制定应用程序割接计划。 | 数据库管理员、应用程序所有者 | 

### 在 AWS 上设置新的 MongoDB Atlas 环境
<a name="set-up-a-new-mongodb-atlas-environment-on-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在上创建新的 MongoDB Atlas 集群。 AWS | 登录 Atlas 并打开项目的**概述**页面。选择**创建**按钮以创建集群。有关更多信息，请参阅 [MongoDB 文档](https://www.mongodb.com/docs/atlas/tutorial/deploy-free-tier-cluster/)。 | 数据库管理员 | 
| 选择 AWS 区域 和全局群集配置。 | 从适用于您的 Atlas 集群 AWS 区域 的列表中进行选择。如果需要，请配置全局集群。有关更多信息，请参阅 [MongoDB 文档](https://www.mongodb.com/docs/atlas/tutorial/deploy-free-tier-cluster/#select-your-preferred-region.)。 | 数据库管理员 | 
| 选择集群层。 | 选择您的首选集群层。您的层选择决定了内存、存储和 IOPS 规格等因素。 | 数据库管理员 | 
| 配置其他集群设置。 | 配置其他集群设置，例如 MongoDB 版本、备份和加密选项。有关这些选项的更多信息，请参阅[相关资源](#migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-resources)部分。 | 数据库管理员 | 

### 配置安全性和合规性
<a name="configure-security-and-compliance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 对用户进行身份验证和授权。 | 您必须创建并验证将访问 MongoDB Atlas 集群的数据库用户。要访问项目中的集群，用户必须属于该项目，并且他们可以属于多个项目。 Atlas 还支持基于 AWS Identity and Access Management (IAM) 的身份验证。有关更多信息，请参阅 [MongoDB 文档](https://www.mongodb.com/docs/atlas/security/aws-iam-authentication/#set-up-authentication-with-aws-iam)。 | 数据库管理员 | 
| 创建自定义角色。 | （可选）Atlas 支持在内置的 Atlas 数据库用户权限未涵盖所需权限集的情况下创建自定义角色。 | 数据库管理员 | 
| 设置 VPC 对等连接。 | （可选）Atlas 支持[虚拟私有云 (VPC) 与其他开](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)启的 VPCs 对 AWS等。 | AWS 管理员 | 
| 设置 AWS PrivateLink 终端节点。 | （可选）您可以使用在上 AWS 设置私有终端节点 AWS PrivateLink。有关更多信息，请参阅 [Amazon VPC 文档](https://docs.aws.amazon.com/vpc/latest/userguide/endpoint-services-overview.html)。 | AWS 管理员 | 
| 启用双因素身份验证。 | （可选）Atlas 支持双因素身份验证 (2FA)，以帮助用户控制对其 Atlas 账户的访问。 | AWS 管理员 | 
| 使用 LDAP 设置用户身份验证和授权。 | （可选）Atlas支持使用轻量级目录访问协议 (LDAP) 执行用户身份验证和授权。 | AWS 管理员 | 
| 设置统一 AWS 接入。 | （可选）某些 Atlas 功能（包括 Atlas 数据湖和使用客户密钥管理的静态加密）使用 IAM 角色进行身份验证。 | AWS 管理员 | 
| 使用设置静态加密 AWS KMS。 | （可选）Atlas 支持使用 AWS Key Management Service (AWS KMS) 加密存储引擎和云提供商备份。 | AWS 管理员 | 
| 设置客户端字段级加密。 | （可选）Atlas 支持客户端字段级加密，包括字段的自动加密。 | AWS 管理员 | 

### 迁移数据
<a name="migrate-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 MongoDB Atlas 中选择目标副本集。 | 导航到目标 Atlas 集群并选择省略号（...）按钮。在集群列表中，此按钮显示在集群名称下方。在集群详细信息中，按钮显示在右侧，位于**连接**和**配置**按钮旁边。有关更多信息，请参阅 [MongoDB 文档](https://www.mongodb.com/docs/atlas/import/c2c-pull-live-migration/#procedure)。 | 数据库管理员 | 
| 将 Atlas Live Migration Service 添加到访问列表。 | 将 Atlas 实时迁移服务添加到 AWS 源集群的访问列表中。这有助于准备源环境以连接到目标 Atlas 集群。 | 数据库管理员 | 
| 使用 Atlas Live Migration Service 执行迁移。 | 选择**开始迁移**。当**准备割接**按钮变绿时，执行割接。查看 Atlas 集群性能指标。考虑更新所有应用程序层中的数据库连接以指向新数据库。 | 数据库管理员 | 

### 配置操作集成
<a name="configure-operational-integration"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 连接到 MongoDB Atlas 集群。 | 确保 MongoDB Atlas 集群连接按预期运行。 | 应用程序所有者 | 
| 与集群数据交互。 | 测试集群数据。 | 数据库管理员 | 
| 监控您的集群。 | 验证集群设置是否正确。 | 数据库管理员 | 
| 备份和恢复集群数据。 | 为集群数据安排定期备份计划。 | 数据库管理员 | 

## 问题排查
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 错误：无法访问指定的源 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud.html) | 
| 错误：无法解析主机名 | 找不到给定主机名的 IP 地址。确认给定的主机名正确且可公开访问。 | 
| 任何其它错误 | 如遇任何其他错误，请参阅 MongoDB 文档中的[实时迁移故障排除（拉取）](https://www.mongodb.com/docs/atlas/import/live-import-troubleshooting/)。 | 

## 相关资源
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-resources"></a>

除非另有说明，否则以下所有链接均指向 MongoDB 文档中的网页。

**迁移指南**
+ [在（规范性指南）上迁移到 MongoDB Atla AWS s](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/)AWS 

**旧版迁移**
+ [迁移较旧版本的 MongoDB](https://www.mongodb.com/docs/atlas/legacy-migration/)

**发现与评测**
+ [内存](https://docs.atlas.mongodb.com/sizing-tier-selection/#memory)
+ [使用 Atlas 示例数据集进行大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--the-service-sample-data-sets)
+ [移动应用程序的大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--mobile-app)
+ [网络流量](https://docs.atlas.mongodb.com/sizing-tier-selection/#network-traffic)
+ [集群自动扩缩](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#cluster-auto-scaling)
+ [Atlas 大小调整模板](https://view.highspot.com/viewer/5f438f47a4dfa042e97130c5)

**配置安全性和合规性**
+ [配置 IP 访问列表条目](https://docs.atlas.mongodb.com/security/ip-access-list/)
+ [配置数据库用户](https://docs.atlas.mongodb.com/security-add-mongodb-users/)
+ [配置对 Atlas UI 的访问权限](https://docs.atlas.mongodb.com/organizations-projects/)
+ [配置自定义数据库角色](https://docs.atlas.mongodb.com/security-add-mongodb-roles)
+ [配置数据库用户](https://docs.atlas.mongodb.com/security-add-mongodb-users/#atlas-user-privileges)
+ [设置网络对等连接](https://docs.atlas.mongodb.com/security-vpc-peering/)
+ [了解 Atlas 中的私有端点](https://docs.atlas.mongodb.com/security-private-endpoint/)
+ [管理多重身份验证选项](https://docs.atlas.mongodb.com/security-two-factor-authentication/)
+ [使用 LDAP 设置用户身份验证和授权](https://docs.atlas.mongodb.com/security-ldaps/)
+ [Atlas 数据湖](https://docs.mongodb.com/datalake/)
+ [使用客户密钥管理进行静态加密](https://docs.atlas.mongodb.com/security-kms-encryption/)
+ [承担角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)（IAM 文档）
+ [客户端字段级加密](https://docs.mongodb.com/manual/core/security-client-side-encryption)
+ [自动加密](https://docs.mongodb.com/manual/core/security-automatic-client-side-encryption) 
+ [MongoDB Atlas 安全控制](https://webassets.mongodb.com/_com_assets/cms/MongoDB_Atlas_Security_Controls-v7k3rbhi3p.pdf)
+ [MongoDB 信任中心](https://www.mongodb.com/cloud/trust)
+ [为集群配置安全功能](https://docs.atlas.mongodb.com/setup-cluster-security/)

**在 **AWS** 上设置新的 MongoDB Atlas 环境**
+ [云提供商和地区](https://docs.atlas.mongodb.com/cloud-providers-regions/)
+ [管理全局集群](https://docs.atlas.mongodb.com/global-clusters/)
+ [选择集群层级](https://www.mongodb.com/docs/atlas/manage-clusters/#select-cluster-tier)
+ [配置其他设置](https://docs.atlas.mongodb.com/cluster-additional-settings/)
+ [开始使用 Atlas](https://docs.atlas.mongodb.com/getting-started/)
+ [配置对 Atlas UI 的访问权限](https://docs.atlas.mongodb.com/organizations-projects/)

**迁移数据**
+ [迁移或导入数据](https://www.mongodb.com/docs/atlas/import/)

**监控集群**
+ [监控您的集群](https://docs.atlas.mongodb.com/monitoring-alerts/)

**集成操作**
+ [连接到集群](https://docs.atlas.mongodb.com/connect-to-cluster/)
+ [与您的数据交互](https://docs.atlas.mongodb.com/data-explorer/)
+ [监控您的集群](https://docs.atlas.mongodb.com/monitoring-alerts/)
+ [备份、恢复和存档数据](https://docs.atlas.mongodb.com/backup-restore-cluster/)

**训练**
+ [使用 MongoDB Atlas 实时迁移](https://learn.mongodb.com/courses/live-migration-with-mongodb-atlas)

## 附加信息
<a name="migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud-additional"></a>

有关更多信息，请参阅 MongoDB 文档中的以下主题：
+ 要将数据移动到无服务器实例，[请使用 Compass 导出和导入数据](https://www.mongodb.com/docs/compass/current/import-export/)，或者使用自管理工具迁移数据。要了解更多信息，请参阅[无服务器实例限制](https://www.mongodb.com/docs/atlas/reference/serverless-instance-limitations/)。
+ 要将数据加载到 Atlas 中的新集群，请参阅[将数据加载到 Atlas](https://www.mongodb.com/docs/atlas/sample-data/#std-label-sample-data)。
+ 要为测试目的复制集群，请参阅[自管理式部署的备份方法](https://www.mongodb.com/docs/manual/core/backups/)。
+ 如果要迁移的应用程序需要近乎持续的正常运行时间，请联系 [MongoDB 支持团队](https://www.mongodb.com/docs/atlas/support/#std-label-request-support)并告知您的正常运行时间要求和集群配置。
+ 有关更多信息，请参阅[迁移或导入数据](https://www.mongodb.com/docs/atlas/import/)。

# 使用 AWS DMS 将 Oracle 数据库迁移至 Amazon DynamoDB
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms"></a>

*Rambabu Karnena，Amazon Web Services*

## Summary
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms-summary"></a>

此模式将指导您完成以下步骤：使用 AWS Database Migration Service ([AWS DMS](https://aws.amazon.com/dms/)) 将 Oracle 数据库迁移至[Amazon DynamoDB](https://aws.amazon.com/dynamodb/)。其涵盖了三类源数据库：
+ 本地 Oracle 数据库
+ 亚马逊弹性计算云 ([亚马](https://aws.amazon.com/ec2/)逊 EC2) 上的 Oracle 数据库
+ 适用于 Oracle 数据库实例的 Amazon Relational Database Service ([Amazon RDS](https://aws.amazon.com/rds/))

在此概念验证中，此模式侧重于从 Amazon RDS for Oracle 数据库实例迁移。

## 先决条件和限制
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 连接至 Amazon RDS for Oracle 数据库的应用程序
+ 在源 Amazon RDS for Oracle 数据库中创建的、包含主键和示例数据的表

**限制**
+ 不考虑迁移 Oracle 数据库对象，例如过程、函数、包和触发器，因为 Amazon DynamoDB 不支持上述数据库对象。

**产品版本**
+ 此模式适用于 AWS DMS 支持的所有版本的 Oracle 数据库。有关更多信息，请参阅 [Oracle 数据库作为 AWS DMS 的源](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)以及 [Amazon DynamoDB 数据库作为 AWS DMS 的目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DynamoDB.html)。建议使用最新版本的 AWS DMS，以获得最全面的版本和功能支持。

## 架构
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms-architecture"></a>

**源技术堆栈**
+ 适用于 Oracle 数据库实例的 Amazon RDS EC2、亚马逊上的 Oracle 或本地 Oracle 数据库

**目标技术堆栈**
+ Amazon DynamoDB

**AWS 数据迁移架构**

![\[数据从 AWS DMS 上的 Oracle 数据库迁移至 Amazon DynamoDB。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/463fc7d4-ec8d-473b-8c7f-1df31800ee03/images/180e7340-3887-455d-a591-b5850e22770a.png)


## 工具
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms-tools"></a>
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到 Amazon Web Services Cloud，或者在云和本地设置的组合之间迁移。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展关系数据库。此模式使用了 Amazon RDS for Oracle。

## 操作说明
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms-epics"></a>

### 计划迁移
<a name="plan-the-migration"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 VPC。 | 在 Amazon Web Services account 中，创建虚拟私有云（VPC）和私有子网。 | 系统管理员 | 
| 创建安全组和网络访问控制列表。 | 有关更多信息，请参阅 [AWS 文档](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。 | 系统管理员 | 
| 配置并启动 Amazon RDS for Oracle 数据库实例。 | 有关更多信息，请参阅 [AWS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)。 | 数据库管理员、系统管理员 | 

### 迁移数据
<a name="migrate-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为访问 DynamoDB 创建 IAM 角色。 | 在 AWS Identity and Access Management (IAM) 控制台中，创建角色，附加策略 `AmazonDynamoDBFullAccess to it`，然后选择 AWS DMS 作为服务。 | 系统管理员 | 
| 为迁移创建 AWS DMS 复制实例。 | 复制实例应与源数据库位于同一可用区和同一 VPC 。 | 系统管理员 | 
| 在 AWS DMS 中创建源端点和目标端点 | 若要创建源数据库端点，有两个选项供您选择：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms.html)若要创建目标数据库端点，请从先前 DynamoDB 访问任务中选择 Amazon 资源名称（ARN）的角色。 | 系统管理员 | 
| 创建将源 Oracle 数据库表加载至 DynamoDB 的 AWS DMS 任务。 | 从前述步骤中选择源和目标端点名称以及复制实例。该类型可完全加载。选择 Oracle 架构并指定 **%**，以选择所有表。 | 系统管理员 | 
| 验证 DynamoDB 中的表格。 | 若要查看迁移结果，请从 DynamoDB 控制台的左侧导航窗格中选择**表格**。 | 数据库管理员 | 

### 迁移应用程序
<a name="migrate-the-application"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 修改应用程序代码。 | 若要连接至 DynamoDB 并从中检索数据，请更新应用程序代码。 | 应用程序所有者，数据库管理员，系统管理员 | 

### 割接
<a name="cut-over"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将应用程序客户端切换至使用 DynamoDB。 |  | 数据库管理员、应用程序所有者、系统管理员 | 

### 关闭项目
<a name="close-the-project"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 关闭 AWS 资源。 | 例如，关闭 Amazon RDS for Oracle 实例、DynamoDB 和 AWS DMS 复制实例。 | 数据库管理员、系统管理员 | 
| 收集指标。 | 指标包括迁移时间、手动工作和工具执行工作的百分比以及成本节约。 | 数据库管理员、应用程序所有者、系统管理员 | 

## 相关资源
<a name="migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms-resources"></a>
+ [AWS Database Migration Service 和 Amazon DynamoDB：您需要了解的内容](https://aws.amazon.com/blogs/database/aws-database-migration-service-and-amazon-dynamodb-what-you-need-to-know/)（博客文章）
+ [将 Oracle 数据库作为 AWS DMS 的源](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)
+ [将 Amazon DynamoDB 数据库作为 AWS Database Migration Service 的目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.DynamoDB.html)
+ [从 RDBMS 迁移至 Amazon DynamoDB 的最佳实践](https://docs.aws.amazon.com/whitepapers/latest/best-practices-for-migrating-from-rdbms-to-dynamodb/welcome.html)（白皮书）

# 使用和 A SharePlex WS DMS 从 Oracle 8i 或 9i 迁移到 Amazon RDS for Oracle
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms"></a>

*Ramu Jagini，Amazon Web Services*

## Summary
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms-summary"></a>

此模式描述了如何使用 Oracle 数据泵将 Oracle 数据库从本地数据中心迁移到适用于 Oracle 数据库实例的 Amazon Relational Database Service（Amazon RDS）。您可以使用这种模式通过使用Quest进行同步复制，在减少停机时间 SharePlex 的情况下完成迁移。

您必须使用中间 Oracle 数据库实例迁移，因为 AWS Database Migration Service (AWS DMS) 不支持 Oracle 8i 或 9i 作为源环境。您可以使用 [SharePlex 7.6.3](https://www.quest.com/community/shareplex/f/forum/20700/where-can-download-7-6-3-or-support-9i-shareplex) 将以前的 Oracle 数据库版本复制到更高版本的 Oracle 数据库版本。中间 Oracle 数据库实例与 SharePlex 7.6.3 的目标兼容，并支持作为 AWS DMS 或更高版本的来源。 SharePlex此支持允许将数据向前复制到 Amazon RDS for Oracle 目标环境。

请考虑一下，一些已弃用的数据类型和功能可能会影响从 Oracle 8i 或 9i 迁移至最新版本的 Oracle 数据库。为了减轻这种影响，这种模式使用 Oracle 11.2.0.4 作为中间数据库版本，在迁移至 Amazon RDS for Oracle 目标环境之前帮助优化架构代码。

## 先决条件和限制
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 本地环境的源 Oracle 8i 或 9i 数据库
+ 用于在亚马逊弹性计算云 (亚马逊CR2) 上暂存的 [Oracle Database 12c 版本 2](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/index.html) (12) EC2
+ 任务 SharePlex 7.6.3（商业级）

**限制**
+ [RDS for Oracle 的限制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Oracle.Concepts.limitations.html)

**产品版本**
+ 作为源数据库的 Oracle 8i 或 9i
+ CR2 用于暂存数据库的 Oracle 12（必须与 Amazon RDS for Oracle 版本匹配）
+ 目标数据库的 Oracle 12 CR2 或更高版本（适用于 Oracle 的 Amazon RDS）

## 架构
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms-architecture"></a>

**源技术堆栈**
+ Oracle 8i 或 9i 数据库
+ SharePlex

**目标技术堆栈**
+ Amazon RDS for Oracle

**迁移架构**

下图显示了如何将 Oracle 8i 或 9i 数据库从本地环境迁移至 Amazon Web Services Cloud 中的 Amazon RDS for Oracle 数据库实例。

![\[将本地 Oracle 数据库迁移到 AWS 上的 Amazon RDS for Oracle 的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/6e07d586-fd74-4f3d-8e81-79dd55c445c3/images/36e1a5ff-908b-4cb7-96f7-997eb105f1d6.png)


下图显示了如下工作流：

1. 为 Oracle 源数据库启用归档日志模式、强制日志记录和补充日志记录。

1. [使用恢复管理器 (RMAN) point-in-time 恢复和 FLASHBACK\$1SCN 从 Oracle 源数据库恢复 Oracle 暂存数据库。](https://docs.oracle.com/database/121/SUTIL/GUID-D408B112-1A81-4F68-BEFF-7403A9588DDB.htm#SUTIL849)

1. 使用`FLASHBACK_SCN`（在 RMAN 中使用）配置 SharePlex 为从 Oracle 源数据库读取重做日志。

1. 开始 SharePlex 复制，将数据从 Oracle 源数据库同步到 Oracle 临时数据库。

1. 使用`FLASHBACK_SCN` EXPDP 和 IMPDP 恢复 Amazon RDS for Oracle 目标数据库。

1. 使用 `FLASHBACK_SCN`（在 EXPDP 中使用）将 AWS DMS 及其源任务配置为 Oracle 暂存数据库，将 Amazon RDS for Oracle 配置为目标数据库。

1. 启动 AWS DMS 任务以将数据从 Oracle 暂存数据库同步到 Oracle 目标数据库。

## 工具
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms-tools"></a>
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展关系数据库。
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到 Amazon Web Services Cloud，或者在云和本地设置的组合之间迁移。
+ [Quest SharePlex](https://support.quest.com/shareplex/11.0/technical-documents) 是一款 Oracle-to-Oracle数据复制工具，用于在最短的停机时间内移动数据，并且不会丢失任何数据。
+ [恢复管理器 (RMAN)](https://docs.oracle.com/cd/E11882_01/backup.112/e10642/rcmquick.htm) 是 Oracle 数据库客户端，可对数据库执行备份和恢复任务。它极大地简化了数据库文件的备份、还原和恢复流程。
+ [Data Pump Export](https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_export.htm#SUTIL823) 可帮助您将数据和元数据上传到一组称为转储文件集的操作系统文件中。转储文件集只能由 [Data Pump Import](https://docs.oracle.com/cd/E11882_01/server.112/e22490/dp_import.htm#SUTIL300) 实用程序或 [DBMS\$1DATAPUMP](https://docs.oracle.com/database/121/ARPLS/d_datpmp.htm#ARPLS356) 包导入。

## 操作说明
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms-epics"></a>

### 在亚马逊上 SharePlex 设置 Oracle 暂存数据库 EC2
<a name="set-up-shareplex-and-the-oracle-staging-database-on-amazon-ec2"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建实 EC2 例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms.html) | Oracle 管理 | 
| 准备暂存数据库。 | 从 Oracle 8i 或 9i 数据库源环境中获取 RMAN 备份，为 Oracle 暂存数据库做好准备，以便在 Oracle 12 CR2 上作为升级进行恢复。有关更多信息，请参阅 Oracle 文档中的 [ Oracle 9i Recovery Manager 用户指南](https://docs.oracle.com/cd/B10500_01/server.920/a96566/toc.htm)和[数据库备份和恢复用户指南](https://docs.oracle.com/database/121/BRADV/rcmcomre.htm#BRADV8005)。 | Oracle 管理 | 
| 配置 SharePlex。 | 将 SharePlex 源配置为本地 Oracle 8i 或 9i 数据库，并将目标配置为托管在亚马逊上的 Oracle 12 CR2 暂存数据库。 EC2 | SharePlex，甲骨文管理 | 

### 为 Amazon RDS for Oracle 设置您的环境。
<a name="set-up-amazon-rds-for-oracle-as-your-target-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Oracle 数据库实例 | 创建 Amazon RDS for Oracle 数据库，然后将 Oracle 12 CR2 连接到该数据库。有关更多信息，请参阅 Amazon RDS 文档中的[创建 PostgreSQL 数据库实例并连接到 PostgreSQL 数据库实例上的数据库](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html)。 | 数据库管理员 | 
| 从暂存数据库恢复 Amazon RDS for Oracle。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms.html)有关更多信息，请参阅 Oracle Database 文档中的 [DBMS\$1MLE](https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/DBMS_DATAPUMP.html#GUID-AEA7ED80-DB4A-4A70-B199-592287206348)。 | 数据库管理员 | 

### 设置 AWS DMS
<a name="set-up-aws-dms"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为数据库创建端点。 | 为 Oracle 暂存数据库创建源端点，为 Amazon RDS for Oracle 数据库创建目标端点。有关更多信息，请参阅 AWS Knowledge Center 中的[如何使用 AWS DMS 创建源或目标端点？](https://aws.amazon.com/premiumsupport/knowledge-center/create-source-target-endpoints-aws-dms/)。 | 数据库管理员 | 
| 创建复制实例。 | 使用 AWS DMS 启动 Oracle 暂存数据库到 Amazon RDS for Oracle 数据库的复制实例。有关更多信息，请参阅 AWS Knowledge Center 中的[如何创建 AWS DMS 复制实例？](https://aws.amazon.com/premiumsupport/knowledge-center/create-aws-dms-replication-instance/) | 数据库管理员 | 
| 创建并启动复制任务。 | 使用来自 EXPDP 的 `FLASHBACK_SCN` 变更数据捕获 (CDC) 创建 AWS DMS 复制任务（因为已通过 EXPDP 完成了满载）。有关更多信息，请参阅 AWS DMS 文档中的[创建任务](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.Creating.html)。 | 数据库管理员 | 

### 割接 Amazon RDS for Oracle
<a name="cut-over-to-amazon-rds-for-oracle"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 停止应用程序工作负载。 | 在计划的割接窗口期间停止应用程序服务器及其应用程序。 | 应用程序开发人员、数据库管理员 | 
| 验证本地 Oracle 暂存数据库与实例的 EC2 同步。 |  EC2 通过在本地源数据库上执行几次日志切换，确认从 SharePlex 复制实例到 Amazon 上的 Oracle 暂存数据库的复制任务的所有消息都已发布。有关更多信息，请参见 Oracle 文档中的 [6.4.2 切换日志文件](https://docs.oracle.com/database/121/ADMQS/GUID-E30B4C65-2AC7-4A44-A58C-D3C121EB152F.htm#ADMQS12075)。 | 数据库管理员 | 
| 验证 Oracle 暂存数据库与 Amazon RDS for Oracle 数据库的同步。 | 确认您的所有 AWS DMS 任务是否低延迟且没有错误，然后检查任务的验证状态。 | 数据库管理员 | 
| 停止复制 SharePlex 和 Amazon RDS。 | 如果 SharePlex 和 AWS DMS 复制均未显示任何错误，则停止这两个复制。 | 数据库管理员 | 
| 将应用程序重新映射至 Amazon RDS。 | 与应用程序服务器及其应用程序共享 Amazon RDS for Oracle 端点的详细信息，然后启动应用程序以恢复业务运营。 | 应用程序开发人员、数据库管理员 | 

### 测试 AWS 目标环境
<a name="test-the-aws-target-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 AWS 上测试 Oracle 暂存数据库环境。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms.html) | SharePlex，甲骨文管理 | 
| 测试 Amazon RDS 环境。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms.html)有关更多信息，请参阅 Amazon RDS 文档中的[Amazon RDS for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)。 | Oracle 管理 | 

## 相关资源
<a name="migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms-resources"></a>
+ [放心迁移](https://aws.amazon.com/cloud-migration/)
+ [Amazon EC2](https://aws.amazon.com/ec2/)
+ [Amazon RDS for Oracle](https://aws.amazon.com/rds/oracle/)
+ [AWS Database Migration Service](https://aws.amazon.com/dms/)
+ [调试您的 AWS DMS Migrations：出现问题时该怎么做（第 1 部分）](https://aws.amazon.com/blogs/database/debugging-your-aws-dms-migrations-what-to-do-when-things-go-wrong-part-1/)
+ [调试您的 AWS DMS Migrations：出现问题时该怎么做 (第 2 部分)](https://aws.amazon.com/blogs/database/debugging-your-aws-dms-migrations-what-to-do-when-things-go-wrong-part-2/)
+ [调试您的 AWS DMS Migrations：出现问题时该怎么做 （第 3 部分）](https://aws.amazon.com/blogs/database/debugging-your-aws-dms-migrations-what-to-do-when-things-go-wrong-part-3/)
+ [SharePlex 用于数据库复制](https://aws.amazon.com/marketplace/pp/B07943W4MJ)
+ [SharePlex：适用于任何环境的数据库复制](https://www.youtube.com/watch?v=ygS_ouUaNus)

# 将本地 MySQL 数据库迁移至 Amazon EC2
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2"></a>

*Lorenzo Mota，Amazon Web Services*

## Summary
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2-summary"></a>

此模式为将本地 MySQL 数据库迁移至 Amazon Elastic Compute Cloud (Amazon EC2) 实例上的 MySQL 数据库提供了指导。该模式讨论了如何使用 AWS Database Migration Service (AWS DMS) 或原生 MySQL 工具（例如 my **sqldump）进行迁移**。专注于将整个数据库迁移到 MySQL 数据库实例。

该模式主要面向 DBAs 解决方案架构师。可在小型或大型项目、测试或最终迁移阶段使用。我们建议您在生产环境中使用此模式之前，先至少运行一个测试周期。

## 先决条件和限制
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account。
+ 本地数据中心的 MySQL 源数据库 

**产品版本**
+ MySQL 版本 5.5 及更高版本。
+ 亚马逊 EC2 支持的目标操作系统；参见[亚马逊 EC2 FAQs](https://aws.amazon.com/ec2/faqs/)

## 架构
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2-architecture"></a>

**源技术堆栈**
+ 本地 MySQL 数据库

**目标技术堆栈**
+ Amazon EC2 上的 MySQL 数据库实例

**AWS 数据迁移方法**
+ AWS DMS
+ [像 mysq [ldump 这样的本机 MySQ](https://dev.mysql.com/doc/refman/en/mysqldump.html) L 工具，或者像 Percona 这样的第三方工具 XtraBackup](https://www.percona.com/mysql/software/percona-xtrabackup)

**目标架构**

下图说明了割接后目标 Amazon EC2 的实施方案。

![\[MySQL 数据库实例位于 Amazon EC2 上，并且已复制到备用 MySQL 数据库实例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d22b3e25-4d3b-4bd7-ad07-501748d67752/images/34cab6f9-9107-4c3b-98ec-a6d7fa9f298a.png)


 

**AWS 数据迁移架构**

*使用 AWS DMS：*

下图说明了在切换之前向目标 MySQL 数据库发送完整和增量更改所基于 AWS DMS 的数据迁移工作流程。从本地到的网络连接 AWS 取决于 SQL 客户端的要求，不在此模式的范围之内。

![\[使用 AWS DMS 向 Amazon EC2 上的目标 MySQL 数据库发送数据。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d22b3e25-4d3b-4bd7-ad07-501748d67752/images/c906c45d-fac5-4bb9-b8c8-55e2f9f05fd8.png)


*使用其他 MySQL 工具：*

下图说明了使用 MySQL 工具从本地数据库生成导出转储文件的数据迁移工作流。在割接之前，这些文件将移至 Amazon Simple Storage Service（Amazon S3）并导入到目标 MySQL 数据库。从本地到的网络连接 AWS 取决于 SQL 客户端的要求，不在此模式的范围之内。

![\[使用原生 MySQL 工具向 Amazon EC2 上的目标 MySQL 数据库发送数据。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/d22b3e25-4d3b-4bd7-ad07-501748d67752/images/18e88877-7879-4a99-b985-25c56bf7c35f.png)


备注：
+ 根据停机时间考虑因素和最终转换的数据库大小，您可以使用 AWS DMS 或其他变更数据捕获 (CDC) 工具来最大限度地缩短切换时间。当您使用诸如之类的 CDC 工具时 AWS DMS，可以在几分钟内迁移到目标数据库。 
+ 如果根据数据库大小和网络延迟，可以在较短的割接时间窗内完成迁移，采用 **mysqldump** 的离线策略即可满足需求。（我们建议您执行测试以获得大致时间。）
+ 通常，与离线选项相比，CDC策略 AWS DMS 需要更多的监控和复杂性。

## 工具
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2-tools"></a>

**AWS 服务**
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 支持多个源数据库和目标数据库。有关支持的 MySQL 源数据库和目标数据库的信息 AWS DMS，请参阅[使用与 MySQL 兼容的数据库作为源 AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html)和[使用兼容 MySQL 的数据库作为](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.MySQL.html)目标。 AWS DMS如果您的源数据库不受支持 AWS DMS，则必须选择其他方法来迁移数据。

**其他工具**
+ [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html) 是 MySQL 实用程序，用于从 MySQL 数据库创建转储文件，以实现备份或迁移目的。
+ [Percona XtraBackup 是一个](https://www.percona.com/mysql/software/percona-xtrabackup)开源实用程序，用于在 MySQL 数据库上执行非阻塞备份。

## 操作说明
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2-epics"></a>

### 计划迁移
<a name="plan-the-migration"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证数据库版本。 | 验证源数据库和目标数据库的版本。有关支持的 MySQL 版本的信息 AWS DMS，请参阅 AWS DMS 文档 AWS DMS中的[源 AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Introduction.Sources.html)和[目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Introduction.Targets.html)。 | 数据库管理员 | 
| 确定目标操作系统。 | 确定目标操作系统的版本。有关 Amazon EC2 支持的目标操作系统的列表，请参阅 A [mazon EC2 FAQs](https://aws.amazon.com/ec2/faqs/)。 | 数据库管理员、系统管理员 | 
| 确定硬件要求。 | 根据 MySQL 兼容性列表和容量要求，确定[目标服务器实例](https://aws.amazon.com/rds/instance-types/)的硬件要求。 | 数据库管理员、系统管理员 | 
| 确定存储要求。 | 确定目标数据库的存储类型和容量。 | 数据库管理员、系统管理员 | 
| 识别网络要求。 | 确定网络要求，例如延迟和带宽。 | 数据库管理员、系统管理员 | 
| 选择目标实例类型。 | 根据容量、存储功能和网络功能选择[目标实例类型](https://aws.amazon.com/rds/instance-types/)。 | 数据库管理员、系统管理员 | 
| 确定安全要求。 | 确定源数据库和目标数据库的网络或主机访问安全要求。 | 数据库管理员、系统管理员 | 
| 识别用户。 | 确定安装 MySQL 软件所需的操作系统用户列表。有关更多信息，请参阅 [MySQL 文档](https://dev.mysql.com/doc/mysql-security-excerpt/en/access-control.html)。 | 数据库管理员、系统管理员 | 
| 确定备份策略。 |  | 数据库管理员 | 
| 确定可用性要求。 |  | 数据库管理员 | 
| 确定应用程序迁移或切换策略。 |  | 数据库管理员、系统管理员 | 

### 配置基础设施
<a name="configure-the-infrastructure"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建虚拟私有云（VPC）和子网。 | 配置路由表、互联网网关、NAT 网关和子网。有关更多信息，请参阅 Amazon VPC 文档中的 [VPC 配置选项](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc-options.html)。 | 系统管理员 | 
| 创建安全组和网络访问控制列表 (ACLs)。 | 根据您的要求配置端口（MySQL 的默认值为 3306）和 CIDR 范围或特 IPs 定。 | 系统管理员 | 
| 配置并启动 EC2 实例。 | 有关说明，请参阅 Amazon EC2 文档中的[启动 EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/LaunchingAndUsingInstances.html)。 | 系统管理员 | 

### 安装 MySQL 软件
<a name="install-mysql-software"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建用户和组。 | 创建需要访问服务器及数据库的操作系统用户和组。有关更多信息，请参阅 MySQL 文档中的[访问控制和账户管理](https://dev.mysql.com/doc/refman/en/access-control.html)。 | 数据库管理员、系统管理员 | 
| 下载 MySQL。 | 下载 MySQL 软件。有关说明和二进制文件，请参阅 MySQL 文档中的[安装 MySQL](https://dev.mysql.com/doc/refman/en/installing.html)。 | 数据库管理员、系统管理员 | 
| 在 EC2 实例上安装 MySQL 并配置服务器。 | 连接到 EC2 实例并安装 MySQL 软件。有关更多信息，请参阅 Amazon EC2 文档中的[连接到您的 EC2 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect.html)。 | 数据库管理员、系统管理员 | 

### 迁移数据 - 选项 1
<a name="migrate-data-option-1"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用原生 MySQL 或第三方工具迁移数据。 | 此选项使用原生 MySQL 工具或第三方工具迁移数据库对象及数据。有关说明，请参阅 [mysqldump](https://dev.mysql.com/doc/refman/en/mysqldump.html) 或 [Percona XtraBackup](https://docs.percona.com/percona-xtrabackup/2.4/index.html)（用于物理迁移）的文档。有关使用这些工具的更多信息，请参阅 AWS 博客文章 MySQL 到 Amazon RDS for [MySQL 或 Amazon Aurora MySQL 的迁移选项](https://aws.amazon.com/blogs/database/migration-options-for-mysql-to-amazon-rds-for-mysql-or-amazon-aurora-mysql/)。 | 数据库管理员 | 

### 迁移数据 - 选项 2
<a name="migrate-data-option-2"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 使用迁移数据 AWS DMS。 | 有关更多信息，请参阅 AWS DMS 文档[AWS DMS中的高级视图](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Introduction.HighLevelView.html)。 | 数据库管理员 | 

### 为割接做准备
<a name="prepare-for-cutover"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 收集对象计数。 | 从源数据库和新的目标数据库收集对象计数。修复目标数据库中的任何不一致之处。 | 数据库管理员 | 
| 检查依赖项。 | 确认与其他数据库之间的依赖关系（链接）仍然有效且运行正常。 | 数据库管理员 | 
| 测试。 | 如果这是测试周期，请执行查询测试、收集指标以及修复任何问题。 | 数据库管理员 | 

### 割接
<a name="cut-over"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 移动客户端。 | 将应用程序客户端切换至新基础设施。 | 数据库管理员、应用程序所有者、系统管理员 | 
| 提供支持。 | 在功能性应用程序测试期间提供支持。 | 数据库管理员 | 

### 关闭项目
<a name="close-the-project"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 关闭资源。 | 关闭 AWS DMS 复制实例和其他临时 AWS 资源。 | 数据库管理员、系统管理员 | 
| 查看项目文档。 | 查看和验证项目文档。 | 数据库管理员、应用程序所有者、系统管理员 | 
| 收集指标。 | 收集各项指标，例如迁移所需时间、人工修改与工具辅助修改的比例，以及成本节约情况。 | 数据库管理员、应用程序所有者、系统管理员 | 
| 完成项目结案。 | 完成项目结案并提供反馈。 | 数据库管理员、应用程序所有者、系统管理员 | 
| 停用源数据库。 | 停用本地 MySQL 数据库。 | 数据库管理员、系统管理员 | 

## 相关资源
<a name="migrate-an-on-premises-mysql-database-to-amazon-ec2-resources"></a>

**参考**
+ [Amazon EC2 文档](https://docs.aws.amazon.com/ec2/)
+ [AWS DMS 文档](https://docs.aws.amazon.com/dms/)
+ [Amazon EC2 定价](https://aws.amazon.com/ec2/pricing/)
+ [AWS DMS Step-by-Step 演练](https://docs.aws.amazon.com/dms/latest/sbs/DMS-SBS-Welcome.html)
+ [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html)
+ [Percona XtraBackup](https://www.percona.com/mysql/software/percona-xtrabackup)

**教程和视频**
+ [入门 AWS DMS](https://aws.amazon.com/dms/getting-started/)
+ [Amazon EC2 简介 – 通过 AWS实现弹性云服务器和托管](https://www.youtube.com/watch?v=TsRBftzZsQo)（视频）

# 监控 Amazon Aurora 以查找未加密的实例
<a name="monitor-amazon-aurora-for-instances-without-encryption"></a>

*Mansi Suratwala，Amazon Web Services*

## Summary
<a name="monitor-amazon-aurora-for-instances-without-encryption-summary"></a>

此模式提供了一个亚马逊网络服务 (AWS) CloudFormation 模板，您可以部署该模板，以便在未开启加密的情况下创建 Amazon Aurora 实例时设置自动通知。

Aurora 是一个与 MySQL 和 PostgreSQL 兼容的完全托管式的关系数据库引擎。在某些工作负载条件下，Aurora 最多可以将 MySQL 吞吐量增加 5 倍，将 PostgreSQL 的吞吐量增加 3 倍，而无需对大多数现有应用程序进行更改。

该 CloudFormation 模板创建了一个亚马逊 CloudWatch 事件和一个 AWS Lambda 函数。该事件使用 AWS CloudTrail 来监控任何 Aurora 实例的创建或现有实例的时间点恢复。Cloudwatch Events 事件启动 Lambda 函数，该函数检查是否启用了加密。如果未启用加密，Lambda 函数会发送 Amazon Simple Notiﬁcation Service (Amazon SNS) 通知，通知您存在违规情况。 

## 先决条件和限制
<a name="monitor-amazon-aurora-for-instances-without-encryption-prereqs"></a>

**先决条件**** **
+ 一个活跃的 AWS 账户

**限制**
+ 此服务控制仅适用于 Amazon Aurora 实例。它不支持其他 Amazon Relational Database Service (Amazon RDS)实例。
+  CloudFormation 模板必须仅针对`CreateDBInstance`****和 `RestoreDBClusterToPointInTim` **e** 部署。 

**产品版本**
+ Amazon Aurora 中支持的 PostgreSQL 版本
+ Amazon Aurora 中支持的 MySQL 版本

## 架构
<a name="monitor-amazon-aurora-for-instances-without-encryption-architecture"></a>

**目标技术堆栈**
+ Amazon Aurora
+ AWS CloudTrail
+ Amazon CloudWatch
+ AWS Lambda
+ Amazon Simple Storage Service (Amazon S3)
+ Amazon SNS

**目标架构**

![\[Aurora 在没有加密调用 CloudTrail、 CloudWatch 事件、Lambda 和 SNS 消息的情况下启动。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/de1528b8-a5a4-4c66-8ab3-7d9863572cbc/images/7dcab41a-d805-4bb0-99d1-1dcef37c4e55.png)


**自动化和扩展**

您可以为不同的地区和账户多次使用该 CloudFormation 模板。您只需在每个区域或账户中运行一次此模板。

## 工具
<a name="monitor-amazon-aurora-for-instances-without-encryption-tools"></a>

**工具**
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html) - Amazon Aurora 是与 MySQL 和 PostgreSQL 兼容的完全托管式的云端关系数据库引擎。
+ [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) — AWS CloudTrail 可帮助您管理 AWS 账户的治理、合规以及运营和风险审计。用户、角色或 AWS 服务采取的操作在中记录为事件 CloudTrail。 
+ [Amazon CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) Events — Amazon CloudWatch Events 提供一系列描述了 AWS 资源变化的系统事件。 near-real-time 
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda 是一项计算服务，支持无需预置或管理服务器即可运行代码。只有在需要时 Lambda 才运行您的代码，并且能自动扩缩，从每天几个请求扩展到每秒数千个请求。 
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/GetStartedWithS3.html) - Amazon Simple Storage Service (Amazon S3)是一种高度可扩展的对象存储服务，可用于各种存储解决方案，包括网站、移动应用程序、备份和数据湖。
+ [Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html) – Amazon Simple Notiﬁcation Service (Amazon SNS)是一项托管服务，可通过 Lambda、HTTP、电子邮件、手机推送通知和手机短信 (SMS) 的形式提供消息。 

**代码**

该项目的 .zip 文件作为附件提供。

## 操作说明
<a name="monitor-amazon-aurora-for-instances-without-encryption-epics"></a>

### 为 Lambda 脚本创建 S3 存储桶
<a name="create-the-s3-bucket-for-the-lambda-script"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 定义 S3 存储桶。 | 打开 Amazon S3 控制台并选择或创建 S3 存储桶。此 S3 存储桶将托管 Lambda 代码 .zip 文件。您的 S3 存储桶需要与 Aurora 位于同一区域。S3 存储桶名称不能包含前导斜杠。 | 云架构师 | 

### 将 Lambda 代码上传至 S3 存储桶
<a name="upload-the-lambda-code-to-the-s3-bucket"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 上传 Lambda 代码。 | 将*附件*部分中提供的 Lambda 代码 .zip 文件上传到您定义的 S3 存储桶。 | 云架构师 | 

### 部署 CloudFormation 模板
<a name="deploy-the-cloudformation-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 CloudFormation 模板。 | 在 CloudFormation 控制台上，部署作为该模式附件提供的`RDS_Aurora_Encryption_At_Rest.yml` CloudFormation 模板。在下一个操作说明中，提供模板参数的值。 | 云架构师 | 

### 填写 CloudFormation 模板中的参数
<a name="complete-the-parameters-in-the-cloudformation-template"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 提供 S3 存储桶名称。 | 输入您在第一个操作说明中创建或选择的 S3 存储桶的名称。 | 云架构师  | 
| 提供 S3 密钥。 | 提供 Lambda 代码 .zip 文件在 S3 存储桶中的位置，不带前导斜杠（例如，`<directory>/<file-name>.zip`）。 | 云架构师  | 
| 提供电子邮箱地址。 | 提供有效的电子邮件地址以接收 Amazon SNS 通知。 | 云架构师  | 
| 定义日志记录级别。 | 定义 Lambda 函数的日志记录级别和频率。`Info` 指明有关应用程序进度的详细信息消息。`Error` 指明仍允许应用程序继续运行的错误事件。`Warning` 指明潜在的有害情况。 | 云架构师 | 

### 确认订阅
<a name="confirm-the-subscription"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确认订阅。 | 成功部署模板后，它将向提供的电子邮件地址发送订阅电子邮件。要接收通知，您必须确认此电子邮件订阅。  | 云架构师 | 

## 相关资源
<a name="monitor-amazon-aurora-for-instances-without-encryption-resources"></a>
+ [创建 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html)
+ [将文件上传到 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/upload-objects.html) 
+ [创建 Amazon Aurora 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html)
+ [使用 AWS 创建在 AWS API 调用时触发 CloudWatch 的事件规则 CloudTrail](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-CloudTrail-Rule.html)

## 附件
<a name="attachments-de1528b8-a5a4-4c66-8ab3-7d9863572cbc"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/de1528b8-a5a4-4c66-8ab3-7d9863572cbc/attachments/attachment.zip)

# 使用亚马逊监控 Oracle GoldenGate 日志 CloudWatch
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch"></a>

*Chithra Krishnamurthy，Amazon Web Services*

## Summary
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-summary"></a>

甲骨文 GoldenGate 为甲骨文数据库提供亚马逊关系数据库服务（Amazon RDS）之间或托管在亚马逊弹性计算云（Amazon EC2）上的甲骨文数据库之间的实时复制。它支持单向和双向复制。

在使用 GoldenGate 复制时，监控对于验证 GoldenGate 过程是否已启动并运行，以及确保源数据库和目标数据库同步至关重要。

此模式说明了对 GoldenGate 错误日志实施 Amazon CloudWatch 监控的步骤，以及如何设置警报以发送特定事件的通知，例如`STOP`您可以采取适当措施快速恢复复制。`ABEND`

## 先决条件和限制
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-prereqs"></a>

**先决条件**
+ GoldenGate 在 EC2 实例上安装和配置，因此您可以对这些 EC2 实例设置 CloudWatch 监控。如果要 GoldenGate 跨AWS区域监控双向复制，则必须在运行该 GoldenGate 过程的每个 EC2 实例中安装 CloudWatch 代理。

**限制**
+ 此模式说明了如何使用监视 GoldenGate 进程 CloudWatch。 CloudWatch 不监控复制期间的复制延迟或数据同步问题。您必须运行单独的 SQL 查询来监控复制延迟或与数据相关的错误，如[GoldenGate 文档](https://docs.oracle.com/en/middleware/goldengate/core/19.1/index.html)中所述。

**产品版本**
+ 本文档基于 Linux x86-64 上适用于 Oracle 的 Oracle GoldenGate 19.1.0.0.4 的实现。但是，此解决方案适用于的所有主要版本 GoldenGate。

## 架构
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-architecture"></a>

**目标技术堆栈**
+ GoldenGate 安装在 EC2 实例上的 Oracle 二进制文件
+ 亚马逊 CloudWatch
+ Amazon Simple Notification Service（Amazon SNS）

**目标架构**

![\[在 AWS 上监控 GoldenGate 日志的目标架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/973a71d5-b6b3-4a2b-813e-cb4d8fd51ba5/images/1781aa9b-77b3-40c4-bc54-3cb91400899c.png)


## 工具
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-tools"></a>

**AWS 服务**
+ [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) 是一种监控服务，在此模式中用于监控 GoldenGate 错误日志。
+ [Amazon SNS](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/US_SetupSNS.html) 是一种消息通知服务，在此模式中用于发送电子邮件通知。

**其他工具**
+ [Oracle GoldenGate ](https://docs.oracle.com/en/middleware/goldengate/core/19.1/index.html) 是一种数据复制工具，您可以将其用于亚马逊 RDS for Oracle 数据库或托管在 Amazon EC2 上的 Oracle 数据库。

**高级实施步骤**

1. 为代理创建 AWS Identity and Access Managem CloudWatch ent (IAM) 角色。

1. 将 IAM 角色附加到生成 GoldenGate 错误日志的 EC2 实例。

1. 在 EC2 实例上安装 CloudWatch 代理。

1. 配置 CloudWatch 代理配置文件：`awscli.conf`和`awslogs.conf`。

1. 启动代 CloudWatch 理。

1. 在日志组中创建指标筛选器。

1. 设置 Amazon SNS。

1. 为指标筛选条件创建警报。当这些筛选条件捕获事件时，Amazon SNS 会发送电子邮件提醒。

有关详细说明，请参阅下一部分。

## 操作说明
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-epics"></a>

### 步骤 1：为 CloudWatch 代理创建 IAM 角色
<a name="step-1-create-an-iam-role-for-the-cloudwatch-agent"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 IAM 角色。 | 访问 AWS 资源需要权限，因此您可以创建 IAM 角色以包含每台服务器运行 CloudWatch 代理所需的权限。要创建 IAM 角色：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html) | AWS 常规 | 

### 步骤 2：将 IAM 角色附加到 GoldenGate EC2 实例
<a name="step-2-attach-the-iam-role-to-the-goldengate-ec2-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将 IAM 角色附加到生成 GoldenGate 错误日志的 EC2 实例。 |  GoldenGate 必须将生成的错误日志填充到 CloudWatch 并进行监控，因此您需要将您在步骤 1 中创建的 IAM 角色附加到 GoldenGate 正在运行的 EC2 实例。将 IAM 角色附加到实例：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html) | AWS 常规 | 

### 步骤 3-5。在 Gold CloudWatch engate EC2 实例上安装和配置代理
<a name="steps-3-5-install-and-configure-the-cloudwatch-agent-on-the-goldengate-ec2-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 GoldenGate EC2 实例上安装 CloudWatch 代理。 | 要安装代理，请运行命令：<pre>sudo yum install -y awslogs</pre> | AWS 常规 | 
| 编辑代理配置文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html) | AWS 常规 | 
| 启动代 CloudWatch 理。 | 要启动代理，请使用以下命令。<pre>$ sudo service awslogsd start</pre>启动代理后，可以在 CloudWatch 控制台中查看日志组。日志流将包含文件的内容。 | AWS 常规 | 

### 步骤 6. 创建日志组的指标筛选条件
<a name="step-6-create-metric-filters-for-the-log-group"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为关键字 ABEND 和 STOPPED 创建指标筛选器。 | 当您为日志组创建指标筛选条件时，只要在错误日志中识别出筛选条件，它就会启动警报并根据 Amazon SNS 配置发送电子邮件通知。创建指标筛选条件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html) | CloudWatch | 

### 第 7 步。设置 Amazon SNS
<a name="step-7-set-up-amazon-sns"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个 SNS 主题。 | 在此步骤中，您将配置 Amazon SNS 以为指标筛选条件创建警报。创建 SNS 主题：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html) | Amazon SNS | 
| 创建订阅。 | 要创建主题订阅：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html)Amazon SNS 会打开您的 Web 浏览器，并显示带有您的订阅 ID 的订阅确认信息。 | Amazon SNS | 

### 步骤 8：创建警报以发送指标筛选器的通知
<a name="step-8-create-an-alarm-to-send-notifications-for-the-metric-filters"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 SNS 主题创建警报。 | 要根据日志组指标筛选条件创建警报：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.html)完成这些步骤后，每当在您监控的 GoldenGate 错误日志文件 (`ggserr.log`) 中检测到这些模式时，您都会收到一封电子邮件通知。 | CloudWatch | 

## 问题排查
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
|  GoldenGate 错误日志中的日志流不会流入 CloudWatch。 | 检查`/etc/awslogs/awslogs.conf`文件以验证文件名、日志组名称和 date/time 格式。必须指定 date/time 与中的日期格式相匹配`ggserror.log`。否则，日志流将不会流入 CloudWatch。 | 

## 相关资源
<a name="monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch-resources"></a>
+ [亚马逊 CloudWatch 文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)
+ [使用 CloudWatch 代理收集指标和日志](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)
+ [Amazon SNS 文档](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)

# 从 Oracle Database Enterprise Edition 更换平台到 Amazon RDS for Oracle 上的 Standard Edition 2。
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle"></a>

*Lanre（Lan-Ray）showunmi 和 Tarun Chawla，Amazon Web Services*

## Summary
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle-summary"></a>

Oracle Database Enterprise Edition (EE) 是许多企业运行应用程序的流行选择。然而，在某些情况下，应用程序很少或根本不使用 Oracle Database EE 功能，因此没有理由承担巨额许可成本。迁移到 Amazon RDS 时，您可以通过将此类数据库降级为 Oracle 数据库标准版 2 (SE2) 来节省成本。

此模式描述了从本地迁移到 [Amazon RDS for Oracle SE2 时，如何从 Oracle Database EE 降级到 Oracle](https://aws.amazon.com/rds/oracle/) 数据库。如果您的 EE Oracle 数据库已经在 Amazon RDS 或亚马逊[弹性计算云 (Ama](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) zon EC2) 实例上运行，则此模式中介绍的步骤也适用。

有关更多信息，请参阅 AWS Prescriptive Guidance 指南，了解[评估将 Oracle 数据库降级到 Standard Edition 2 on AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/evaluate-downgrading-oracle-edition/welcome.html)。

## 先决条件和限制
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account。
+ Oracle Database Enterprise Edition
+ 客户端工具，例如 [Oracle SQL Developer](https://www.oracle.com/database/sqldeveloper/) 或 SQL\$1Plus，用于连接和在 Oracle 数据库上运行 SQL 命令
+ 用于执行评测的数据库用户。例如以下用户之一：
  + 拥有足够[权限](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.Permissions)运行 [AWS Schema Conversion Tool (AWS SCT) ](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)评测的用户
  + 具有足够权限的用户，可以对 Oracle 数据库字典表运行 SQL 查询
+ 用于执行数据库迁移的数据库用户，例如以下用户之一：
  + 拥有足够[权限](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html#CHAP_Source.Oracle.Self-Managed)运行 [AWS Database Migration Service(AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 的用户
  + 具有[执行 Oracle Data Pump 导出和导入的足够权限](https://docs.oracle.com/database/121/SUTIL/GUID-8B6975D3-3BEC-4584-B416-280125EEC57E.htm#SUTIL807)的用户
  + 拥有足够[权限运行 Oracle 的](https://docs.oracle.com/goldengate/1212/gg-winux/GIORA/user_assignment.htm#GIORA546)用户 GoldenGate

**限制**
+ Amazon RDS for Oracle 具有最大数据库大小。有关更多信息，请参阅 [Amazon RDS 数据库实例存储](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html)。

**产品版本**

此文档中描述的一般逻辑适用于 9i 及更高版本的 Oracle。有关自托管数据库和 Amazon RDS for Oracle 数据库的支持版本，请参阅 [AWS DMS 文档](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)。

若要在不支持 AWS SCT 的情况下确定功能使用情况，请在源数据库上运行 SQL 查询。要从不支持 AWS DMS 和 Oracle Data Pump 的早期版本 Oracle 迁移，请使用 [Oracle 导出和导入实用程序](https://docs.oracle.com/cd/B19306_01/server.102/b14215/exp_imp.htm)。

有关当前支持的版本的列表，请参阅 AWS 文档中的 [Oracle on Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Oracle.html)。有关定价和支持的实例类的详细信息，请参阅 [Amazon RDS for Oracle pricing](https://aws.amazon.com/rds/oracle/pricing/)。

## 架构
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle-architecture"></a>

**源技术堆栈**
+ 在本地或亚马逊上运行的 Oracle 数据库企业版 EC2

**使用原生 Oracle 工具瞄准技术堆栈**
+ 运行 Oracle 数据库的 Amazon RDS for Oracle SE2

![\[从本地 Oracle 数据库迁移至 Amazon RDS 的三步流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a1b28050-9bab-4de6-b2a9-b97b3e5070bd/images/bf765c5b-4b12-4a8c-b27c-c5e0bd605dd1.png)


 

1. 使用 Oracle Data Pump 导出数据。

1. 通过数据库链接将转储文件复制至 Amazon RDS。

1. 使用 Oracle Data Pump 将转储文件导入 Amazon RDS。

**使用 AWS DMS 瞄准技术堆栈**
+ 运行 Oracle 数据库的 Amazon RDS for Oracle SE2
+ AWS DMS

![\[使用 AWS DMS 从本地 Oracle 数据库迁移至 Amazon RDS 的四步流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a1b28050-9bab-4de6-b2a9-b97b3e5070bd/images/fef4eced-1acb-4303-baaa-5c1c29650935.png)


1. 使用 Oracle Data Pump 和 FLASHBACK\$1SCN 导出数据。

1. 通过数据库链接将转储文件复制至 Amazon RDS。

1. 使用 Oracle Data Pump 将转储文件导入 Amazon RDS。

1. 使用 AWS DMS [更改数据捕获 (CDC)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Task.CDC.html)。

## 工具
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle-tools"></a>

**Amazon Web Services**
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到 Amazon Web Services Cloud，或者在云和本地设置的组合之间迁移。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展关系数据库。此模式使用了 Amazon RDS for Oracle。
+ [AWS SCT](https://docs.aws.amazon.com/SchemaConversionTool/latest/userguide/CHAP_Welcome.html)** **提供了一个基于项目的用户界面，用于自动评测、转换源 Oracle 数据库的数据库架构，并将其复制为与 Amazon RDS for Oracle 兼容的格式。AWS SCT 让您可以分析将 Oracle 许可证类型从 Enterprise 版更改为 Standard Edition 可以实现的潜在成本节省。AWS SCT 报告的**许可评估和云支持**部分提供了有关正在使用的 Oracle 功能的详细信息，因此您可在迁移至 Amazon RDS for Oracle 时做出明智的决定。

**其他工具**
+ 原生 Oracle 导入和导出实用工具可以将 Oracle 数据移入和移出 Oracle 数据库。Oracle 提供两种类型的数据库导入和导出实用工具：[源 Export and Import](https://docs.oracle.com/cd/B19306_01/server.102/b14215/exp_imp.htm)（适用于早期版本）和[ Oracle Data Pump Export and Import](https://docs.oracle.com/cd/B19306_01/server.102/b14215/part_dp.htm#CEGJCCHC)（适用于 Oracle Database 10g 版本 1 及更高版本）。
+ [Oracle GoldenGate](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.OracleGoldenGate.html) 提供了实时复制功能，因此您可以在初始加载后同步目标数据库。此选项有助于帮助减少上线期间的应用程序停机时间。

## 操作说明
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle-epics"></a>

### 执行迁移前评测
<a name="make-a-pre-migration-assessment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证应用程序数据库要求。 | 确保您的应用程序经过认证，可以在 Oracle 数据库上运行 SE2。直接咨询软件供应商、开发人员或应用程序文档。 | 应用程序开发者、数据库管理员、应用程序所有者 | 
| 直接在数据库中研究 EE 功能的使用。 | 若要确定 EE 功能的使用，请执行以下操作之一：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle.html) | 应用程序所有者，数据库管理员，应用程序开发者 | 
| 确定 EE 功能在运营活动中的使用。 | 数据库或应用程序管理员有时依赖仅限 EE 的功能进行操作活动。常见的示例包括在线维护活动（索引重建、表移动）和批处理作业对并行性的使用。只要有可能，就可以通过修改操作来缓解这些依赖项。确定这些功能的用途，并按成本和收益做出决策。使用 “[比较 Oracle 数据库 EE 和 SE2 功能](https://docs.aws.amazon.com/prescriptive-guidance/latest/evaluate-downgrading-oracle-edition/compare-features.html)” 表作为指南，确定 Oracle 数据库中可用的功能 SE2。 | 应用程序开发者、数据库管理员、应用程序所有者 | 
| 查看 EE Oracle 数据库的工作负载模式。 | Oracle 数据库在任何时候 SE2 都会自动将使用量限制为最多 16 个 CPU 线程。如果您的 Oracle EE 数据库已获得使用 Oracle 诊断包的许可，请使用自动工作量存储库 (AWR) 工具或 DBA\$1HIST\$1\$1 视图来分析数据库工作负载模式，以确定降级到时，16 个 CPU 线程的最大限制是否会对服务级别产生负面影响。 SE2确保您的评测涵盖活动高峰期，如日末、月末或年末处理。 | 应用程序所有者，数据库管理员，应用程序开发者 | 

### 在 AWS 上准备目标基础设施
<a name="prepare-the-target-infrastructure-on-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署和配置联网基础设施。 | 创建[虚拟私有云（VPC）和子网](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html)、[安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)和[网络访问控制列表](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)。 | AWS 管理员、云架构师、网络管理员、 DevOps 工程师 | 
| 预配置 Amazon RDS for Oracle SE2 数据库。 | 预置目标 [Amazon RDS for Oracle](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.Oracle.html) SE2 数据库，以满足应用程序的性能、可用性和安全要求。建议对生产工作负载使用多可用区配置。但是，为了提高迁移性能，您可将[启用多可用区](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/create-multi-az-db-cluster.html)推迟到数据迁移之后。 | 云管理员、云架构师、数据库管理员、 DevOps 工程师、AWS 管理员 | 
| 自定义 Amazon RDS 环境。 | 配置自定义[参数](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)和[选项](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithOptionGroups.html)，并启用其他[监控](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MonitoringOverview.html)。有关更多信息，请参阅‭[迁移至 Amazon RDS for Oracle 的最佳实践](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/best-practices.html)。 | AWS 管理员、AWS 系统管理员、云管理员、数据库管理员、云架构师 | 

### 执行迁移试运行和应用程序测试
<a name="perform-the-migration-dry-run-and-application-testing"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 迁移数据（试运行）。 | 使用最适合您的特定环境的方法，将数据从源 Oracle EE SE2 数据库迁移到 Amazon RDS for Oracle 数据库实例。按规模、复杂性和可用停机时间等因素选择迁移策略。使用以下方法之一或组合使用二者：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle.html) | 数据库管理员 | 
| 验证目标数据库。 | 对数据库存储与代码对象执行迁移后验证。查看迁移日志，并修复所有已发现问题。有关更多信息，请参阅指南[将 Oracle 数据库迁移至 AWS Cloud](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/best-practices.html#post-import)。 | 数据库管理员 | 
| 测试应用程序。 | 应用程序和数据库管理员应酌情执行功能、性能和操作测试。有关更多信息，请参阅[迁移至 Amazon RDS for Oracle 的最佳实践](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/best-practices.html#test-migration)。最后获得利益相关者对测试结果的签字。 | 应用程序开发者，应用程序所有者，数据库管理员，迁移工程师，迁移主管 | 

### 割接
<a name="cut-over"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 刷新 Oracle 数据库 EE 数据。 | 根据应用程序可用性要求，选择数据刷新方法。有关更多信息，请参阅[将 Oracle 数据库迁移至 AWS 的策略](https://docs.aws.amazon.com/whitepapers/latest/strategies-migrating-oracle-db-to-aws/data-migration-methods.html)中的迁移方法。例如，通过使用诸如 Oracle GoldenGate 或 AWS DMS 之类的工具进行持续复制，您可以实现近乎零的停机时间。如果停机窗口允许，则可以使用离线方法（例如 Oracle Data Pump 或 Original Export-Import 实用程序）执行最终的数据割接。 | 应用程序所有者，割接主管，数据库管理员，迁移工程师，迁移主管 | 
| 将应用程序指向目标数据库实例。 | 更新应用程序和其他客户端中的连接参数，使其指向 Amazon RDS for Oracle SE2 数据库。 | 应用程序开发者，应用程序所有者，迁移工程师，迁移主管，割接主管 | 
| 执行迁移后活动。 | 执行数据迁移后的任务，例如启用多可用区、数据验证以及其他检查。 | 数据库管理员，迁移工程师 | 
| 执行割接后监控。 | 使用诸如[亚马逊 CloudWatch和亚马逊](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/monitoring-cloudwatch.html) [RDS Performance Insights](https://aws.amazon.com/rds/performance-insights/) 之类的工具来监控 Amazon RDS for Oracle SE2 数据库。 | 应用程序开发者，应用程序所有者，AWS 管理员，数据库管理员，迁移工程师 | 

## 相关资源
<a name="replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle-resources"></a>

**AWS 规范指引**
+ [将 Oracle 数据库迁移至 Amazon Web Services Cloud](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/welcome.html)（指南）
+ [评估将 Oracle 数据库降级为 Standard Edition 2 on AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/evaluate-downgrading-oracle-edition/welcome.html)（指南）
+ [将本地 Oracle 数据库迁移至至 Amazon RDS for Oracle](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle.html?did=pg_card&trk=pg_card)（模式）
+ [使用 Oracle Data Pump 将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump.html?did=pg_card&trk=pg_card)（模式）

**博客文章**
+ [使用 AWS DMS 以近乎零停机时间迁移 Oracle 数据库](https://aws.amazon.com/blogs/database/migrating-oracle-databases-with-near-zero-downtime-using-aws-dms/)
+ [使用 Amazon RDS for Oracle 分析 Oracle SE 中的性能管理](https://aws.amazon.com/blogs/database/analyzing-performance-management-in-oracle-se-using-amazon-rds-for-oracle/)
+ [使用 Amazon RDS for Oracle 管理 Oracle SE 中的 SQL 计划](https://aws.amazon.com/blogs/database/managing-your-sql-plan-in-oracle-se-with-amazon-rds-for-oracle/)
+ [在 Oracle Standard Edition 中实现表分区：第 1 部分](https://aws.amazon.com/blogs/database/implementing-table-partitioning-in-oracle-standard-edition-part-1/)

# 使用 Precission Connect 将大型机数据库复制到 AWS
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect"></a>

*Lucio Pereira、Sayantan Giri 和 Balaji Mohan，Amazon Web Services*

## Summary
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-summary"></a>

此模式概述了使用 Precission Connect 近乎实时地将数据从大型机数据库复制到 Amazon 数据存储的步骤。它通过 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 和云中的自定义数据库连接器实现了基于事件的架构，以提高可扩展性、弹性和性能。

Precisely Connect 是一种复制工具，可从遗留大型机系统捕获数据并将其集成到云环境中。通过使用具有低延迟和高吞吐量的异构数据管道的近乎实时的消息流，通过变更数据捕获 (CDC) 将数据从大型机复制到 AWS。 

该模式还涵盖了具有多区域数据复制和失效转移路由功能的弹性数据管道的灾难恢复策略。

## 先决条件和限制
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-prereqs"></a>

**先决条件**
+ 要复制到 AWS 云的现有大型机数据库，例如 IBM DB2、IBM 信息管理系统 (IMS) 或虚拟存储访问方法 (VSAM)
+ 一个有效的 [Amazon Web Services account](https://aws.amazon.com/account/)
+ 从您的企业环境到 AWS 的 [AWS Direct Connect](https://aws.amazon.com/directconnect/) 或 [AWS Virtual Private Network (AWS VPN](https://aws.amazon.com/vpn/))
+ 具有可由您的旧平台访问的子网的[虚拟私有云](https://aws.amazon.com/vpc/)

## 架构
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-architecture"></a>

**源技术堆栈**

至少包含以下数据库之一的大型机环境：
+ IBM IMS 数据库
+ IBM DB2 数据库
+ VSAM 文件

**目标技术堆栈**
+ Amazon MSK
+ Amazon Elastic Kubernetes Service (Amazon EKS) 和 Amazon EKS Anywhere
+ Docker
+ AWS 关系或 NoSQL 数据库，如下所示：
  + Amazon DynamoDB
  + Amazon Relational Database Service (Amazon RDS) for Oracle、Amazon RDS for PostgreSQL 或 Amazon Aurora
  +  ElastiCache 适用于 Redis 的 Amazon
  + Amazon Keyspaces（Apache Cassandra 兼容）

**目标架构**

*将大型机数据复制至 AWS 数据库*

下图说明了将大型机数据复制到 AWS 数据库，例如 DynamoDB、Amazon RDS、Amazon 或 Amazon Keyspac ElastiCache es 的情况。通过在本地大型机环境中使用 Precisely Capture 和 Publisher、在本地分布式环境中使用 Amazon EKS Anywhere 上的 Precisely Dispatcher 以及在 Amazon Web Services Cloud 中使用 Precisely Apply Engine 和数据库连接器，可以近乎实时地进行复制。 

![\[将大型机数据复制到 AWS 数据库\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/17ac53b7-86d5-4a8c-a55f-56b6338a1af3/images/777dd7da-48ed-4510-b8fa-9041be042671.png)


图表显示了以下工作流：

1. Precisely Capture 从 CDC 日志中获取大型机数据，并将数据维护在内部临时存储中。

1. 精确地 Publisher 监听内部数据存储的变化，并通过连接将 CDC 记录发送到 Precist Dispatcher。 TCP/IP 

1. Precisely Dispatcher 从 Publisher 接收 CDC 记录并将其发送到 Amazon MSK。调度程序根据用户配置和多个工作任务创建 Kafka 键以并行推送数据。当记录存储在 Amazon MSK 中后，调度程序会向 Publisher 发送确认信息。

1. Amazon MSK 在云环境中保存 CDC 记录。主题的分区大小取决于您的事务处理系统 (TPS) 对吞吐量的要求。Kafka 密钥对于进一步的转换和事务排序是必需的。

1. Precisely Apply Engine 监听来自 Amazon MSK 的 CDC 记录，并根据目标数据库要求转换数据（例如，通过筛选或映射）。您可将自定义逻辑添加至 Precission SQD 脚本。（SQD 是 Precist 的专有语言。） Precisely Apply Engine 将每条 CDC 记录转换为 Apache Avro 或 JSON 格式，并根据您的要求将其分发到不同的主题。

1. 目标 Kafka 主题根据目标数据库保存多个主题中的 CDC 记录，并且 Kafka 根据定义的 Kafka 键促进事务排序。分区键与相应的分区对齐以支持顺序过程。 

1. 数据库连接器（自定义 Java 应用程序)监听来自 Amazon MSK 的 CDC 记录并将其存储在目标数据库中。

1. 可根据您的要求选择目标数据库。此模式同时支持 NoSQL 与关系数据库。

*灾难恢复*

业务连续性是组织成功的关键。Amazon Web Services Cloud 提供高可用性 (HA) 和灾难恢复 (DR) 功能，并支持贵组织的失效转移和备用计划。这种模式遵循 active/passive 灾难恢复策略，为实施符合您的 RTO 和 RPO 要求的灾难恢复策略提供了高级指导。

下图说明了 DR 的工作流。

![\[用于在 AWS 上复制大型机数据的灾难恢复工作流\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/17ac53b7-86d5-4a8c-a55f-56b6338a1af3/images/9cccba7a-7a25-411e-829f-7cd5a7a20ab4.png)


此图显示以下内容：

1. 如果 AWS 区域 1 发生任何故障，则需要进行半自动失效转移。如果区域 1 出现故障，系统必须启动路由更改，才能将 Precisly Dispatcher 连接至区域 2。 

1. Amazon MSK 在不同区域间通过镜像复制数据，因此，在失效转移期间，区域 2 中的 Amazon MSK 集群必须提升为主要领导者。 

1. Precisely Apply Engine 和数据库连接器是无状态应用程序，可以在任何区域中工作。 

1. 数据库同步取决于目标数据库。例如，DynamoDB 可以使用全局表，也可以使用全局数据 ElastiCache 存储。

*通过数据库连接器执行低延迟和高吞吐量处理*

数据库连接器是此模式中的关键组件。连接器采用基于侦听器的方法从 Amazon MSK 收集数据，并通过任务关键型应用程序（第 0 层和第 1 层)的高吞吐量和低延迟处理将事务发送到数据库。下图阐明了此过程。

![\[使用数据库连接器在 AWS 复制大型机数据\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/17ac53b7-86d5-4a8c-a55f-56b6338a1af3/images/79479634-becb-4212-bbfc-1a3b17ae1bed.png)


该模式支持通过多线程处理引擎开发具有单线程消耗的定制应用程序。

1. 连接器主线程使用来自 Amazon MSK 的 CDC 记录并将其发送至线程池进行处理。

1. 线程池中的线程处理 CDC 记录并将其发送至目标数据库。

1. 如果所有线程都处于繁忙状态，则线程队列保留 CDC 记录。

1. 主线程等待从线程队列中清除所有记录，并将偏移量提交至 Amazon MSK 中。

1. 子线程处理故障。如果在处理过程中发生故障，则失败的消息将发送到 DLQ（死信队列）主题。

1. 子线程根据大型机时间戳启动条件更新（参见 DynamoDB 文档中的条件[表达式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)），以避免数据库中的任何重复 out-of-order或更新。

有关如何实现具有多线程功能的 Kafka 消费者应用程序的信息，请参阅 Confluent 网站上的博客文章 [Apache Kafka 消费者使用多线程消息消费](https://www.confluent.io/blog/kafka-consumer-multi-threaded-messaging/)。

## 工具
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-tools"></a>

**Amazon Web Services**
+ [Amazon Managed Streaming for Apache Kafka (Amazon MSK)](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) 是一项完全托管式服务，可帮助您构建并运行使用 Apache Kafka 来处理流数据的应用程序。
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) 可帮助您在 AWS 上运行 Kubernetes，而无需安装或维护您自己的 Kubernetes 控制面板或节点。
+ [Amazon EKS Anywhere](https://anywhere.eks.amazonaws.com/docs/) 帮助您部署、使用和管理在您自己的数据中心运行的 Kubernetes 集群。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [Amazon Relational Database Service (Amazon RDS)](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展关系数据库。
+ [Amazon ElastiCache](https://docs.aws.amazon.com/elasticache/) 可帮助您在 AWS 云中设置、管理和扩展分布式内存缓存环境。
+ [Amazon Keyspaces（Apache Cassandra 兼容）](https://docs.aws.amazon.com/keyspaces/latest/devguide/what-is-keyspaces.html)是一项托管数据库服务，可帮助您在 Amazon Web Services Cloud 中迁移、运行和扩展 Cassandra 工作负载。

**其他工具**
+ [Precission Connect](https://www.precisely.com/product/precisely-connect/connect) 将来自传统大型机系统（例如 VSAM 数据集或 IBM 大型机数据库)的数据集成到下一代云和数据平台中。

## 最佳实践
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-best-practices"></a>
+ 找到 Kafka 分区和多线程连接器的最佳组合，从而平衡最佳性能和成本。由于 MIPS（每秒百万条指令）消耗量更高，多个 Precist Capture 和 Dispatcher 实例可能会增加成本。
+ 避免向数据库连接器添加数据操作和转换逻辑。为此，请使用 Precisely Apply Engine，它提供以微秒为单位的处理时间。
+ 在数据库连接器中创建对数据库的定期请求或运行状况检查调用（*检测信号*），以频繁预热连接并减少延迟。
+ 实现线程池验证逻辑，以了解线程队列中的待处理任务，并在下一次 Kafka 轮询之前等待所有线程完成。这有助于避免节点、容器或进程崩溃时数据丢失。
+ 通过运行状况端点公开延迟指标，通过控制面板和跟踪机制增强可观测性。

## 操作说明
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-epics"></a>

### 准备源环境（本地）
<a name="prepare-the-source-environment-on-premises"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 设置大型机过程（批处理或在线实用程序），以从大型机数据库启动 CDC 过程。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 大型机工程师 | 
| 激活大型机数据库日志流。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 大型机数据库专家 | 
| 使用捕获组件捕获 CDC 记录。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 大型机工程师、Precisely Connect SME | 
| 配置 Publisher 组件以侦听 Capture 组件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 大型机工程师、Precisely Connect SME | 
| 在本地分布式环境中预配 Amazon EKS Anywhere。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | DevOps 工程师 | 
| 在分布式环境中部署和配置 Dispatcher 组件，以便在 Amazon Web Services Cloud 中发布主题。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | DevOps 工程师，Precission Conn | 

### 准备目标环境 (AWS)
<a name="prepare-the-target-environment-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在指定的 AWS 区域配置 Amazon EKS 集群。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | DevOps 工程师、网络管理员 | 
| 配置 MSK 集群并配置适用 Kafka 主题。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | DevOps 工程师、网络管理员 | 
| 配置 Apply Engine 组件，以侦听复制的 Kafka 主题。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | Precisely Connect SME | 
| 在 Amazon Web Services Cloud 中配置 DB 实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 数据工程师、 DevOps 工程师 | 
| 配置和部署数据库连接器以侦听 Apply Engine 发布的主题。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 应用程序开发人员、云架构师、数据工程师 | 

### 设置业务连续性和灾难恢复
<a name="set-up-business-continuity-and-disaster-recovery"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为您的业务应用程序定义灾难恢复目标。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 云架构师、数据工程师、应用程序所有者 | 
| 根据定义 RTO/RPO 设计灾难恢复策略。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 云架构师、数据工程师 | 
| 配置灾难恢复集群和配置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | DevOps 工程师、网络管理员、云架构师 | 
| 测试 CDC 管道灾难恢复。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/replicate-mainframe-databases-to-aws-by-using-precisely-connect.html) | 应用程序所有者、数据工程师、云架构师 | 

## 相关资源
<a name="replicate-mainframe-databases-to-aws-by-using-precisely-connect-resources"></a>

**AWS 资源**
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)
+ [Amazon DynamoDB 的条件表达式](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)
+ [Amazon EKS](https://docs.aws.amazon.com/eks/index.html)
+ [Amazon EKS Anywhere](https://anywhere.eks.amazonaws.com/docs/)
+ [Amazon ElasticCache](https://docs.aws.amazon.com/elasticache/index.html)
+ [Amazon Keyspaces](https://docs.aws.amazon.com/keyspaces/?icmpid=docs_homepage_databases)
+ [Amazon MSK](https://docs.aws.amazon.com/msk/latest/developerguide/getting-started.html)
+ [Amazon RDS 和 Amazon Aurora](https://docs.aws.amazon.com/rds/index.html)
+ [Amazon VPC](https://docs.aws.amazon.com/vpc/index.html)

**Precisely Connect 资源**
+ [Precisely Connect 概述](https://www.precisely.com/product/precisely-connect/connect)
+ [使用 Precise Connect 更改数据捕获](https://help.precisely.com/r/Connect-CDC-SQData/4.1/en-US/Connect-CDC-SQData-Installation/Connect-CDC-SQData-Architecture)

**Confluent 资源**
+ [Apache Kafka 消费者使用多线程消息消费](https://www.confluent.io/blog/kafka-consumer-multi-threaded-messaging/)

# 使用 Lambda 和 Secrets Manager 计划适用于 Amazon RDS for PostgreSQL 和 Aurora PostgreSQL 的任务
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager"></a>

*Yaser Raja，亚马逊 Web Services*

## Summary
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager-summary"></a>

对于本地数据库和托管在亚马逊弹性计算云 (Amazon EC2) 实例上的数据库，数据库管理员通常使用 **cron** 实用程序来安排作业。

例如，使用 **cron** 可轻松地安排数据提取任务或数据清除任务。对于这些任务，数据库凭证通常为硬编码或存储于属性文件。但是，当您迁移至 Amazon Relational Database Service (Amazon RDS) 或 Amazon Aurora PostgreSQL-Compatible Edition，您将无法登录主机实例安排 **cron** 任务。 

此模式描述了迁移后如何使用 AWS Lambda 和 AWS Secrets Manager 安排适用于 PostgreSQL 的亚马逊 RDS 和兼容 Aurora PostgreSQL 的数据库的作业。 

## 先决条件和限制
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ Amazon RDS for PostgreSQL 或 Aurora PostgreSQL-Compatible 数据库

**限制**
+ 任务必须在 15 分钟内完成，这是 Lambda 函数的超时限值。有关其他限制，请参阅 [AWS Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)。
+ 任务代码必须按 [Lambda 支持语言](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)编写。

## 架构
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager-architecture"></a>

**源技术堆栈**

此堆栈包含通过 Bash、Python 和 Java 等语言编写的任务。数据库凭证存储于属性文件，任务使用 Linux **cron** 调度。

**目标技术堆栈**

此堆栈包含 Lambda 函数，该函数使用存储在 Secrets Manager 中的凭证连接至数据库并执行活动。Lambda 函数通过使用亚马逊 CloudWatch 事件按计划的时间间隔启动。

**目标架构**

![\[CloudWatch 事件启动了 Lambda 函数，该函数为 RDS 数据库实例安排作业。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/8e0d1c90-0599-4909-a800-26a89b87f686/images/61f9ca34-9157-4565-96ba-5234d389ac2a.png)


## 工具
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager-tools"></a>
+ [Amazon CloudWatch ](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/WhatIsCloudWatchEvents.html) Events 提供近乎实时的系统事件流，这些事件描述了 AWS 资源的变化。使用可以快速设置的简单规则，您可以匹配事件并将其路由到一个或多个目标函数或流。 CloudWatch 事件在发生时就会意识到操作变化。其可响应这些操作更改并在必要时采取纠正措施，方式是发送消息以响应环境、激活函数、进行更改并捕获状态信息。您还可以使用 Ev CloudWatch ents 来安排自动操作，这些操作在特定时间使用 **cron** 或**速率**表达式自行启动。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可使您无需调配或管理服务器即可运行代码。Lambda 只在需要时运行您的代码，并自动进行扩展，从每天几个请求扩展到每秒数千个请求。您只需按消耗的计算时间付费；代码未运行时不产生费用。借助 Lambda，您几乎可以为任何类型的应用程序或后端服务运行代码，并且不必进行任何管理。Lambda 可在高可用性计算基础设施上运行代码，管理所有计算资源，其中包括服务器和操作系统维护、容量预调配和自动扩缩、代码监控和日志记录。您只需要以 [Lambda 支持的一种语言](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)提供您的代码。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可帮助您保护用于访问您的应用程序、服务和 IT 资源的密钥。您可以在数据库凭证、API 密钥和其他密钥的整个生命周期内轻松地对其进行轮换、管理和检索。用户和应用程序通过调用 Secrets Manager 来检索机密 APIs，无需以纯文本格式对敏感信息进行硬编码。Secrets Manager 使用 Amazon RDS、Amazon Redshift 和 Amazon DocumentDB 的内置集成提供密钥轮换。该服务可扩展到其他类型的机密，包括 API 密钥和 OAuth 令牌。Secrets Manager 使您能够使用细粒度的权限控制对机密的访问 AWS 云，并集中审核第三方服务和内部资源的密钥轮换。

## 操作说明
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager-epics"></a>

### 将数据库凭证存储至 Secrets Manager
<a name="store-database-credentials-in-asm"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 Lambda 函数 创建数据库用户。 | 最好将不同的数据库用户用于不同的应用程序部分。如果您的 cron 任务已有单独的数据库用户，请使用该用户。否则，创建一个新数据库用户。有关更多信息，请参阅[管理 PostgreSQL 用户和](https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/)角色AWS （博客文章）。 | 数据库管理员 | 
| 将数据库凭证作为密钥存储至 Secrets Manager。 | 按照[创建数据库密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_database_secret.html)（Secrets Manager 文档）中的说明。 | 数据库管理员， DevOps | 

### 编写 Lambda 函数的代码。
<a name="author-the-code-for-the-lam-function"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 选择 Lambda 支持的编程语言。 | 有关支持的语言列表，请参阅 [Lambda 运行时系统](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)（Lambd 文档）。 | 开发者版 | 
| 编写从 Secrets Manager 获取数据库凭证的逻辑。 | 有关示例代码，请参阅[如何使用安全地向 Lambda 函数提供数据库凭证 AWS Secrets Manager](https://aws.amazon.com/blogs/security/how-to-securely-provide-database-credentials-to-lambda-functions-by-using-aws-secrets-manager/)（AWS 博客文章）。 | 开发者版 | 
| 编写执行计划数据库活动的逻辑。 | 将本地正在使用的现有计划任务代码迁移至 Lambda 函数。有关更多信息，请参阅[部署 Lambda 函数](https://docs.aws.amazon.com/lambda/latest/dg/lambda-deploy-functions.html)（Lambda 文档）。 | 开发者版 | 

### 部署代码并创建 Lambda 函数
<a name="deploy-the-code-and-create-the-lam-function"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Lambda 函数部署包。 | 此数据包包含代码及其依赖项。有关更多信息，请参阅[部署包](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html)（Lambda 文档）。 | 开发者版 | 
| 创建 Lambda 函数。 | 在 Lambda 控制台中，选择**创建函数**，输入函数名称，选择运行时环境，然后选择**创建函数**。 | DevOps | 
| 构建部署程序包。 | 选择您创建的 Lambda 函数，以打开其配置。您可以直接在代码部分编写代码或上传部署包。若要上传数据包，请前往**函数代码**部分，选择要上传 .zip 文件的**代码条目类型**，然后选择该数据包。 | DevOps | 
| 根据您的要求配置 Lambda 函数。 | 例如，您可以将**超时**参数设置为您的 Lambda 函数预计花费的时间。有关更多信息，请参阅[配置函数选项](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html)（Lambda 文档）。 | DevOps | 
| 为 Lambda 函数角色设置 Secrets Manager 访问权限。 | 有关说明，请参阅[在 AWS Lambda 函数中使用密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/retrieving-secrets_lambda.html)（Secrets Manager 文档）。 | DevOps | 
| 测试 Lambda 函数 | 手动启动 Lambda 函数，以确保其按预期运行。 | DevOps | 

### 使用事件安排 Lambda 函数 CloudWatch
<a name="schedule-the-lam-function-by-using-cwe"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建按计划运行 Lambda 函数的规则。 | 使用 CloudWatch 事件安排 Lambda 函数。有关说明，请参阅[使用 CloudWatch 事件安排 Lambda 函数（CloudWatch 事件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html)教程）。 | DevOps | 

## 相关资源
<a name="schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager-resources"></a>
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)
+ [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)
+ [创建在 CloudWatch 事件上触发的事件规则](https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/Create-CloudWatch-Events-Rule.html)
+ [AWS Lambda 限制](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)
+ [从无服务器应用程序查询 AWS 数据库](https://aws.amazon.com/blogs/database/query-your-aws-database-from-your-serverless-application/)（博客文章）

# 使用本地 SMTP 服务器和数据库邮件发送 Amazon RDS for SQL Server 数据库实例通知
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail"></a>

*Nishad Mankar，Amazon Web Services*

## Summary
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-summary"></a>

[数据库邮件](https://learn.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail?view=sql-server-ver16)（Microsoft 文档）使用简单邮件传输协议 (SMTP) 服务器从 Microsoft SQL Server 数据库发送电子邮件，例如通知或警报。Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 文档提供了使用 Amazon Simple Email Service (Amazon SES) 作为数据库邮件的 SMTP 服务器的说明。有关详细信息，请参阅[在 Amazon RDS for SQL Server 上使用 Database Mail](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.DBMail.html)。作为替代配置，此模式说明了如何使用本地 SMTP 服务器作为邮件服务器，将数据库邮件配置为从 Amazon RDS for SQL Server 数据库（DB）实例发送电子邮件。

## 先决条件和限制
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 运行标准版或企业版 SQL Server 的 Amazon RDS 数据库实例
+ 本地 SMTP 服务器的 IP 地址或主机名
+ 入站[安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html#working-with-security-group-rules)，允许从 SMTP 服务器的 IP 地址连接到 Amazon RDS for SQL Server 数据库实例
+ 您的本地网络与包含 Amazon RDS 数据库实例的虚拟私有云（VPC）之间的连接，例如 [AWS Direct Connect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html) 连接

**限制**
+ 不支持 SQL Server Express 版。
+ 有关限制的更多信息，请参阅 Amazon RDS 文档中的*在 Amazon RDS for SQL Server 上使用数据库邮件*中的[限制](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html#SQLServer.Concepts.General.FeatureSupport.Limits)。

**产品版本**
+ [RDS 中支持的 SQL Server 版本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html#SQLServer.Concepts.General.VersionSupport)的标准版和企业版

## 架构
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-architecture"></a>

**目标技术堆栈**
+ Amazon RDS for SQL Server 数据库实例
+ Amazon Route 53 转发规则
+ 数据库邮件
+ 本地 SMTP 服务器
+ Microsoft SQL Server Management Studio (SSMS)

**目标架构**

下图显示了此模式的目标架构。当发生启动有关数据库实例的通知或警报的事件或操作时，Amazon RDS for SQL Server 使用数据库邮件发送电子邮件通知。数据库邮件通过本地 SMTP 服务器发送电子邮件。

![\[Amazon RDS for SQL Server 使用本地 SMTP 服务器向用户发送电子邮件通知。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/e5599724-43cf-4fe1-8c5a-8fca1a424993/images/47efb12f-3505-4a60-ac43-194a176e71c8.png)


## 工具
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-tools"></a>

**Amazon Web Services**
+ [Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_SQLServer.html) 可帮助您在 Amazon Web Services Cloud 中设置、操作和扩展 SQL Server 关系数据库。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一种可用性高、可扩展性强的 DNS Web 服务。

**其他工具**
+ [数据库邮件](https://learn.microsoft.com/en-us/sql/relational-databases/database-mail/database-mail)是一种从 SQL Server 数据库引擎向用户发送电子邮件（例如通知和警报）的工具。
+ [Microsoft SQL Server Management Studio (SSMS)](https://docs.microsoft.com/en-us/sql/ssms/sql-server-management-studio-ssms) 是一款用于管理 SQL Server 的工具，包括访问、配置和管理 SQL Server 组件。在这种模式中，您可使用 SSMS 运行 SQL 命令在 Amazon RDS for SQL Server 数据库实例上设置数据库邮件。 

## 操作说明
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-epics"></a>

### 启用与本地 SMTP 服务器的网络连接
<a name="enable-network-connectivity-with-the-on-premises-smtp-server"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 从 RDS 数据库实例中删除多可用区。 | 如果您使用的是多可用区 RDS 数据库实例，请将多可用区实例转换为单可用区实例。完成配置数据库邮件后，您会将数据库实例转换回多可用区部署。然后，主节点和辅助节点都具有数据库邮件配置。有关说明，请参阅[从 Microsoft SQL Server 数据库实例删除多可用区](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_SQLServerMultiAZ.html#USER_SQLServerMultiAZ.Removing)。 | 数据库管理员 | 
| 为本地 SMTP 服务器上的 Amazon RDS 端点或 IP 地址创建允许列表。 | SMTP 服务器位于 AWS 网络之外。在本地 SMTP 服务器上，创建一个允许列表，允许服务器与 Amazon RDS 实例或托管在 Amazon RDS 上的亚马逊弹性计算云 (Amazon EC2) 实例的出站终端节点或 IP 地址进行通信。此进程因组织而异。有关数据库实例端点的更多信息，请参阅[查找数据库实例端点和端口号](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToMicrosoftSQLServerInstance.html#sqlserver-endpoint)。 | 数据库管理员 | 
| 移除端口 25 限制。 | 默认情况下，AWS 限制 EC2 实例上的端口 25。要取消端口 25 限制，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.html)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.html) | 常规 AWS | 
| 添加 Route 53 规则，以解析 SMTP 服务器 DNS 查询。 | 使用 Route 53 解析您的 AWS 资源和本地 SMTP 服务器之间的 DNS 查询。您必须创建将 DNS 查询转发到 SMTP 服务器域的规则，例如 `example.com`。有关说明，请参阅 Route 53 文档中的[创建转发规则](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resolver-rules-managing.html#resolver-rules-managing-creating-rules)。 | 网络管理员 | 

### 在 Amazon RDS for SQL Server 数据库实例上设置数据库邮件
<a name="set-up-database-mail-on-the-amazon-rds-for-sql-server-db-instance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启用数据库邮件。 | 为数据库邮件创建参数组，将 `database mail xps` 参数设置为 `1`，然后将数据库邮件参数组与目标 RDS 数据库实例关联。有关说明，请参阅 Amazon RDS 文档中的[启用数据库邮件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.DBMail.html#SQLServer.DBMail.Enable)。不要继续进入到这些说明中的*配置数据库邮件*部分。本地 SMTP 服务器配置与 Amazon SES 不同。 | 数据库管理员 | 
| 连接到数据库实例。 | 从堡垒主机，使用 Microsoft SQL Server Management Studio (SSMS) 连接至 Amazon RDS for SQL Server 数据库实例。有关说明，请参阅[连接到运行 Microsoft SQL Server 数据库引擎的数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToMicrosoftSQLServerInstance.html)。如果您遇到任何错误，请参阅[相关资源](#send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-resources)部分中的连接疑难解答参考资料。 | 数据库管理员 | 
| 创建配置文件。 | 在 SSMS 中，输入以下 SQL 语句创建数据库邮件配置文件。替换以下值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.html)有关此存储过程及其参数的更多信息，请参阅 Microsoft 文档中的 [sysmail\$1add\$1profile\$1sp](https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profile-sp-transact-sql)。<pre>EXECUTE msdb.dbo.sysmail_add_profile_sp<br /> @profile_name = 'SQL Alerts profile',<br /> @description = 'Profile used for sending outgoing notifications using OM SMTP Server.';</pre> | 数据库管理员 | 
| 在个人资料中添加主体。 | 输入以下 SQL 语句，将公共或私有主体添加到数据库邮件配置文件中。*委托人*指可以请求获取 SQL Server 资源的实体。替换以下值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.html)有关此存储过程及其参数的更多信息，请参阅 Microsoft 文档中的 [sysmail\$1add\$1principalprofile\$1sp](https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-principalprofile-sp-transact-sql)。<pre>EXECUTE msdb.dbo.sysmail_add_principalprofile_sp<br /> @profile_name = 'SQL Alerts profile',<br /> @principal_name = 'public',<br /> @is_default = 1 ;</pre> | 数据库管理员 | 
| 创建账户。 | 输入以下 SQL 语句创建数据库邮件账户。替换以下值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.html)有关此存储过程及其参数的更多信息，请参阅 Microsoft 文档中的 [sysmail\$1add\$1account\$1sp](https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-account-sp-transact-sql)。<pre>EXECUTE msdb.dbo.sysmail_add_account_sp<br /> @account_name = 'SQL Alerts account',<br /> @description = 'Database Mail account for sending outgoing notifications.',<br /> @email_address = 'xyz@example.com',<br /> @display_name = 'xyz@example.com',<br /> @mailserver_name = 'test_smtp.example.com',<br /> @port = 25,<br /> @enable_ssl = 1,<br /> @username = 'SMTP-username',<br /> @password = 'SMTP-password';</pre> | 数据库管理员 | 
| 将账户添加到配置文件中。 | 输入以下 SQL 语句以将数据库邮件账户添加到数据库邮件配置文件中。替换以下值：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.html)有关此存储过程及其参数的更多信息，请参阅 Microsoft 文档中的 [sysmail\$1add\$1profileaccount\$1sp](https://learn.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sysmail-add-profileaccount-sp-transact-sql)。<pre>EXECUTE msdb.dbo.sysmail_add_profileaccount_sp<br /> @profile_name = 'SQL Alerts profile',<br /> @account_name = 'SQL Alerts account',<br /> @sequence_number = 1;</pre> | 数据库管理员 | 
| （可选）向 RDS 数据库实例添加多可用区。 | 如果要添加带数据库镜像 (DBM) 或始终开启可用性组 (AGs) 的多可用区，请参阅向 M [icrosoft SQL Server 数据库实例添加多](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_SQLServerMultiAZ.html#USER_SQLServerMultiAZ.Adding)可用区中的说明。 | 数据库管理员 | 

## 相关的资源
<a name="send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail-resources"></a>
+ [在 Amazon RDS for SQL Server 上使用数据库邮件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.DBMail.html)（Amazon RDS 文档）
+ [处理文件附件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/SQLServer.DBMail.html#SQLServer.DBMail.MAZ)（Amazon RDS 文档）
+ [排除与 SQL Server 数据库实例的连接故障](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ConnectToMicrosoftSQLServerInstance.html#USER_ConnectToMicrosoftSQLServerInstance.Troubleshooting)（Amazon RDS 文档）
+ [无法连接到 Amazon RDS 数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Troubleshooting.html#CHAP_Troubleshooting.Connecting)（Amazon RDS 文档）

# 在 IBM Db2 on AWS 上为 SAP 设置灾难恢复
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws"></a>

*Ambarish Satarkar 和 Debasis Sahoo，Amazon Web Services*

## Summary
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-summary"></a>

此模式概述了使用 IBM Db2 作为数据库平台并在 Amazon Web Services (AWS) 云上运行的 SAP 工作负载设置灾难恢复 (DR) 系统的步骤。目标是提供一种低成本解决方案，以在发生中断时提供业务连续性。

该图案使用 [pilot light 方法](https://aws.amazon.com/blogs/architecture/disaster-recovery-dr-architecture-on-aws-part-iii-pilot-light-and-warm-standby/)。通过在 AWS 上实施 pilot light 灾难恢复，您可以减少停机时间并保持业务连续性。Pilot light 方法侧重于在 AWS 中设置最小的灾难恢复环境，包括 SAP 系统和与生产环境同步的备用 Db2 数据库。

该解决方案具有可扩展性。您可以根据需要将其扩展至全面的灾难恢复环境。

## 先决条件和限制
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-prereqs"></a>

**先决条件**
+ 在亚马逊弹性计算云 (Amazon EC2) 实例上运行的 SAP 实例
+ IBM Db2 数据库
+ SAP Product Availability Matrix (PAM) 支持的操作系统
+ 生产数据库主机和备用数据库主机的物理数据库主机名不同
+ AWS 区域 中的 Amazon Simple Storage Service (Amazon S3) 存储桶，且已启用[跨区域复制 (CRR)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html)

**产品版本**
+ IBM Db2 数据库 11.5.7 或更高版本

## 架构
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-architecture"></a>

**目标技术堆栈**
+ 亚马逊 EC2
+ Amazon Simple Storage Service（Amazon S3）
+ Amazon 虚拟私有云（VPC 对等连接）
+ Amazon Route 53
+ IBM Db2 高可用性灾难恢复 (HADR)

**目标架构**

该架构以 Db2 作为数据库平台，为 SAP 工作负载实现了灾难恢复解决方案。生产数据库部署在 AWS 区域 1 中，备用数据库部署在第二个区域。备用数据库称为灾难恢复系统。Db2 数据库支持多个备用数据库（最多三个）。它使用 Db2 HADR 设置灾难恢复数据库并在生产数据库和备用数据库之间自动进行日志传送。

如果发生灾难导致区域 1 不可用，DR 区域中的备用数据库将接管生产数据库角色。SAP 应用程序服务器可以提前构建，也可以使用 [AWS Elastic Disaster Recovery](https://aws.amazon.com/disaster-recovery/) 或亚马逊机器映像（AMI）满足恢复时间目标（RTO）要求。此示例使用 AMI。

Db2 HADR 实现生产备用设置，其中生产充当主服务器，所有用户都连接到它。所有事务都写入日志文件，并使用 TCP/IP 将日志文件传输到备用服务器。备用服务器通过前滚传输的日志记录来更新其本地数据库，这有助于确保其与生产服务器保持同步。

使用 VPC 对等互连，以便生产区域和灾难恢复区域中的实例可以相互通信。Amazon Route 53 将最终用户路由至互联网应用程序。

![\[Db2 on AWS，支持跨区域复制\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/06edfa4c-0827-4d05-95cf-2d2651e74323/images/e77c1e4e-36f3-4af4-89d0-8eec72348f0a.png)


1. 在区域 1 为应用程序[创建 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html#creating-an-ami)，[复制 AMI](https://repost.aws/knowledge-center/copy-ami-region) 至区域 2。发生灾难时，使用 AMI 启动区域 2 服务器。

1. 在生产数据库 (在区域 1 )和备用数据库 (在区域 2) 之间设置 Db2 HADR 复制。

1. 发生灾难时，更改 EC2 实例类型以匹配生产实例。

1. 在区域 1 中，将 `LOGARCHMETH1` 设置为 `db2remote: S3 path`。

1. 在区域 2 中，将 `LOGARCHMETH1` 设置为 `db2remote: S3 path`。

1. 跨区域复制在S3存储桶之间执行。

## 工具
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-tools"></a>

**AWS 服务**
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/ec2/) 在 AWS 云中提供可扩展的计算容量。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [Amazon Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) 是一种可用性高、可扩展性强的 DNS Web 服务。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。
+ [Amazon Virtual Private Cloud (Amazon VPC)](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) 可帮助您将 AWS 资源启动到您定义的虚拟网络中。此虚拟网络类似于您在自己的数据中心内运行的传统网络，具有使用 AWS 可扩展基础设施的优势。此模式使用 [VPC 对等互连](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-peering.html)。

## 最佳实践
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-best-practices"></a>
+ 网络在决定 HADR 复制模式方面起着关键作用。对于跨 AWS 区域 的灾难恢复，我们建议您使用 Db2 HADR ASYNC 或 SUPERASYNC 模式。 
+ 有关 Db2 HADR 复制模式的更多信息，请参阅 [IBM 文档](https://ibm.github.io/db2-hadr-wiki/hadrSyncMode.html#Description_of_the_Modes)。
+ 您可以使用 AWS 管理控制台 或 AWS 命令行界面（AWS CLI）针对现有 SAP System [创建新的 AMI](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html#creating-an-ami)。然后，您可以使用 AMI 恢复现有 SAP 系统或者创建克隆。
+ [AWS Systems Manager Automation](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-automation.html) 可以帮助完成 EC2 实例和其他 AWS 资源的常见维护和部署任务。
+ AWS 提供多种本机服务，监控和管理 AWS 上的基础设施和应用程序。诸如 Amazon CloudWatch 和 AWS 之类的服务 CloudTrail 可以分别用于监控您的底层基础设施和 API 操作。有关更多详细信息，请参阅 [SAP on AWS – IBM Db2 HADR， 带 Pacemaker](https://docs.aws.amazon.com/sap/latest/sap-AnyDB/sap-ibm-pacemaker.html)。

## 操作说明
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-epics"></a>

### 准备环境
<a name="prepare-the-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 检查系统和日志。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | AWS 管理员、SAP Basis 管理员 | 

### 设置服务器和复制
<a name="set-up-the-servers-and-replication"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 SAP 和数据库服务器。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html)恢复完整备份后，默认设置前滚挂起状态。前滚挂起状态指示数据库正在恢复，并且可能需要应用一些更改。有关更多信息，请参阅 [IBM 文档](https://www.ibm.com/docs/en/db2/11.5?topic=commands-rollforward-database)。 | SAP Basis 管理员 | 
| 检查配置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | AWS 管理员、SAP Basis 管理员 | 
| 设置从生产数据库到灾难恢复数据库的复制（使用异步模式）。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | SAP Basis 管理员 | 

### 测试灾难恢复失效转移任务
<a name="test-dr-failover-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 规划灾难恢复测试生产业务停机时间。 | 确保在生产环境中计划所需业务停机时间，以测试灾难恢复失效转移场景。 | SAP Basis 管理员 | 
| 创建测试用户。 | 创建可在灾难恢复主机中进行验证的测试用户（或任何测试更改），以确认灾难恢复失效转移后的日志复制。 | SAP Basis 管理员 | 
| 在控制台上，停止生产 EC2 实例。 | 在此步骤中启动非正常关闭，以模拟灾难场景。 | AWS 系统管理员 | 
| 扩展 DR EC2 实例以满足要求。 | 在 EC2 控制台上，更改灾难恢复区域中的实例类型。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | SAP Basis 管理员 | 
| 发起接管。 | 在灾难恢复系统 (`host2`) 中，启动接管进程并启动灾难恢复数据库作为主数据库。<pre>db2 takeover hadr on database <SID> by force</pre>或者，您可设置以下参数，根据实例类型自动调整数据库内存分配。该 `INSTANCE_MEMORY` 值可以根据分配给 Db2 数据库的专用内存部分来决定。<pre>db2 update db cfg for <SID> using INSTANCE_MEMORY <FIXED VALUE> IMMEDIATE;<br />db2 get db cfg for <SID> | grep -i DATABASE_MEMORY AUTOMATIC IMMEDIATE; <br />db2 update db cfg for <SID> using self_tuning_mem ON IMMEDIATE;</pre>请使用以下命令验证更改。<pre>db2 get db cfg for <SID> | grep -i MEMORY<br />db2 get db cfg for <SID> | grep -i self_tuning_mem</pre> | SAP Basis 管理员 | 
| 在灾难恢复区域中启动适用于 SAP 的应用程序服务器。 | 使用您在生产系统中创建的 AMI，在灾难恢复区域中 [启动新的附加应用程序服务器](https://aws.amazon.com/premiumsupport/knowledge-center/launch-instance-custom-ami/)。 | SAP Basis 管理员 | 
| 在启动 SAP 应用程序前执行验证。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | AWS 管理员、SAP Basis 管理员 | 
| 在灾难恢复系统启动 SAP 应用程序。 | 使用 `<sid>adm` 用户在灾难恢复系统上启动 SAP 应用程序。使用以下代码，代码 `XX` 代表您的 SAP ABAP SAP 中央服务 (ASCS) 服务器的实例号，`YY` 代表您的 SAP 应用程序服务器的实例号。<pre>sapconrol -nr XX -function StartService <SID><br />sapconrol -nr XX -function StartSystem<br />sapconrol -nr YY -function StartService <SID><br />sapconrol -nr YY -function StartSystem</pre> | SAP Basis 管理员 | 
| 执行 SAP 验证。 | 这是作为灾难恢复测试执行的，以提供证据或检查灾难恢复区域的数据复制是否成功。 | 测试工程师 | 

### 执行灾难恢复失效自动恢复任务
<a name="perform-dr-failback-tasks"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启动生产 SAP 和数据库服务器。 | 在控制台上，启动在生产系统中托管 SAP 和数据库的 EC2 实例。 | SAP Basis 管理员 | 
| 启动生产数据库并设置 HADR。 | 登录至生产系统 (`host1`)，使用以下命令验证数据库是否处于恢复模式。<pre>db2start<br />db2 start HADR on db P3V as standby<br />db2 connect to <SID></pre>验证 HADR 状态是否为 `connected`。复制状态应为 `peer`。<pre>db2pd -d <SID> -hadr</pre>如果数据库并非不一致且未处于 `connected` 和 `peer` 状态，则可能需要进行备份和恢复，以使数据库 (开启 `host1`) 与当前活动的数据库 (在灾难恢复区域 `host2` 中) 同步。在这种情况下，请将数据库备份从 `host2` 灾难恢复区域的数据库还原到 `host1` 生产区域的数据库。 | SAP Basis 管理员 | 
| 将数据库故障恢复至生产区域。 | 在正常 business-as-usual情况下，此步骤是在计划停机时间内执行的。在灾难恢复系统上运行的应用程序将停止，数据库将故障恢复到生产区域 (区域 1)，以便从生产区域恢复操作。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | SAP Basis 管理员 | 
| 在启动 SAP 应用程序前执行验证。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | AWS 管理员、SAP Basis 管理员 | 
| 启动 SAP 应用程序。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | SAP Basis 管理员 | 

## 问题排查
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 用于解决 HADR 相关问题的密钥日志文件和命令 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.html) | 
| SAP 注意事项，用于对 Db2 UDB 上的 HADR 问题进行疑难解答 | 请参阅 SAP [Note 1154013- DB6：HADR 环境中的数据库问题。](https://service.sap.com/sap/support/notes/1154013)（您需要 SAP 门户凭证才能访问此笔记。） | 

## 相关资源
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-resources"></a>
+ [AWS 上 Db2 数据库灾难恢复方法](https://aws.amazon.com/blogs/architecture/disaster-recovery-approaches-for-db2-databases-on-aws/)（博客文章）
+ [SAP on AWS — 带有 Pacemaker 的 IBM Db2 HADR](https://docs.aws.amazon.com/sap/latest/sap-AnyDB/sap-ibm-pacemaker.html)
+ [在数据库之间 DB2 设置 HADR 复制的分步过程](https://www.ibm.com/support/pages/step-step-procedure-set-hadr-replication-between-db2-databases)
+ [Db2 HADR Wiki](https://ibm.github.io/db2-hadr-wiki/index.html)

## 附加信息
<a name="set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws-additional"></a>

使用这种模式，您可为在 Db2 数据库上运行的 SAP 系统设置灾难恢复系统。在灾难情况下，业务应能够继续执行您定义的恢复时间目标（RTO）和恢复点目标（RPO）要求：
+ **RTO** 是指服务中断和服务恢复之间可接受的最大延迟。这决定了当服务不可用时，什么时间段被视为可接受的时间窗口。
+ **RPO** 是指自上一个数据恢复点以来可接受的最长时间。这决定了从上一个恢复点到服务中断之间可接受的数据丢失情况。

有关 HADR 的 FAQs 相关信息，请参阅 [SAP 注释 \$11612105- DB6：Db2 高可用性灾难恢复 (HADR) 常见问题解答](https://launchpad.support.sap.com/#/notes/1612105)。(您需要 SAP 门户凭证才能访问此笔记。)

# 使用 Terraform 为数据库迁移设置 CI/CD 管道
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform"></a>

*Rahul Sharad Gaikwad 博士、Ashish Bhatt、Aniket Dekate、Ruchika Modi、Tamilselvan P、Nadeem Rahaman、Aarti Rajput 和 Naveen Suthar，Amazon Web Services*

## Summary
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-summary"></a>

此模式旨在建立持续集成和持续部署（CI/CD）管道，以可靠的自动化方式管理数据库迁移。它涵盖了使用 Terraform（基础设施即代码（IaC）工具）预调配所需基础设施、迁移数据及自定义架构变更的完整流程。

具体而言，该模式建立了一个 CI/CD 管道，用于将本地 Microsoft SQL Server 数据库迁移到亚马逊关系数据库服务 (Amazon RDS) AWS。您也可以使用此模式将部署在虚拟机或其他云环境中的 SQL Server 数据库迁移至 Amazon RDS。

此模式可解决数据库管理和部署过程中面临的以下挑战：
+ 手动部署数据库既耗时又容易出错，而且在不同环境间缺乏一致性。
+ 协调基础设施预调配、数据迁移和架构变更的过程既复杂又难以管理。
+ 对于生产系统而言，在数据库更新过程中确保数据完整性并最大限度地减少停机时间至关重要。

此模式具有以下优势：
+ 通过实施数据库迁移 CI/CD 管道，简化更新和部署数据库更改的过程。这样可降低出错风险，确保跨环境的一致性，并最大限度地减少停机时间。
+ 有助于提高可靠性、效率和协作性。缩短上市时间，减少数据库更新过程中的停机时间。
+ 帮助您采用现代数据库管理 DevOps 实践，从而提高软件交付流程的敏捷性、可靠性和效率。

## 先决条件和限制
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ 本地计算机上安装了 Terraform 0.12 或更高版本（有关说明，请参阅 [Terraform 文档](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)）
+ Terraform P AWS rovider 版本 3.0.0 或更高版本 HashiCorp （请参阅此提供程序的[GitHub 存储库](https://github.com/hashicorp/terraform-provider-aws)）
+ 最低权限 AWS Identity and Access Management (IAM) 策略（请参阅博客文章《[编写最低权限 IAM 策略的技巧](https://aws.amazon.com/blogs/security/techniques-for-writing-least-privilege-iam-policies/)》）

## 架构
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-architecture"></a>

此模式实现以下架构，该架构为数据库迁移过程提供了完整的基础设施。

![\[用于将本地 SQL Server 数据库迁移至 AWS 上的 Amazon RDS 的 CI/CD 管道架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/87845d9f-8e6e-4c51-b9ee-9e7833671d05/images/a1e95458-419a-4de9-85ef-b17d8340700a.png)


在此架构中：
+ 源数据库是部署在本地、虚拟机上或由其他云提供商托管的 SQL Server 数据库。该图假设源数据库位于本地数据中心。
+ 本地数据中心和 AWS 通过 VPN 或 AWS Direct Connect 连接进行连接。这提供了源数据库和 AWS 基础架构之间的安全通信。
+ 目标数据库是 Amazon RDS 数据库，它借助数据库配置管道托管在虚拟私 AWS 有云 (VPC) 内。
+ AWS Database Migration Service (AWS DMS) 将您的本地数据库复制到。 AWS它用于配置将源数据库复制到目标数据库的过程。

下图显示了使用不同级别的数据库迁移过程设置的基础架构，其中包括配置、 AWS DMS 设置和验证。

![\[从本地到 AWS 的迁移过程的 CI/CD 管道详细信息。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/87845d9f-8e6e-4c51-b9ee-9e7833671d05/images/3aca17e5-6fd7-4317-b578-ab5e485c6efb.png)


在此过程中：
+ 验证管道会验证所有检查。当所有必要的验证完成后，集成管道将进入下一步。
+ 数据库配置管道由各个 AWS CodeBuild 阶段组成，这些阶段对为数据库提供的 Terraform 代码执行 Terraform 操作。完成这些步骤后，将在目标 AWS 账户中部署资源。
+ 该 AWS DMS 管道由多个 CodeBuild 阶段组成，这些阶段执行测试，然后使用 IaC 配置用于执行迁移 AWS DMS 的基础架构。

## 工具
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-tools"></a>

**AWS 服务 和工具**
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html)是一项完全托管的持续集成服务，用于编译源代码、运行测试和生成 ready-to-deploy软件包。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 是一种完全托管式持续交付服务，可帮助您自动执行发布管道，以实现快速可靠的应用程序和基础设施更新。
+ [Amazon Relational Database Service（Amazon RDS）](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html)可帮助您在 AWS 云中设置、操作和扩展关系数据库。
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) 是一种对象存储服务，可提供出色的可扩展性、数据可用性、安全性和性能。
+ [AWS Database Migration Service (AWS DMS)](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 可帮助您将数据存储迁移到云和本地设置的组合中， AWS 云 或者迁移到云端和本地设置的组合之间。

**其他服务**
+ [Terraform](https://www.terraform.io/) 是一款 IaC 工具 HashiCorp ，可帮助您创建和管理云和本地资源。

**代码存储库**

此模式的代码可在[使用 Terraform 示例 GitHub 存储库的数据库迁移 DevOps 框架](https://github.com/aws-samples/aws-terraform-db-migration-framework-samples)中找到。

## 最佳实践
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-best-practices"></a>
+ 为数据库迁移实施自动化测试，以验证架构变更的正确性和数据完整性。这包括单元测试、集成测试和 end-to-end测试。
+ 为数据库实施强大的备份和还原策略，尤其是在迁移之前。这样可以确保数据完整性，并在发生故障时提供回退选项。
+ 实施强大的回滚策略，以便在迁移过程中出现故障或问题时恢复数据库更改。这可能包括回滚到先前的数据库状态或恢复单个迁移脚本。
+ 设置监控和日志记录机制，以跟踪数据库迁移的进度和状态。这有助于您快速识别并解决问题。

## 操作说明
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-epics"></a>

### 设置本地工作站
<a name="set-up-your-local-workstation"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在本地工作站上设置并配置 Git。 | 按照 [Git 文档](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)中的说明在本地工作站上安装并配置 Git。 | DevOps 工程师 | 
| 创建项目文件夹并添加 GitHub 存储库中的文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-ci-cd-pipeline-for-db-migration-with-terraform.html) | DevOps 工程师 | 

### 预调配目标架构
<a name="provision-the-target-architecture"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 更新所需参数。 | 该`ssm-parameters.sh`文件存储所有必需的 AWS Systems Manager 参数。您可以使用项目的自定义值来配置这些参数。在本地工作站的`setup/db-ssm-params`文件夹中，打开`ssm-parameters.sh`文件并设置这些参数，然后再运行 CI/CD 管道。 | DevOps 工程师 | 
| 初始化 Terraform 配置。 | 在 `db-cicd-integration` 文件夹中，输入以下命令，以初始化包含 Terraform 配置文件的工作目录。<pre>terraform init</pre> | DevOps 工程师 | 
| 预览 Terraform 计划。 | 要创建 Terraform 计划，请输入以下命令：<pre>terraform plan -var-file="terraform.sample"  </pre>Terraform 会评估配置文件，以确定已声明资源的目标状态。然后，其将比较目标状态与当前状态，并创建计划。 | DevOps 工程师 | 
| 验证计划。 | 查看计划，并确认它已在您的目标 AWS 账户中配置了所需架构。 | DevOps 工程师 | 
| 部署解决方案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-ci-cd-pipeline-for-db-migration-with-terraform.html) | DevOps 工程师 | 

### 验证部署
<a name="verify-the-deployment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证部署。 | 验证 `db-cicd-integration` 管道的状态，确认数据库迁移已完成。1. 登录 AWS 管理控制台，然后打开[AWS CodePipeline 控制台](https://console.aws.amazon.com/codesuite/codepipeline/home)。2. 在导航窗格中，选择**管道**。3. 选择 `db-cicd-integration` 管道。4. 验证是否已成功完成管道执行。 | DevOps 工程师 | 

### 使用后清理基础设施
<a name="clean-up-infrastructure-after-use"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 清理基础设施。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-ci-cd-pipeline-for-db-migration-with-terraform.html) | DevOps 工程师 | 

## 相关资源
<a name="set-up-ci-cd-pipeline-for-db-migration-with-terraform-resources"></a>

**AWS 文档**
+ [开始使用 Terraform 产品](https://docs.aws.amazon.com/servicecatalog/latest/adminguide/getstarted-Terraform.html)

**Terraform 文档**
+ [Terraform installation](https://learn.hashicorp.com/tutorials/terraform/install-cli)（Terraform 安装）
+ [Terraform 后端配置](https://developer.hashicorp.com/terraform/language/backend)
+ [Terraform AWS 提供者文档](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)

# EC2 使用 FSx 适用于 Windows 文件服务器的亚马逊上设置微软 SQL Server 故障转移群集
<a name="microsoft-sql-failover-cluster-on-amazon-ec2"></a>

*Sweta Krishna 和 Ramesh Babu Donti，Amazon Web Services*

## Summary
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-summary"></a>

带失效转移集群实例（FCI）的 Microsoft SQL Server Standard 版可以成为 SQL Server Enterprise 的更具成本效益的替代方案。设置 SQL FCI 需要在节点之间共享文件存储，而 [Amazon FSx for Windows File Server](https://aws.amazon.com/fsx/windows/) 提供了完全托管的存储，可在可用区之间自动同步复制。Amazon 通过为通用文件共享使用内置的重复数据删除功能来 FSx 降低存储成本，从而无需维护第三方解决方案。Amazon FSx 还支持以下内容：
+ 只需要按实际使用情况付费，没有最低费用，也无需预付费。
+ 手动设置 FCI FSx 作为您的共享存储。
+  FSx 用作您的 SQL 集群的文件共享见证人。
+ Amazon FSx for Windows File Server 支持服务器消息块 (SMB) 3.0 以实现持续可用的文件共享，因此适合 SQL Server FCI 部署。

## 先决条件和限制
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-prereqs"></a>

**先决条件**
+ 活跃[AWS 账户](https://aws.amazon.com/account/)。
+ 创建和管理亚马逊虚拟私有云 (Amazon VPC) 资源、亚马逊弹性计算云 (Amazon EC2) 实例、安全组和 AWS Identity and Access Management (IAM) 角色的权限。
+ AWS Managed Microsoft AD 或者你自己的本地活动目录。
+ 具有设置失效转移集群[所需权限](https://learn.microsoft.com/en-us/windows-server/failover-clustering/configure-failover-cluster-accounts)的 Active Directory 域用户。
+ 针对 SQL Server FCI 和 [Microsoft Active Directory 端口](https://docs.aws.amazon.com/whitepapers/latest/access-workspaces-with-access-cards/ip-address-and-port-requirements.html)的安全组规则，旨在实现安全的混合连接。
+ 在 Active Directory 中为 SQL Server 配置了具有跨 SQL 节点适当权限的[服务账户](https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/configure-windows-service-accounts-and-permissions?view=sql-server-ver16#sql-server-failover-cluster-instance)。
+ Amazon FSx for Windows 文件服务器位于故障转移群集中。
+ SQL Server 安装二进制文件。

**限制**
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

**产品版本**
+  EC2 适用于 Windows Server 2012 R2 或更高版本的亚马逊
+  FSx 适用于Windows的亚马逊文件服务器，所有当前的Windows服务器版本
+  FSx 适用于 NetApp ONTAP 的 Amazon 作为共享存储的替代方案
+ SQL Server 2012/2016/2019/2022

## 架构
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-architecture"></a>

**技术堆栈**
+ Amazon EC2
+  FSx 适用于 Windows 文件服务器的亚马逊
+ Amazon VPC
+ AWS Directory Service
+ AWS Systems Manager
+ IAM

**目标架构**

下图显示了微软 SQL Server FCI 在亚马逊上 EC2 使用适用于 Windows 的文件服务器的亚马逊 SQL Server FCI FSx 的高级架构。

![\[亚马逊上 EC2 使用亚马 FSx 逊 Windows 文件服务器的 Microsoft Server FCI 架构图。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/208bf64a-8fef-4019-944a-723372450885/images/ba0c9169-9536-41c3-ae8e-7264dcc3e1ad.png)


**网络基础架构**
+ Amazon VPC 提供了跨三个可用区的网络容器。
+ 私有子网在每个可用区中提供隔离的子网，用于部署资源。

**计算层**
+ 亚马逊 EC2 包含一个 SQL Server 群集节点 1，作为 Windows 服务器故障转移群集 (WSFC) 的一部分部署在可用区 1 中。
+ 亚马逊 EC2 包含一个 SQL Server 集群节点 2，作为 WSFC 的一部分部署在可用区 2 中。
+ WSFC 集群连接两个 SQL Server 节点以实现失效转移功能。

**适用于 Windows 文件服务器 FSx 的亚马逊存储层**

**多可用区 FSx 部署（跨可用区 1 和 2）**
+ 可用区 1 中的主 FSx 文件系统托管活动的 SQL Server 数据和日志文件。
+ 可用区 2 中的辅助 FSx 文件系统提供自动故障转移功能。
+ 共享的 SMB 文件共享（\$1\$1fsx.domain\$1sqlshare），SQL Server 数据库的两个集群节点都可以访问。

**单可用区 FSx 部署（中 AZ3）**
+ 可用区 3 中的 Amazon FSx 文件服务器见证人充当集群法定人数见证人。
+ 文件共享见证（`\\fsx.domain\witness`）维护集群仲裁并防止出现脑裂的情况。

**目录服务**
+ AWS Managed Microsoft AD 提供群集功能所需的 Windows 身份验证和域服务。

**高可用性功能**
+ 多可用区组件提供跨可用区的容错能力。
+ FSx 如果主服务器出现故障，备用文件服务器可自动进行故障转移。
+ 文件共享见证在可用区 3 中提供集群仲裁管理，以帮助确保集群在发生故障期间正常运行。
+ 与域集成，可实现无缝 AWS Managed Microsoft AD 的 Windows 身份验证。

## 工具
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-tools"></a>

**AWS 服务**
+ [亚马逊弹性计算云 (Amazon EC2)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts.html) 在中提供可扩展的计算容量 AWS 云。您可以根据需要启动任意数量的虚拟服务器，并快速纵向扩展或缩减这些服务器。
+ [Amazon FSx](https://docs.aws.amazon.com/fsx/?id=docs_gateway) 提供的文件系统支持行业标准的连接协议，并提供高可用性和跨 AWS 区域复制功能。
+ [Amazon Virtual Private Cloud（亚马逊 VPC）](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)可帮助您将 AWS 资源启动到您定义的虚拟网络中。该虚拟网络类似于您在数据中心中运行的传统网络，并具有使用 AWS的可扩展基础设施的优势。
+ [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)允许你的目录感知工作负载和 AWS 资源使用中的 Microsoft Active Directory。 AWS 云
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 通过控制谁经过身份验证并有权使用 AWS 资源，从而帮助您安全地管理对资源的访问权限。
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) 可帮助您管理在 AWS 云端运行的应用程序和基础设施。它简化了应用程序和资源管理，缩短了检测和解决操作问题的时间，并帮助您大规模安全地管理 AWS 资源。

## 最佳实践
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-best-practices"></a>
+ 将数据库实例放在私有子网中，以保护它们不被从 Internet 公开访问，同时仍允许它们连接到 AWS 服务 并执行更新。
+ 有关一般最佳实践，请参阅在[亚马逊上部署 Microsoft SQL Server 的最佳实](https://docs.aws.amazon.com/prescriptive-guidance/latest/sql-server-ec2-best-practices/welcome.html)践 EC2。
+  PowerShell 要使用管理您的 Amazon FSx for Windows 文件服务器，[ FSx 请参阅管理 Windows 文件系统](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/administering-file-systems.html)。

## 操作说明
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-epics"></a>

### 为 SQL Server 创建和配置亚马逊 EC2 节点
<a name="create-and-configure-ec2-nodes-for-sql-server"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 添加名称和标签。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 选择 Windows AMI。 | 选择适用于 Windows 且符合您的 SQL Server 要求的亚马逊机器映像（AMI）。 | 数据库管理员 | 
| 选择一个实例类型。 | 选择符合您要求的 Amazon EC2 实例类型。 | 数据库管理员 | 
| 使用密钥对。 | 您可以使用密钥对安全地连接到实例。在启动实例之前，请确保您可以访问所选的密钥对。 | 数据库管理员 | 
| 配置网络设置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 配置高级网络设置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 配置存储。 | 配置所需的总存储空间并选择所需的存储类型。 | 数据库管理员 | 
| 配置高级详细信息并启动实例。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 创建节点 2。 | 重复这些步骤以创建和配置节点 2。 | 数据库管理员 | 

### 在节点 1 及 2 上安装和配置 Windows Server 失效转移集群
<a name="install-and-configure-windows-server-failover-cluster-on-nodes-1-and-2"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 登录到节点 1。 | 以管理员身份登录 Windows Amazon EC2 实例。 | 数据库管理员 | 
| 在节点 1 上安装 FCI 功能。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html)<pre>Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools</pre>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 登录到节点 2。 | 以管理员身份登录 Windows Amazon EC2 实例。 | 数据库管理员 | 
| 在节点 2 上安装 FCI 功能。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html)<pre>Install-WindowsFeature -Name Failover-Clustering -IncludeManagementTools</pre>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 向集群添加节点。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 让集群上线。 | 要让集群上线，请更新两个节点的静态 IP 地址：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 验证集群。 | 导航到**失效转移集群管理器**并验证集群核心资源是否处于在线状态。 | 数据库管理员 | 

### 在节点 1 和 2 上安装 SQL Server
<a name="install-sql-server-on-nodes-1-and-2"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 登录至服务器。 | 以管理员身份登录 Amazon EC2 实例。 | 数据库管理员 | 
| 装载 SQL 二进制文件。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) |  | 
| 将节点 2 添加到失效转移集群。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 

### 配置 Amazon FSx 文件共享见证
<a name="configure-the-fsx-file-share-witness"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置仲裁设置。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/microsoft-sql-failover-cluster-on-amazon-ec2.html) | 数据库管理员 | 
| 检索 DNS 详细信息。 | 在 Amazon FSx 控制台中，选择**托管 AD**，然后选择 “**附加**”。DNS 应采用以下格式：`\\example.example.net\share` | 数据库管理员 | 
| 配置文件共享见证。 | 选择 **Amazon FSx 文件共享路径**，然后选择 “**完成**”。 | 数据库管理员 | 

## 相关的资源
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-resources"></a>

**AWS resources**
+ [亚马逊 Window FSx s 文件服务器](https://www.youtube.com/watch?v=IMDWTIShlyI)（视频）
+ [深入了解亚马逊 Window FSx s 文件服务器版](https://www.youtube.com/watch?v=_x_Geur93oc)（视频）
+ [如何在 Windows 服务器上部署带亚马逊 EBS 多重连接的 SQL Server 故障转移群集](https://aws.amazon.com/blogs/modernizing-with-aws/how-to-deploy-a-sql-server-failover-cluster-with-amazon-ebs-multi-attach-on-windows-server/)（AWS 博客文章）
+ [使用 FSx 适用于 Windows 的亚马逊文件服务器简化微软 SQL Server 高可用性部署](https://aws.amazon.com/blogs/storage/simplify-your-microsoft-sql-server-high-availability-deployments-using-amazon-fsx-for-windows-file-server/)（AWS 博客文章）
+ [使用亚马逊 FSx 适用于 NetApp ONTAP 的 SQL Server 高可用性部署](https://aws.amazon.com/blogs/modernizing-with-aws/sql-server-high-availability-amazon-fsx-for-netapp-ontap/)（AWS 博客文章）
+ [ FSx 用于搭载微软 SQL Server 的 Windows 文件服务器](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/sql-server.html)
+ [什么 FSx 适用于 Windows 文件服务器？](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html)

**其他资源**
+ [创建失效转移集群](https://learn.microsoft.com/en-us/windows-server/failover-clustering/create-failover-cluster?pivots=windows-admin-center)

## 附加信息
<a name="microsoft-sql-failover-cluster-on-amazon-ec2-additional"></a>

**配置文件共享见证**

通过在 Amazon FSx 安全组中添加允许入站连接的规则，确保您已从两个节点连接到文件系统。应允许 SMB 端口。在本示例中，如果 DNS 名称为 `\\example.example.com\share`，则使用 `\\example.example.com\share`。在 Always On 可用性集群中对文件共享见证使用相同的值。按照以下步骤配置文件共享见证：

1. 使用 RDP 连接到您的 Amazon EC2 实例。

1. 导航到**失效转移集群管理器**。

1. 打开上下文（右键单击）菜单，然后选择**更多操作**。

1. 选择**配置集群仲裁设置**。

1. 选择**下一步**。

1. 选择**仲裁配置**并配置文件共享见证。

1. 提供 DNS 名称。

1. 查看摘要，然后选择**完成**。文件共享见证应在**集群核心**资源部分显示为联机状态。

# 在 Amazon RDS Custom 上为 Oracle 电子商务套件设置 HA/DR 架构，并使用活动备用数据库
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database"></a>

*Amazon Web Services 的 Simon Cunningham、Jaydeep Nandy 和 Nitin Saxena*

## Summary
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-summary"></a>

此模式描述了如何在 Amazon Relational Database Service (Amazon RDS) 定制上架构 Oracle 电子商务解决方案，以实现高可用性 (HA) 和灾难恢复 (DR)，方法是在另一个 Amazon Web Services 可用区中设置 Amazon RDS Custom 只读副本数据库,并将其转换为活动备用数据库。Amazon RDS Custom 只读副本的创建，是通过 AWS 管理控制台完全自动化的。

这种模式不讨论添加其他应用程序层和共享文件系统的步骤，这些层和共享文件系统也可以是 HA/DR 架构的一部分。有关这些主题的更多信息，请参阅以下 Oracle Support 注意事项：1375769.1、1375670.1 和 1383621.1（第 5 节，*高级克隆选项*）。（访问需要有 [Oracle Support](https://support.oracle.com/portal/) 账户。）

要将电子商务套件系统迁移到 Amazon Web Services (AWS) 上的单层单可用区架构，请参阅 [将 Oracle 电子商务套件迁移到 Amazon RDS Custom](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-oracle-e-business-suite-to-amazon-rds-custom.html) 的说明。

Oracle 电子商务套件是一种企业资源规划（ERP）解决方案，用于自动化企业范围内的流程，例如财务、人力资源、供应链和制造。它具有三层架构：客户端、应用程序和数据库。以前，您必须在自行管理的亚马逊[弹性计算云 (Amazon EC2) 实例上运行电子商务套件数据库，但现在您可以从 Amaz](https://aws.amazon.com/ec2/) on [RDS](https://aws.amazon.com/rds/custom/) 定制版中受益。 

## 先决条件和限制
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-prereqs"></a>

**先决条件**
+ Amazon RDS Custom 上安装的现有电子商务套件；参见模式[将 Oracle 电子商务套件迁移至 Amazon RDS Custom](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-oracle-e-business-suite-to-amazon-rds-custom.html)
+ 如果您想将只读副本更改为只读副本并使用它来卸载向备用副本的报告，请获得 [Oracle Active Data Guard 数据库许可证](https://www.oracle.com/corporate/pricing/)（请参阅 *Oracle Technology 商业价目表*）

**限制**
+ [Amazon RDS Custom 上的 Oracle 数据库](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limits)的限制和不支持的配置自定义
+ [适用于 Oracle 的 Amazon RDS Custom 只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-rr.html#custom-rr.limitations)的相关限制

**产品版本**

有关 Amazon RDS Custom 支持的 Oracle Database 版本和实例类型，请参阅 [Amazon RDS Custom for Oracle 的要求和限制](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/UserGuide/custom-reqs-limits.html)

## 架构
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-architecture"></a>

下图说明了 AWS 上电子商务套件的代表性架构，该架构在 active/passive 设置中包括多个可用区和应用程序层。该数据库使用 Amazon RDS Custom 数据库实例和 Amazon RDS Custom 只读副本。只读副本使用 Active Data Guard 复制到另一可用区。您还可以使用只读副本卸载主数据库上的读取流量并用于报告目的。

![\[AWS 上 Oracle E-Business Suite 的多可用区架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a17947e8-56b1-4d92-91df-096c02ff4c19/images/ffdaa2d4-123b-44a0-8d52-b1352a4eee44.png)


有关更多信息，请参阅 Amazon RDS 文档中的[使用适用于 Oracle 的 Amazon RDS Custom 只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-rr.html)。 

默认情况下，Amazon RDS Custom 只读副本是在安装时创建的。但是，如果您想将一些只读工作负载卸到备用数据库以减轻主数据库的负载，则可以按照[操作说明](#set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-epics)部分中的步骤手动将已装载副本的模式更改为只读。典型的用例是从备用数据库运行报告。更改为只读，需要活动备用数据库许可证。 

当您在 AWS 创建只读副本时，系统会秘密使用 Oracle Data Guard 代理。 此配置是在最大性能模式下自动生成和设置的，如下所示：

```
DGMGRL> show configuration
Configuration - rds_dg
  Protection Mode: MaxPerformance
  Members:
  vis_a - Primary database
    vis_b - Physical standby database 
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS   (status updated 58 seconds ago)
```

## 工具
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-tools"></a>

**Amazon Web Services**
+ [适用于 Oracle 的 Amazon RDS Custom](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/working-with-custom-oracle.html) 是一项托管式数据库服务，适用于需要访问底层操作系统和数据库环境的旧版、自定义和打包应用程序。它可以自动执行数据库管理任务和操作，并使您能够作为数据库管理员访问和自定义数据库环境和操作系统。 

**其他工具**
+ Oracle Data Guard 是一款可帮助您创建和管理 Oracle 备用数据库的工具。此模式采用 Oracle Data Guard 在 Amazon RDS Custom 上设置活动备用数据库。

## 操作说明
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-epics"></a>

### 创建只读副本
<a name="create-a-read-replica"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 Amazon RDS Custom 数据库实例的只读副本。 | 要创建只读副本，请按 [Amazon RDS 文档](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_ReadRepl.html#USER_ReadRepl.Create)中的说明进行操作，并使用您创建的 Amazon RDS Custom 数据库实例（请参阅[先决条件](#set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-prereqs)部分）作为源数据库。默认情况下，Amazon RDS Custom 只读副本创建为物理备用副本，并处于已装载状态。这样做是为了确保遵守 Oracle Active Data Guard 许可。请按以下步骤将只读副本转换为只读模式。 | 数据库管理员 | 

### 将只读副本更改为只读活动备用数据库
<a name="change-the-read-replica-to-a-read-only-active-standby"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 连接到 Amazon RDS Custom 只读副本。 | 使用以下命令将物理备用数据库转换为活动备用数据库。 这些命令需要 Oracle 活动备用许可证。要获得许可证，请联系 Oracle 代表。<pre>$ sudo su - rdsdb<br />-bash-4.2$ sql<br />SQL> select process,status,sequence# from v$managed_standby;<br /><br />PROCESS    STATUS        SEQUENCE#<br />--------- ------------ ----------<br />ARCH       CLOSING            3956<br />ARCH       CONNECTED             0<br />ARCH       CLOSING            3955<br />ARCH       CLOSING            3957<br />RFS        IDLE                  0<br />RFS        IDLE               3958<br />MRP0       APPLYING_LOG       3958<br />SQL> select name, database_role, open_mode from v$database;<br /><br />NAME       DATABASE_ROLE    OPEN_MODE<br />--------- ---------------- --------------------<br />VIS        PHYSICAL STANDBY MOUNTED<br />SQL> alter database recover managed standby database cancel;<br />Database altered.<br />Open the standby database<br />SQL> alter database open;<br />Database altered.<br />SQL> select name, database_role, open_mode from v$database;<br /><br />NAME       DATABASE_ROLE    OPEN_MODE<br />--------- ---------------- --------------------<br />VIS        PHYSICAL STANDBY READ ONLY</pre> | 数据库管理员 | 
| 使用实时日志应用启动介质恢复。 | 要启用实时日志应用功能，请使用以下命令。它们将备用数据库（只读副本）转换为活动备用数据库并进行验证，因此您可连接和运行只读查询。<pre>SQL>   alter database recover managed standby database using current logfile disconnect from session;<br />Database altered</pre> | 数据库管理员 | 
| 检查数据库状态。 | 要查看数据库的状态，请使用以下命令。<pre>SQL> select name, database_role, open_mode from v$database;<br />NAME      DATABASE_ROLE    OPEN_MODE<br />--------- ---------------- --------------------<br />VIS       PHYSICAL STANDBY READ ONLY WITH APPLY</pre> | 数据库管理员 | 
| 检查重做应用模式。 | 若要查看重做应用模式，请使用以下命令。<pre>SQL> select process,status,sequence# from v$managed_standby;<br />PROCESS    STATUS        SEQUENCE#<br />--------- ------------ ----------<br />ARCH       CLOSING            3956<br />ARCH       CONNECTED             0<br />ARCH       CLOSING            3955<br />ARCH       CLOSING            3957<br />RFS        IDLE                  0<br />RFS        IDLE               3958<br />MRP0       APPLYING_LOG       3958<br /> <br />SQL> select open_mode from v$database;<br />OPEN_MODE<br />--------------------<br />READ ONLY WITH APPLY</pre> | 数据库管理员 | 

## 相关的资源
<a name="set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database-resources"></a>
+ [将 Oracle 电子商务套件迁移到 Amazon RDS Custom](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-oracle-e-business-suite-to-amazon-rds-custom.html) (AWS Prescriptive Guidance)
+ [使用 Amazon RDS Custom](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-custom.html)（Amazon RDS 文档）
+ [使用 Amazon RDS Custom for Oracle 只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-rr.html)（Amazon RDS 文档）
+ [Amazon RDS Custom for Oracle：数据库环境中的新控制功能 ](https://aws.amazon.com/blogs/aws/amazon-rds-custom-for-oracle-new-control-capabilities-in-database-environment/)（AWS 新闻博客）
+ [在 AWS 上迁移 Oracle 电子商务套件](https://d1.awsstatic.com/whitepapers/migrate-oracle-e-business-suite.pdf)（AWS 白皮书）
+ [AWS 上的 Oracle 电子商务套件架构](https://docs.aws.amazon.com/whitepapers/latest/overview-oracle-e-business-suite/oracle-e-business-suite-architecture-on-aws.html)（AWS 白皮书）

# 将数据从 IBM Db2、SAP、Sybase 和其他数据库流式传输到 MongoDB Atlas AWS
<a name="stream-data-from-ibm-db2-to-mongodb-atlas"></a>

*Battulga Purevragchaa 和 Igor Alekseev，Amazon Web Services*

*Babu Srinivasan，MongoDB*

## Summary
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-summary"></a>

此模式介绍了将数据从 IBM Db2 及其他数据库（例如大型机数据库、Sybase）迁移至 AWS 云上的 MongoDB Atlas 的具体步骤。它使用 [AWS Glue](https://aws.amazon.com/glue/) 来帮助加速向 MongoDB Atlas 的数据迁移进程。

该模式与规范性指导网站上的《[迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/)》 AWS 指南一起出现。其中提供了适用于该指南中讨论的其中一个迁移场景的实施步骤。有关其他迁移方案，请参阅 AWS 规范性指导网站上的以下模式：
+ [将自托管 MongoDB 环境迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-a-self-hosted-mongodb-environment-to-mongodb-atlas-on-the-aws-cloud.html)
+ [将关系数据库迁移到 MongoDB Atlas AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/migrate-relational-database-to-mongodb-atlas.html)

该模式适用于 Manage [AWS d Services 合作伙伴](https://aws.amazon.com/managed-services/partners/)和 AWS 用户。

## 先决条件和限制
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-prereqs"></a>

**先决条件**
+ 要迁移至 MongoDB Atlas 的源数据库，例如 SAP、Sybase、IBM Db2 等。
+ 熟悉 SAP、Sybase、IBM Db2、MongoDB Atlas 等数据库。 AWS 服务

**产品版本**
+ MongoDB 版本 5.0 或更高版本。

## 架构
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-architecture"></a>

下图说明了使用 AWS Glue Studio Amazon Kinesis Data Streams 和 MongoDB Atlas 进行批量数据加载和数据流式传输。

此参考架构用于创建 AWS Glue Studio 提取、转换和加载 (ETL) 管道，以将数据迁移到 MongoDB Atlas。 AWS Glue 爬网程序 与 MongoDB Atlas 集成，以促进数据治理。数据可以批量迁移，也可以使用 Amazon Kinesis Data Streams 流式传输到 MongoDB Atlas。

**批量数据加载**

![\[在批处理模式下将数据迁移到 MongoDB Atlas。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/805a376f-35f4-44cc-b4b0-8bf4d95c1e5d/images/68d87202-95ba-4e2a-9b3b-27dd6db6165e.png)


有关批量数据迁移的更多信息，请参阅 AWS 博客文章使用 M [ongoDB Atlas 编写 ETL 作业](https://aws.amazon.com/blogs/big-data/compose-your-etl-jobs-for-mongodb-atlas-with-aws-glue/)。 AWS Glue

**数据流**

![\[在数据流式传输模式下将数据迁移到 MongoDB Atlas。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/805a376f-35f4-44cc-b4b0-8bf4d95c1e5d/images/b007a116-f463-418f-9721-647d80177e3b.png)


有关支持不同使用场景的 MongoDB Atlas 参考架构，请参阅规范性指南网站上的[迁移到 MongoDB](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/architecture.html) Atlas。 AWS AWS 

## 工具
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-tools"></a>

●      [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) 是一项完全托管的 ETL 服务。它可以帮助您在数据存储和数据流之间对数据进行可靠地分类、清理、扩充和移动。

●      [Amazon Kinesis Data Streams](https://aws.amazon.com/kinesis/data-streams/) 可帮助您实时收集和处理大型数据记录流。

●      [MongoDB Atlas](https://www.mongodb.com/atlas) 是一种完全托管式数据库即服务（DbaaS），用于在云中部署和管理 MongoDB 数据库。

## 最佳实践
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-best-practices"></a>

有关指南，请参阅 MongoDB 存储[库中的 MongoDB 最佳实践指南](https://github.com/mongodb-partners/mongodb_atlas_as_aws_bedrock_knowledge_base/blob/main/data/MongoDB_Best_Practices_Guide.pdf)。 GitHub 

## 操作说明
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-epics"></a>

### 发现与评测
<a name="discovery-and-assessment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 确定集群大小。 | 使用 `db.stats()` 中关于总索引空间的信息来估计工作集大小。假设您的数据空间中有一定比例会被频繁访问。或者，您可以根据自己的假设来估计内存需求。此任务大约需要一周时间。有关此故事以及此操作说明中其他故事的详细信息和示例，请参阅[相关资源](#stream-data-from-ibm-db2-to-mongodb-atlas-resources)部分中的链接。 | MongoDB 数据库管理员，应用程序架构师 | 
| 估计网络带宽要求。 | 要估计网络带宽要求，请将平均文档大小乘以每秒提供的文档数量。考虑集群中任何节点将承受的最大流量作为基础。要计算从集群到客户端应用程序的下游数据传输速率，请使用一段时间内返回的文档总数的总和。如果您的应用程序从辅助节点读取数据，请将文档总数除以可以提供读取操作的节点数。要查找数据库的平均文档大小，请使用 `db.stats().avgObjSize` 命令。此任务通常需要一天的时间。 | MongoDB 数据库管理员 | 
| 选择 Atlas 层。 | 按照 [MongoDB 文档](https://www.mongodb.com/docs/atlas/manage-clusters/)中的说明选择正确的 Atlas 集群层。  | MongoDB 数据库管理员 | 
| 制定割接计划。 | 制定应用程序割接计划。 | MongoDB 数据库管理员，应用程序架构师 | 

### 在 AWS 上设置新的 MongoDB Atlas 环境
<a name="set-up-a-new-mongodb-atlas-environment-on-aws"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在上创建新的 MongoDB Atlas 集群。 AWS | 在 MongoDB Atlas 中，**选择构建**集群，然后 AWS 选择作为云提供商。 | MongoDB 数据库管理员 | 
| 选择 AWS 区域 和全局群集配置。 | 从适用于您的 Atlas 集群 AWS 区域 的列表中进行选择。如果需要，请配置全局集群。 | MongoDB 数据库管理员 | 
| 选择集群层。 | 选择您的首选集群层。您的层选择决定了内存、存储和 IOPS 规格等因素。 | MongoDB 数据库管理员 | 
| 配置其他集群设置。 | 配置其他集群设置，例如 MongoDB 版本、备份和加密选项。有关这些选项的更多信息，请参阅[相关资源](#stream-data-from-ibm-db2-to-mongodb-atlas-resources)部分。 | MongoDB 数据库管理员 | 

### 配置安全性和合规性
<a name="configure-security-and-compliance"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置访问列表。 | 要连接到 Atlas 集群，您必须在[项目的访问列表](https://www.mongodb.com/docs/atlas/setup-cluster-security/#configure-security-features-for-clusters)中添加一个条目。Atlas 使用传输层安全性协议（TLS）/安全套接字层 (SSL) 来加密数据库与虚拟私有云（VPC）的连接。若要设置项目的访问列表以及有关此操作说明中的故事的详细信息，请参阅[相关资源](#stream-data-from-ibm-db2-to-mongodb-atlas-resources)部分中的链接。  | MongoDB 数据库管理员 | 
| 对用户进行身份验证和授权。 | 您必须创建并验证将访问 MongoDB Atlas 集群的数据库用户。要访问项目中的集群，用户必须属于该项目，并且他们可以属于多个项目。 您也可以使用 AWS Identity and Access Management (IAM) 启用授权。有关更多信息，请参阅 MongoDB 文档中的[使用 IAM 设置身份验证](https://www.mongodb.com/docs/atlas/security/aws-iam-authentication/#set-up-authentication-with-aws-iam)。 | MongoDB 数据库管理员 | 
| 创建自定义角色。 | （可选）Atlas 支持在内置的 Atlas 数据库用户权限未涵盖所需权限集的情况下创建[自定义角色](https://www.mongodb.com/docs/atlas/reference/custom-role-actions/)。 | MongoDB 数据库管理员 | 
| 设置 VPC 对等连接。 | （可选）Atlas 支持与其他 AWS 的 [ VPCsVPC 对](https://www.mongodb.com/docs/atlas/security-vpc-peering/#set-up-a-network-peering-connection)等。 | MongoDB 数据库管理员 | 
| 设置 AWS PrivateLink 终端节点。 | （可选）您可以使用在上 AWS 设置私有终端节点[AWS PrivateLink](https://www.mongodb.com/docs/atlas/security-private-endpoint/)。 | MongoDB 数据库管理员 | 
| 启用双因素身份验证。 | （可选）Atlas 支持双因素身份验证 (2FA)，以帮助用户控制对其 Atlas 账户的访问。 | MongoDB 数据库管理员 | 
| 使用 LDAP 设置用户身份验证和授权。 | （可选）Atlas支持使用轻量级目录访问协议 (LDAP) 执行用户身份验证和授权。 | MongoDB 数据库管理员 | 
| 设置统一 AWS 接入。 | （可选）某些 Atlas 功能（包括 Atlas 数据湖和使用客户密钥管理的静态加密）使用 IAM 角色进行身份验证。 | MongoDB 数据库管理员 | 
| 使用设置静态加密 AWS KMS。 | （可选）Atlas 支持使用 AWS Key Management Service (AWS KMS) 加密存储引擎和云提供商备份。 | MongoDB 数据库管理员 | 
| 设置 CSFLE。 | （可选）Atlas 支持[客户端字段级加密（CSFLE）](https://www.mongodb.com/docs/upcoming/core/csfle/#client-side-field-level-encryption)，包括字段的自动加密。  | MongoDB 数据库管理员 | 

### 迁移数据
<a name="migrate-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 MongoDB Atlas 中启动目标副本集。 | 在 MongoDB Atlas 中启动目标副本集。在 Atlas Live Migration Service 中，选择**我已准备好迁移**。 | MongoDB 数据库管理员 | 
|  AWS Glue 与 MongoDB Atlas 建立连接。 | 使用连接 AWS Glue MongoDB Atlas（目标数据库）。 AWS Glue 爬网程序 此步骤有助于为迁移准备目标环境。有关详情，请参阅 [AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/console-connections.html)。 | MongoDB 数据库管理员 | 
|  AWS Glue 与源数据库或源流建立连接。 | 此步骤有助于为迁移准备目标环境。 | MongoDB 数据库管理员 | 
| 设置数据转换。 | 配置转换逻辑，将数据从传统的结构化架构迁移到 MongoDB 的灵活架构。 | MongoDB 数据库管理员 | 
| 迁移数据。 | 计划 AWS Glue Studio中的迁移。 | MongoDB 数据库管理员 | 

### 配置操作集成
<a name="configure-operational-integration"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 连接到集群。 | 连接到 MongoDB Atlas 集群。 | 应用程序开发人员 | 
| 与数据交互。 | 与集群数据交互。 | 应用程序开发人员 | 
| 监控集群。 | 监控您的 MongoDB Atlas 集群。 | MongoDB 数据库管理员 | 
| 备份和还原数据。 | 备份和恢复集群数据。 | MongoDB 数据库管理员 | 

## 问题排查
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 如果您遇到问题 | 参见 Mongo CloudFormation DB Atlas 资源库中的[疑难解答](https://github.com/mongodb/mongodbatlas-cloudformation-resources/tree/master#troubleshooting)。 | 

## 相关资源
<a name="stream-data-from-ibm-db2-to-mongodb-atlas-resources"></a>

除非另有说明，否则以下所有链接均指向 MongoDB 文档中的网页。

**迁移指南**
+ [在（规范性指南）上迁移到 MongoDB Atla AWS s](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-mongodb-atlas/)AWS 

**发现与评测**
+ [内存](https://docs.atlas.mongodb.com/sizing-tier-selection/#memory)
+ [使用 Atlas 示例数据集进行大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--the-service-sample-data-sets)
+ [移动应用程序的大小调整示例](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#example--mobile-app)
+ [网络流量](https://docs.atlas.mongodb.com/sizing-tier-selection/#network-traffic)
+ [集群自动扩缩](https://www.mongodb.com/docs/atlas/sizing-tier-selection/#cluster-auto-scaling)
+ [Atlas 大小调整模板](https://view.highspot.com/viewer/5f438f47a4dfa042e97130c5)

**配置安全性和合规性**
+ [配置 IP 访问列表条目](https://docs.atlas.mongodb.com/security/ip-access-list/)
+ [配置数据库用户](https://docs.atlas.mongodb.com/security-add-mongodb-users/)
+ [配置对 Atlas UI 的访问权限](https://docs.atlas.mongodb.com/organizations-projects/)
+ [配置自定义数据库角色](https://docs.atlas.mongodb.com/security-add-mongodb-roles)
+ [配置数据库用户](https://docs.atlas.mongodb.com/security-add-mongodb-users/#atlas-user-privileges)
+ [设置网络对等连接](https://docs.atlas.mongodb.com/security-vpc-peering/)
+ [了解 Atlas 中的私有端点](https://docs.atlas.mongodb.com/security-private-endpoint/)
+ [管理多重身份验证选项](https://docs.atlas.mongodb.com/security-two-factor-authentication/)
+ [使用 LDAP 设置用户身份验证和授权](https://docs.atlas.mongodb.com/security-ldaps/)
+ [Atlas 数据湖](https://docs.mongodb.com/datalake/)
+ [使用客户密钥管理进行静态加密](https://docs.atlas.mongodb.com/security-kms-encryption/)
+ [承担角色的方法](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)（IAM 文档）
+ [客户端字段级加密](https://docs.mongodb.com/manual/core/security-client-side-encryption)
+ [自动加密](https://docs.mongodb.com/manual/core/security-automatic-client-side-encryption) 
+ [MongoDB Atlas 安全控制](https://webassets.mongodb.com/_com_assets/cms/MongoDB_Atlas_Security_Controls-v7k3rbhi3p.pdf)
+ [MongoDB 信任中心](https://www.mongodb.com/cloud/trust)
+ [为集群配置安全功能](https://docs.atlas.mongodb.com/setup-cluster-security/)

**在 **AWS** 上设置新的 MongoDB Atlas 环境**
+ [云提供商和地区](https://docs.atlas.mongodb.com/cloud-providers-regions/)
+ [管理全局集群](https://docs.atlas.mongodb.com/global-clusters/)
+ [选择集群层级](https://www.mongodb.com/docs/atlas/manage-clusters/#select-cluster-tier)
+ [配置其他设置](https://docs.atlas.mongodb.com/cluster-additional-settings/)
+ [开始使用 Atlas](https://docs.atlas.mongodb.com/getting-started/)
+ [配置对 Atlas UI 的访问权限](https://docs.atlas.mongodb.com/organizations-projects/)

**迁移数据**
+ [迁移或导入数据](https://www.mongodb.com/docs/atlas/import/)

**监控集群**
+ [监控您的集群](https://docs.atlas.mongodb.com/monitoring-alerts/)

**集成操作**
+ [连接到集群](https://docs.atlas.mongodb.com/connect-to-cluster/)
+ [与您的数据交互](https://docs.atlas.mongodb.com/data-explorer/)
+ [监控您的集群](https://docs.atlas.mongodb.com/monitoring-alerts/)
+ [备份、恢复和存档数据](https://docs.atlas.mongodb.com/backup-restore-cluster/)

**GitHub repository**
+ [使用以下命令将数据流式传输到 MongoDB Atlas AWS Glue](https://github.com/mongodb-partners/Stream_Data_into_MongoDB_AWS_Glue?tab=readme-ov-file#troubleshooting)

# 在 Amazon RDS 上为 Oracle PeopleSoft 应用程序过渡角色适用于 Oracle 定制
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle"></a>

*Sampath Kathirvel，Amazon Web Services*

## Summary
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-summary"></a>

要在亚马逊网络服务 (AWS) 上运行 [Oracle PeopleSoft](https://www.oracle.com/applications/peoplesoft/) 企业资源规划 (ERP) 解决方案，您可以使用[亚马逊关系数据库服务 (Amazon RDS) 或 Ama](https://aws.amazon.com/rds/) [zon RDS Custom for Oracle](https://aws.amazon.com/rds/custom/)，后者支持需要访问底层操作系统 (OS) 和数据库环境的传统、定制和打包应用程序。有关规划迁移时需要考虑的关键因素，请参阅《AWS 规范指引》中的 [Oracle 数据库迁移策略](https://docs.aws.amazon.com/prescriptive-guidance/latest/migration-oracle-database/strategies.html)。

此模式侧重于为在 Amazon RDS Custom 上运行的 PeopleSoft 应用程序数据库执行 Oracle Data Guard 切换或角色过渡的步骤，该数据库是带有只读副本数据库的主数据库。该模式包括配置[快速启动失效转移 (FSFO)](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/using-data-guard-broker-to-manage-switchovers-failovers.html#GUID-D26D79F2-0093-4C0E-98CD-224A5C8CBFA4) 的步骤。在此过程中，Oracle Data Guard 配置中的数据库将继续以其新角色运行。Oracle Data Guard 切换的典型使用案例包括灾难恢复（DR）演练、数据库的定期维护活动以及[备用优先补丁应用](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/upgrading-patching-downgrading-oracle-data-guard-configuration.html#GUID-A5226768-DB6B-4714-BB9A-0A3EF17A01C8)滚动补丁。有关更多信息，请参阅博客文章[缩短 Amazon RDS Custom 中的数据库补丁停机时间](https://aws.amazon.com/blogs/database/reduce-database-patching-downtime-in-amazon-rds-custom-for-oracle-using-oracle-data-guard-standby-first-patch-apply/)。

## 先决条件和限制
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-prereqs"></a>

**先决条件**
+ [使用只读副本模式完成 PeopleSoft 在 Amazon RDS 自定义上向 Oracle 添加 HA](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica.html)。

**限制**
+ [适用于 Oracle 的 RDS Custom](https://docs.amazonaws.cn/en_us/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.limits) 的限制和不支持的配置
+ [适用于 Oracle 的 Amazon RDS Custom 只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-rr.html#custom-rr.limitations)的相关限制

**产品版本**
+ 有关 Amazon RDS Custom 支持的 Oracle 数据库版本，请参阅[适用于 Oracle 的 RDS Custom](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.html#Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.ora)。
+ 有关 Amazon RDS Custom 支持的 Oracle 数据库实例类，请参阅[适用于 Oracle 的 RDS Custom 支持的数据库实例类](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-reqs-limits.html#custom-reqs-limits.instances)。

## 架构
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-architecture"></a>

**技术堆栈**
+ 适用于 Oracle 的 Amazon RDS Custom

**目标架构**

下图显示了 Amazon RDS Custom 数据库实例和 Amazon RDS Custom 只读副本。Oracle Data Guard 在灾难恢复失效转移期间提供角色转换。

![\[使用一个只读副本数据库，将 Oracle Data Guard 切换为主要 RDS 自定义数据库实例。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/da3b011c-1668-4de4-9079-0982888a74b4/images/4e2a2f3b-b5bd-44b7-9b5a-13a663ee3be6.png)


有关 PeopleSoft 在 AWS 上使用 Oracle 的代表性架构，请参阅[在 AWS 上设置高可用 PeopleSoft 架构](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/set-up-a-highly-available-peoplesoft-architecture-on-aws.html)。

## 工具
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-tools"></a>

**Amazon Web Services**
+ [适用于 Oracle 的 Amazon RDS Custom](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/working-with-custom-oracle.html) 是一种托管式数据库服务，适用于需要访问底层操作系统和数据库环境的旧版、自定义和打包应用程序。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 的 API 调用，以便以编程方式检索密钥。在此模式中，您需要使用密钥名称 `do-not-delete-rds-custom-+<<RDS Resource ID>>+-dg`，从 Secrets Manager for `RDS_DATAGUARD` 中检索数据库用户密码。

**其他服务**
+ [Oracle Data Guard](https://docs.oracle.com/en/database/oracle/oracle-database/21/sbydb/introduction-to-oracle-data-guard-concepts.html#GUID-5E73667D-4A56-445E-911F-1E99092DD8D7) 可帮助您创建、维护、管理和监控备用数据库。这种模式使用 Oracle Data Guard 最高性能来转换角色（[Oracle Data Guard 切换](https://docs.oracle.com/database/121/DGBKR/sofo.htm#DGBKR330)）。

## 最佳实践
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-best-practices"></a>

对于生产部署，我们建议在与主节点和只读副本节点分开的第三个可用区中启动观察器实例。

## 操作说明
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-epics"></a>

### 启动角色转换
<a name="initiate-role-transition"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 暂停主数据库和副本数据库的自动化。 | 尽管 RDS Custom 自动化框架不会干扰角色转换过程，但在 Oracle Data Guard 切换期间暂停自动化是一种不错的做法。要暂停和恢复 RDS Custom 数据库自动化，请按照[暂停和恢复 RDS Custom 自动化](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/custom-managing.html#custom-managing.pausing)中的说明进行操作。 | 云管理员、数据库管理员 | 
| 检查 Oracle Data Guard 状态。 | 要检查 Oracle Data Guard 状态，请登录到主数据库。此模式包括用于使用多租户容器数据库（CDB）或非 CDB 实例的代码。**非 CDB**<pre>-bash-4.2$ dgmgrl RDS_DATAGUARD@RDS_CUSTOM_ORCL_A<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Mon Nov 28 20:55:50 2022<br />Version 19.10.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "ORCL_A"<br />Connected as SYSDG.<br />DGMGRL> show configuration<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_a - Primary database<br />orcl_d - Physical standby database <br />Fast-Start Failover: Disabled<br />Configuration Status:<br />SUCCESS (status updated 59 seconds ago)<br />DGMGRL></pre>**CDB**<pre>CDB-bash-4.2$ dgmgrl C##RDS_DATAGUARD@RDS_CUSTOM_RDSCDB_A<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Jan 18 06:13:07 2023<br />Version 19.16.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "RDSCDB_A"<br />Connected as SYSDG.<br />DGMGRL> show configuration<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_a - Primary database<br />    rdscdb_b - Physical standby database <br />Fast-Start Failover:  Disabled<br />Configuration Status:<br />SUCCESS   (status updated 52 seconds ago)<br />DGMGRL></pre> | 数据库管理员 | 
| 验证实例角色。 | 打开 AWS 管理控制台，然后导航到 Amazon RDS 控制台。在数据库的**复制**部分的**连接和安全**选项卡上，验证主数据库和副本数据库的实例角色。主角色应与 Oracle Data Guard 主数据库匹配，副本角色应与 Oracle Data Guard 物理备用数据库相匹配。 | 云管理员、数据库管理员 | 
| 执行切换。 | 要执行切换，请从主节点连接至 `DGMGRL`。**非 CDB**<pre>DGMGRL> switchover to orcl_d;<br />Performing switchover NOW, please wait...<br />Operation requires a connection to database "orcl_d"<br />Connecting ...<br />Connected to "ORCL_D"<br />Connected as SYSDG.<br />New primary database "orcl_d" is opening...<br />Operation requires start up of instance "ORCL" on database "orcl_a"<br />Starting instance "ORCL"...<br />Connected to an idle instance.<br />ORACLE instance started.<br />Connected to "ORCL_A"<br />Database mounted.<br />Database opened.<br />Connected to "ORCL_A"<br />Switchover succeeded, new primary is "orcl_d"<br />DGMGRL>  </pre>**CDB**<pre>DGMGRL> switchover to rdscdb_b<br />Performing switchover NOW, please wait...<br />New primary database "rdscdb_b" is opening...<br />Operation requires start up of instance "RDSCDB" on database "rdscdb_a"<br />Starting instance "RDSCDB"...<br />Connected to an idle instance.<br />ORACLE instance started.<br />Connected to "RDSCDB_A"<br />Database mounted.<br />Database opened.<br />Connected to "RDSCDB_A"<br />Switchover succeeded, new primary is "rdscdb_b"</pre> | 数据库管理员 | 
| 验证 Oracle Data Guard 连接。 | 切换后，验证 Oracle Data Guard 从主节点连接到 `DGMGRL`。**非 CDB**<pre>DGMGRL> show configuration;<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_d - Primary database<br />orcl_a - Physical standby database <br />Fast-Start Failover: Disabled<br />Configuration Status:<br />SUCCESS (status updated 60 seconds ago)<br />DGMGRL> <br /><br />DGMGRL> show configuration lag;<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_d - Primary database<br />orcl_a - Physical standby database <br />Transport Lag: 0 seconds (computed 0 seconds ago)<br />Apply Lag: 0 seconds (computed 0 seconds ago)<br />Fast-Start Failover: Disabled<br />Configuration Status:<br />SUCCESS (status updated 44 seconds ago)<br />DGMGRL> </pre>**CDB**<pre>DGMGRL> show configuration<br />DGMGRL> show configuration<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_b - Primary database<br />    rdscdb_a - Physical standby database <br />Fast-Start Failover:  Disabled<br />Configuration Status:<br />SUCCESS   (status updated 52 seconds ago)<br />DGMGRL> <br /><br />DGMGRL> show configuration lag<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_b - Primary database<br />    rdscdb_a - Physical standby database <br />               Transport Lag:      0 seconds (computed 0 seconds ago)<br />               Apply Lag:          0 seconds (computed 0 seconds ago)<br />Fast-Start Failover:  Disabled<br />Configuration Status:<br />SUCCESS   (status updated 53 seconds ago)<br />DGMGRL></pre> | 数据库管理员 | 
| 在 Amazon RDS 控制台上验证实例角色。 | 执行角色切换后，Amazon RDS 控制台在**数据库**下的**连接和安全**选项卡的**复制**部分下显示新角色。**复制状态**可能需要几分钟才能从空升级至**正在复制**。 | 数据库管理员 | 

### 配置 FSFO
<a name="configure-fsfo"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 重置切换。 | 将切换设置回主节点。 | 数据库管理员 | 
| 安装并启动观察器。 | 观察器过程是 `DGMGRL` 客户端组件，通常运行在与主数据库和备用数据库不同的计算机上。观察器的 ORACLE HOME 安装可以采用 Oracle Client Administrator 安装，也可以安装 Oracle 数据库企业版或个人版。有关数据库版本的观察器安装的更多信息，请参阅[安装和启动观察器](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/using-data-guard-broker-to-manage-switchovers-failovers.html#GUID-11EF3897-8FCA-4A54-B63B-E8C1668AE21B)。要为观察器过程配置高可用性，您可能想要执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle.html)对于 Oracle 12c 版本 2 及更高版本，您最多可以部署三个观察器。其中一个观察器是主观察器，其余的则是备用观察器。当主观察器失效时，其中一个备用观察器将扮演主角色。 | 数据库管理员 | 
| 从观察器主机连接到 DGMGRL。 | 观察器主机配有用于主数据库和备用数据库连接的 `tnsnames.ora`条目。只要数据丢失在[FastStartFailoverLagLimit](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/oracle-data-guard-broker-properties.html)配置范围内（以秒为单位），您就可以启用具有最高性能保护模式的 FSFO。但是，您必须使用最大可用性保护模式才能实现零数据丢失（RPO=0）。**非 CDB**<pre>DGMGRL> show configuration;<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_a - Primary database<br />orcl_d - Physical standby database <br />Fast-Start Failover: Disabled<br />Configuration Status:<br />SUCCESS (status updated 58 seconds ago)<br />DGMGRL> show configuration lag<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_a - Primary database<br />orcl_d - Physical standby database <br />Transport Lag: 0 seconds (computed 1 second ago)<br />Apply Lag: 0 seconds (computed 1 second ago)<br />Fast-Start Failover: Disabled<br />Configuration Status:<br />SUCCESS (status updated 5 seconds ago)<br />DGMGRL></pre>**CDB**<pre>-bash-4.2$ dgmgrl C##RDS_DATAGUARD@RDS_CUSTOM_RDSCDB_A<br />DGMGRL for Linux: Release 19.0.0.0.0 - Production on Wed Jan 18 06:55:09 2023<br />Version 19.16.0.0.0<br />Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.<br />Welcome to DGMGRL, type "help" for information.<br />Password:<br />Connected to "RDSCDB_A"<br />Connected as SYSDG.<br />DGMGRL> show configuration<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_a - Primary database<br />    rdscdb_b - Physical standby database <br />Fast-Start Failover:  Disabled<br />Configuration Status:<br />SUCCESS   (status updated 18 seconds ago)<br />DGMGRL></pre> | 数据库管理员 | 
| 将备用数据库修改为失效转移目标。 | 从主节点或观察器节点连接到一个备用数据库。（尽管您可能配有多个备用数据库，但此时您只需要连接到一个备用数据库。）**非 CDB**<pre>DGMGRL> edit database orcl_a set property FastStartFailoverTarget='orcl_d';<br />Property "faststartfailovertarget" updated<br />DGMGRL> edit database orcl_d set property FastStartFailoverTarget='orcl_a';<br />Property "faststartfailovertarget" updated<br />DGMGRL> show database orcl_a FastStartFailoverTarget;<br />FastStartFailoverTarget = 'orcl_d'<br />DGMGRL> show database orcl_d FastStartFailoverTarget;<br />FastStartFailoverTarget = 'orcl_a'<br />DGMGRL></pre>**CDB**<pre>DGMGRL> edit database orcl_a set property FastStartFailoverTarget='rdscdb_b';<br />Object "orcl_a" was not found<br />DGMGRL> edit database rdscdb_a set property FastStartFailoverTarget='rdscdb_b';<br />Property "faststartfailovertarget" updated<br />DGMGRL> edit database rdscdb_b set property FastStartFailoverTarget='rdscdb_a';<br />Property "faststartfailovertarget" updated<br />DGMGRL> show database rdscdb_a FastStartFailoverTarget;<br />  FastStartFailoverTarget = 'rdscdb_b'<br />DGMGRL> show database rdscdb_b FastStartFailoverTarget;<br />  FastStartFailoverTarget = 'rdscdb_a'<br />DGMGRL></pre> | 数据库管理员 | 
|  FastStartFailoverThreshold 为连接到 DGMGRL 进行配置。 | 在 Oracle 19c 中，默认值为 30 秒，最小值为 6 秒。较低的值可能会缩短失效转移期间的恢复时间目标（RTO）。较高的值有助于降低主数据库上出现不必要的失效转移瞬时错误的可能性。适用于 Oracle 的 RDS Custom 自动化框架监控数据库运行状况并每隔几秒钟执行一次纠正操作。因此，我们建议将值设置 FastStartFailoverThreshold 为大于 10 秒的值。以下示例将阈值配置为 35 秒。**非 CBD 或 CDB**<pre>DGMGRL> edit configuration set property FastStartFailoverThreshold=35;<br />Property "faststartfailoverthreshold" updated<br />DGMGRL> show configuration FastStartFailoverThreshold;<br />FastStartFailoverThreshold = '35'<br />DGMGRL></pre> | 数据库管理员 | 
| 通过从主节点或观察器节点连接到 DGMGRL 来启用 FSFO。 | 如果数据库未启用[闪回数据库](https://docs.oracle.com/en/database/oracle/oracle-database/19/rcmrf/FLASHBACK-DATABASE.html#GUID-584AC79A-40C5-45CA-8C63-DED3BE3A4511)，则会显示警告消息 `ORA-16827`。如果[FastStartFailoverAutoReinstate](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/oracle-data-guard-broker-properties.html#GUID-824E97C0-EEB0-4E1B-BD4A-F5AE282CEA28)配置属性设置为`TRUE`（这是默认值），则可选的闪回数据库有助于自动将出现故障的主数据库恢复到故障转移之前的时间点。**非 CDB**<pre>DGMGRL> enable fast_start failover;<br />Warning: ORA-16827: Flashback Database is disabled<br />Enabled in Zero Data Loss Mode.<br />DGMGRL> <br />DGMGRL> show configuration<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_a - Primary database<br />Warning: ORA-16819: fast-start failover observer not started<br />orcl_d - (*) Physical standby database <br />Warning: ORA-16819: fast-start failover observer not started<br />Fast-Start Failover: Enabled in Zero Data Loss Mode<br />Configuration Status:<br />WARNING (status updated 29 seconds ago)<br />DGMGRL></pre>**CDB**<pre>DGMGRL> enable fast_start failover;<br />Warning: ORA-16827: Flashback Database is disabled<br />Enabled in Zero Data Loss Mode.<br />DGMGRL> show configuration;<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_a - Primary database<br />    Warning: ORA-16819: fast-start failover observer not started<br />    rdscdb_b - (*) Physical standby database <br />Fast-Start Failover: Enabled in Zero Data Loss Mode<br />Configuration Status:<br />WARNING   (status updated 11 seconds ago)<br />DGMGRL></pre> | 数据库管理员 | 
| 启动观察器进行 FSFO 监控，然后验证状态。 | 您可以在启用 FSFO 之前或之后启动观察器。如果 FSFO 已启用，则观察器会立即开始监控状态以及与主备用数据库和目标备用数据库的连接。如果未启用 FSFO，则观察器要等到 FSFO 启用后才会开始监控。启动观察器时，将显示主数据库配置而不显示任何错误消息，前述 `show configuration` 命令就是明证。**非 CDB**<pre>DGMGRL> start observer;<br />[W000 2022-12-01T06:16:51.271+00:00] FSFO target standby is orcl_d<br />Observer 'ip-10-0-1-89' started<br />[W000 2022-12-01T06:16:51.352+00:00] Observer trace level is set to USER<br /><br />DGMGRL> show configuration<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_a - Primary database<br />orcl_d - (*) Physical standby database <br />Fast-Start Failover: Enabled in Zero Data Loss Mode<br />Configuration Status:<br />SUCCESS (status updated 56 seconds ago)<br />DGMGRL> <br /><br />DGMGRL> show observer<br />Configuration - rds_dg<br />Primary: orcl_a<br />Active Target: orcl_d<br />Observer "ip-10-0-1-89" - Master<br />Host Name: ip-10-0-1-89<br />Last Ping to Primary: 1 second ago<br />Last Ping to Target: 1 second ago<br />DGMGRL></pre>**CDB**<pre>DGMGRL> start observer;<br />Succeeded in opening the observer file "/home/oracle/fsfo_ip-10-0-1-56.dat".<br />[W000 2023-01-18T07:31:32.589+00:00] FSFO target standby is rdscdb_b<br />Observer 'ip-10-0-1-56' started<br />The observer log file is '/home/oracle/observer_ip-10-0-1-56.log'.<br /><br />DGMGRL> show configuration<br />Configuration - rds_dg<br />  Protection Mode: MaxAvailability<br />  Members:<br />  rdscdb_a - Primary database<br />    rdscdb_b - (*) Physical standby database <br />Fast-Start Failover: Enabled in Zero Data Loss Mode<br />Configuration Status:<br />SUCCESS   (status updated 12 seconds ago)<br />DGMGRL> <br /><br />DGMGRL> show observer;<br />Configuration - rds_dg<br />  Primary:            rdscdb_a<br />  Active Target:      rdscdb_b<br />Observer "ip-10-0-1-56" - Master<br />  Host Name:                    ip-10-0-1-56<br />  Last Ping to Primary:         1 second ago<br />  Last Ping to Target:          2 seconds ago<br />DGMGRL></pre> | 数据库管理员 | 
| 验证失效转移。 | 在这种情况下，可以通过手动停止主 EC2 实例来执行故障转移测试。在停止 EC2 实例之前，请使用`tail`命令根据您的配置监控观察者日志文件。以用户 `RDS_DATAGUARD` 的身份使用 `DGMGRL` 登录备用数据库 `orcl_d`，并检查 Oracle Data Guard 状态。系统应当表明 `orcl_d` 是新的主数据库。在此失效转移测试场景中，`orcl_d` 是非 CDB 数据库。在失效转移之前，已在 `orcl_a` 上启用闪回数据库。在先前的主数据库恢复在线状态并以 `MOUNT` 状态启动后，观察器将其恢复到新的备用数据库中。恢复后的数据库充当新主数据库的 FSFO 目标。您可以在观察器日志中验证详细信息。<pre>DGMGRL> show configuration<br />Configuration - rds_dg<br />Protection Mode: MaxAvailability<br />Members:<br />orcl_d - Primary database<br />Warning: ORA-16824: multiple warnings, including fast-start failover-related warnings, detected for the database<br />orcl_a - (*) Physical standby database (disabled)<br />ORA-16661: the standby database needs to be reinstated<br />Fast-Start Failover: Enabled in Zero Data Loss Mode<br />Configuration Status:<br />WARNING (status updated 25 seconds ago)<br />DGMGRL></pre>以下显示了 `observer.log` 中的示例输出。<pre>$ tail -f /tmp/observer.log<br />Unable to connect to database using rds_custom_orcl_a<br />[W000 2023-01-18T07:50:32.589+00:00] Primary database cannot be reached.<br />[W000 2023-01-18T07:50:32.589+00:00] Fast-Start Failover threshold has expired.<br />[W000 2023-01-18T07:50:32.590+00:00] Try to connect to the standby.<br />[W000 2023-01-18T07:50:32.590+00:00] Making a last connection attempt to primary database before proceeding with Fast-Start Failover.<br />[W000 2023-01-18T07:50:32.591+00:00] Check if the standby is ready for failover.<br />[S002 2023-01-18T07:50:32.591+00:00] Fast-Start Failover started...<br />2023-01-18T07:50:32.591+00:00<br />Initiating Fast-Start Failover to database "orcl_d"...<br />[S002 2023-01-18T07:50:32.592+00:00] Initiating Fast-start Failover.<br />Performing failover NOW, please wait...<br />Failover succeeded, new primary is "orcl_d"<br />2023-01-18T07:55:32.101+00:00<br />[S002 2023-01-18T07:55:32.591+00:00] Fast-Start Failover finished...<br />[W000 2023-01-18T07:55:32.591+00:00] Failover succeeded. Restart pinging.<br />[W000 2023-01-18T07:55:32.603+00:00] Primary database has changed to orcl_d.<br />[W000 2023-01-18T07:55:33.618+00:00] Try to connect to the primary.<br />[W000 2023-01-18T07:55:33.622+00:00] Try to connect to the primary rds_custom_orcl_d.<br />[W000 2023-01-18T07:55:33.634+00:00] The standby orcl_a needs to be reinstated<br />[W000 2023-01-18T07:55:33.654+00:00] Try to connect to the new standby orcl_a.<br />[W000 2023-01-18T07:55:33.654+00:00] Connection to the primary restored!<br />[W000 2023-01-18T07:55:35.654+00:00] Disconnecting from database rds_custom_orcl_d.<br />[W000 2023-01-18T07:55:57.701+00:00] Try to connect to the new standby orcl_a.<br />ORA-12170: TNS:Connect timeout occurred</pre> | 数据库管理员 | 

### 配置 Oracle Peoplesoft 应用程序和数据库之间的连接
<a name="configure-connectivity-between-the-oracle-peoplesoft-application-and-the-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在主数据库中创建并启动该服务。 | 在配置中有一条 TNS 条目同时包含主数据库端点和备用数据库端点，使用此条目可以避免在角色转换期间更改应用程序配置。您可以定义两个基于角色的数据库服务来同时支持这两个工作负载 read/write 和只读工作负载。在以下示例中，`orcl_rw`是主数据库上处于活动状态的 read/write 服务。 `orcl_ro`是只读服务，在以只读模式打开的备用数据库上处于活动状态。<pre>SQL> select name,open_mode from v$database;<br />NAME OPEN_MODE<br />--------- --------------------<br />ORCL READ WRITE<br />SQL> exec dbms_service.create_service('orcl_rw','orcl_rw');<br />PL/SQL procedure successfully completed.<br />SQL> exec dbms_service.create_service('orcl_ro','orcl_ro');<br />PL/SQL procedure successfully completed.<br /><br />SQL> exec dbms_service.start_service('orcl_rw');<br />PL/SQL procedure successfully completed.<br />SQL></pre> | 数据库管理员 | 
| 在备用数据库中启动服务。 | 要在只读备用数据库中启动该服务，请使用以下代码。<pre>SQL> select name,open_mode from v$database;<br />NAME OPEN_MODE<br />--------- --------------------<br />ORCL READ ONLY WITH APPLY<br />SQL> exec dbms_service.start_service('orcl_ro');<br />PL/SQL procedure successfully completed.<br />SQL></pre> | 数据库管理员 | 
| 在主数据库重新启动时自动启动服务。 | 要在主数据库重新启动时自动启动该服务，请使用以下代码。<pre>SQL> CREATE OR REPLACE TRIGGER TrgDgServices after startup on database<br />DECLARE<br />db_role VARCHAR(30);<br />db_open_mode VARCHAR(30);<br />BEGIN<br />SELECT DATABASE_ROLE, OPEN_MODE INTO db_role, db_open_mode FROM V$DATABASE;<br />IF db_role = 'PRIMARY' THEN<br />DBMS_SERV 2 ICE.START_SERVICE('orcl_rw');<br />END IF;<br />IF db_role = 'PHYSICAL STANDBY' AND db_open_mode LIKE 'READ ONLY%' THEN<br />DBMS_SERVICE.START_SERVICE('orcl_ro');<br />END IF;<br />END;<br />/ <br />Trigger created.<br />SQL> </pre> | 数据库管理员 | 
| 在 read/write 和只读数据库之间配置连接。 | 您可以为 read/write 和只读连接使用以下应用程序配置示例。<pre>ORCL_RW = (DESCRIPTION =<br />(CONNECT_TIMEOUT= 120)(RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)<br />(ADDRESS_LIST =<br />(ADDRESS = (PROTOCOL = TCP)(HOST=devpsftdb.******.us-west-2.rds.amazonaws.com)(PORT=1521))<br />(ADDRESS = (PROTOCOL = TCP)(HOST=psftread.******.us-west-2.rds.amazonaws.com)(PORT=1521))<br />)<br />(CONNECT_DATA=(SERVICE_NAME = orcl_rw))<br />)<br />ORCL_RO = (DESCRIPTION =<br />(CONNECT_TIMEOUT= 120)(RETRY_COUNT=20)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)<br />(ADDRESS_LIST =<br />(ADDRESS = (PROTOCOL = TCP)(HOST=devpsftdb.******.us-west-2.rds.amazonaws.com)(PORT=1521))<br />(ADDRESS = (PROTOCOL = TCP)(HOST=psftread.******.us-west-2.rds.amazonaws.com)(PORT=1521))<br />)<br />(CONNECT_DATA=(SERVICE_NAME = orcl_ro))<br />)</pre> | 数据库管理员 | 

## 相关的资源
<a name="transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle-resources"></a>
+ [在适用于 Oracle 的 Amazon RDS Custom 上使用 Data Guard 启用高可用性](https://d1.awsstatic.com/whitepapers/enabling-high-availability-with-data-guard-on-amazon-rds-custom-for-oracle.pdf)（AWS 技术指南）
+ [将 Amazon RDS 配置为 Oracle PeopleSoft 数据库](https://d1.awsstatic.com/whitepapers/configuring-amazon-rds-as-peoplesoft-database.pdf)（AWS 白皮书）
+ [Oracle Data Guard 代理指南](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/index.html)（Oracle 参考文档）
+ [Data Guard 概念和管理](https://docs.oracle.com/en/database/oracle/oracle-database/19/sbydb/index.html)（Oracle 参考文档）
+ [Oracle Data Guard 特定的 FAN 和 FCF 配置要求](https://docs.oracle.com/en/database/oracle/oracle-database/19/dgbkr/using-data-guard-broker-to-manage-switchovers-failovers.html#GUID-DFFDAA2B-A889-49AD-AB85-747D73FF0FF5)（Oracle 参考文档）

# 将不同账户中的 Amazon Redshift 集群中的数据卸载到 Amazon S3
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3"></a>

*Andrew Kamel，Amazon Web Services*

## Summary
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-summary"></a>

当测试应用程序时，在测试环境中使用生产数据会很有帮助。使用生产数据，您可以更准确地评估正在开发的应用程序。

此模式将从生产环境中的 Amazon Redshift 集群中提取数据，并将这些数据传输到 Amazon Web Services（AWS）上的开发环境中的 Amazon Simple Storage Service（Amazon S3）存储桶中。

此模式将逐步完成 DEV 和 PROD 账户的设置，包括：
+ 所需的资源
+ AWS Identity and Access Management (IAM) 角色
+ 调整与子网、安全组和虚拟私有云（VPC）之间的网络连接，以便支持 Amazon Redshift 连接
+ 一个带有 Python 运行时的示例 AWS Lambda 函数，用于测试架构

要授予对 Amazon Redshift 集群的访问权限，该模式 AWS Secrets Manager 用于存储相关证书。好处是拥有直接连接到 Amazon Redshift 集群所需的全部信息，而无需知道 Amazon Redshift 集群位于何处。此外，您还可以[监控密钥的使用情况](https://docs.aws.amazon.com/secretsmanager/latest/userguide/monitoring.html)。

保存在 Secrets Manager 中的密钥包括 Amazon Redshift 集群的主机、数据库名称、端口和相关的凭证。

有关使用此模式时的安全注意事项的信息，请参阅[最佳实践](#unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-best-practices)部分。

## 先决条件和限制
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-prereqs"></a>

**先决条件**
+ 在 PROD 账户中[运行的 Amazon Redshift 集群](https://docs.aws.amazon.com/redshift/latest/gsg/new-user.html)
+ 在 DEV 账户中[创建的 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)
+ 在 DEV 账户与 PROD 账户之间建立了 [VPC 对等连接](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)，并相应[调整了路由表](https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-routing.html)
+ 为两个对等设备@@ [启用了 DNS 主机名和 DNS 解析](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html) VPCs

**限制**
+ 根据您要查询的数据量，Lambda 函数可能会超时。

  如果您的运行时间超过了 Lambda 的最大超时时间（15 分钟），请对您的 Lambda 代码采用一种异步方法。此模式的代码示例使用适用于 Python 的 [psycopg2](https://github.com/psycopg/psycopg2) 库，此库目前不支持异步处理。
+ 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性，请参阅[按区域划分的AWS 服务](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。有关特定端点，请参阅[服务端点和配额](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)页面，然后选择相应服务的链接。

## 架构
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-architecture"></a>

下图显示了包含 DEV 账户和 PROD 账户的目标架构。

![\[DEV 账户中的 Lambda VPC 和 PROD 账户中的 Amazon Redshift VPC。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/5c83c617-3a85-4aea-a7a7-930f406d1cef/images/fa4d01df-483d-4454-9711-b391ebbe4629.png)


下图显示了如下工作流：

1. DEV 账户中的 Lambda 函数担任 IAM 角色，访问 PROD 账户中的 Secrets Manager 中的 Amazon Redshift 凭证时，需要使用此角色。

   随后，Lambda 函数将检索 Amazon Redshift 集群密钥。

1. 开发者账户中的 Lambda 函数使用这些信息通过对等连接到 PROD 账户中的 Amazon Redshift 集群。 VPCs

   接下来，Lambda 函数发送一个卸载命令，以便查询 PROD 账户中的 Amazon Redshift 集群。

1. PROD 账户中的 Amazon Redshift 集群担任相关的 IAM 角色，以便访问 DEV 账户中的 S3 存储桶。

   Amazon Redshift 集群将查询的数据卸载到 DEV 账户中的 S3 存储桶。

**查询来自 Amazon Redshift 的数据**

下图显示了用于检索 Amazon Redshift 凭证和连接到 Amazon Redshift 集群的角色。此工作流由 Lambda 函数启动。

![\[用于在不同的账户中担任角色的三步流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/5c83c617-3a85-4aea-a7a7-930f406d1cef/images/ab25b72c-773c-4d58-9012-4a3755c181ff.png)


下图显示了如下工作流：

1. DEV 账户中的 `CrossAccount-SM-Read-Role` 在 PROD 账户中担任 `SM-Read-Role`。

1. `SM-Read-Role` 角色使用附加的策略，从 Secrets Manager 中检索密钥。

1. 这些凭证用于访问 Amazon Redshift 集群。

**将数据上传到 Amazon S3**

下图显示了用于提取数据并将其上传到 Amazon S3 的跨账户读写过程。此工作流由 Lambda 函数启动。此模式将 [Amazon Redshift 中的 IAM 角色串联在一起](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles)。来自 Amazon Redshift 集群的卸载命令担任 `CrossAccount-S3-Write-Role`，然后担任 `S3-Write-Role`。这一角色串联能够授权 Amazon Redshift 访问 Amazon S3。

![\[获取凭证、访问 Amazon Redshift 并将数据上传到 Amazon S3 的那些角色。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/5c83c617-3a85-4aea-a7a7-930f406d1cef/images/d2982fc6-1d12-4f9d-9493-a99ce691d693.png)


此工作流包含以下步骤：

1. DEV 账户中的 `CrossAccount-SM-Read-Role` 在 PROD 账户中担任 `SM-Read-Role`。

1. `SM-Read-Role` 从 Secrets Manager 中检索 Amazon Redshift 凭证。

1. Lambda 函数连接到 Amazon Redshift 集群，并发送一个查询。

1. Amazon Redshift 集群担任 `CrossAccount-S3-Write-Role`。

1. 在 DEV 账户中，`CrossAccount-S3-Write-Role` 担任 `S3-Write-Role`。

1. 查询结果将卸载到 DEV 账户中的 S3 存储桶。

## 工具
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-tools"></a>

**AWS 服务**
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 帮助您创建和控制加密密钥以帮助保护您的数据。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/getting-started.html) 是一项在 Amazon Web Services Cloud 中托管的 PB 级数据仓库服务。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 可帮助您将代码中的硬编码凭证（包括密码）替换为对 Secrets Manager 进行的 API 调用，以便以编程方式检索此密钥。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**代码存储库 **

此模式的代码可在 GitHub [unload-redshift-to-s3-python](https://github.com/aws-samples/unload-redshift-to-s3-python/) 存储库中找到。

## 最佳实践
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-best-practices"></a>

**安全免责声明**

在实施该解决方案之前，请考虑下面这些重要的安全建议：
+ 请记住，连接开发账户和生产账户可能会导致范围扩大、整体安全状况变差。我们建议只临时部署该解决方案、提取所需的数据部分，然后立即销毁已部署的资源。要销毁资源，您应删除 Lambda 函数、移除为该解决方案创建的任何 IAM 角色和策略，并撤消在多个账户之间授予的任何网络访问权限。
+ 在将任何数据从生产环境复制到开发环境之前，请咨询您的安全和合规团队。通常不应以这种方式复制个人身份信息（PII）、受保护的健康信息（PHI）以及其他机密数据或受监管的数据。只复制公开提供的非机密信息（例如商店前端的公开库存数据）。考虑对数据进行令牌化或匿名化处理，或者生成合成测试数据，而不是尽可能使用生产数据。[AWS 安全原则](https://docs.aws.amazon.com/en_us/wellarchitected/2022-03-31/framework/sec-design.html)之一是限制对数据的访问。换句话说，开发人员不应在生产账户中执行操作。
+ 限制访问开发账户中的 Lambda 函数，因为此函数会从生产环境中的 Amazon Redshift 集群读取数据。
+ 为了避免生产环境中断，请实施以下建议：
  + 使用单独的专用开发账户来执行测试和开发活动。
  + 实施严格的网络访问控制，并将账户之间的流量限制在仅仅必要的水平。
  + 监控和审核对生产环境和数据来源的访问。
  + 对于所有的相关资源和服务，实施最低权限访问控制。
  + 定期审查和轮换证书，例如 AWS Secrets Manager 密钥和 IAM 角色访问密钥。
+ 对于本文中使用的服务，请参阅如下安全文档：
  + [AWS Lambda 安全](https://docs.aws.amazon.com/lambda/latest/dg/lambda-security.html)
  + [Amazon Redshift 安全性](https://docs.aws.amazon.com/redshift/latest/mgmt/iam-redshift-user-mgmt.html)
  + [Amazon S3 安全性](https://docs.aws.amazon.com/AmazonS3/latest/userguide/security.html)
  + [AWS Secrets Manager 安全](https://docs.aws.amazon.com/secretsmanager/latest/userguide/security.html)
  + [IAM 安全最佳实践](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)

访问生产数据和资源时，安全性是重中之重。始终遵循最佳实践、实施最低权限访问控制，并定期审查和更新您的安全措施。

## 操作说明
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-epics"></a>

### 从 Amazon Redshift 查询数据
<a name="query-data-from-amazon-redshift"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 为 Amazon Redshift 集群创建一个密钥。 | 要为 Amazon Redshift 集群创建密钥，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 创建一个用于访问 Secrets Manager 的角色。 | 要创建此角色，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 

### 将数据上载到 Amazon S3
<a name="upload-data-to-s3"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建用于访问 S3 存储桶的角色 | 要创建用于访问 S3 存储桶的角色，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 创建此 Amazon Redshift 角色。 | 要创建 Amazon Redshift 角色，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 

### 部署 Lambda 函数
<a name="deploy-the-lam-function"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 Lambda 函数。 | 要在对等的 VPC 中部署 Lambda 函数，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 

### 测试架构
<a name="test-the-architecture"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 导入所需的资源。 | 要导入所需的资源，请运行以下命令：<pre>import ast<br />import boto3<br />import psycopg2<br />import base64<br />from botocore.exceptions import ClientError</pre> | 应用程序开发人员 | 
| 运行 Lambda 处理程序函数。 | Lambda 函数使用 AWS Security Token Service (AWS STS) 进行跨账户访问和临时凭证管理。该函数使用 AssumeRole API 操作来临时承担 `sm_read_role` IAM 角色的权限。要运行 Lambda 函数，请使用如下示例代码：<pre>def lambda_handler(event, context):<br />    sts_client = boto3.client('sts')<br /><br />    # Secrets Manager Configurations<br />    secret_name = "redshift_creds"<br />    sm_region = "eu-west-1"<br />    sm_read_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/SM-Read-Role"<br /><br />    # S3 Bucket Configurations<br />    s3_bucket_path = "s3://mybucket/"<br />    s3_bucket_region = "eu-west-1"<br />    s3_write_role = "arn:aws:iam::DEV_ACCOUNT_NUMBER:role/S3-Write-Role"<br /><br />    # Redshift Configurations<br />    sql_query = "select * from category"<br />    redshift_db = "dev"<br />    redshift_s3_write_role = "arn:aws:iam::PROD_ACCOUNT_NUMBER:role/CrossAccount-S3-Write-Role"<br /><br />    chained_s3_write_role = "%s,%s" % (redshift_s3_write_role, s3_write_role)<br /><br />    assumed_role_object = sts_client.assume_role(<br />        RoleArn=sm_read_role,<br />        RoleSessionName="CrossAccountRoleAssumption",<br />        ExternalId="YOUR_EXTERNAL_ID",<br />    )<br />    credentials = assumed_role_object['Credentials']<br /><br />    secret_dict = ast.literal_eval(get_secret(credentials, secret_name, sm_region))<br />    execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db)<br /><br />    return {<br />        'statusCode': 200<br />    }</pre> | 应用程序开发人员 | 
| 获取密钥。 | 要获取 Amazon Redshift 密钥，请使用如下示例代码：<pre>def get_secret(credentials, secret_name, sm_region):<br />    # Create a Secrets Manager client<br />    session = boto3.session.Session()<br />    sm_client = session.client(<br />        service_name='secretsmanager',<br />        aws_access_key_id=credentials['AccessKeyId'],<br />        aws_secret_access_key=credentials['SecretAccessKey'],<br />        aws_session_token=credentials['SessionToken'],<br />        region_name=sm_region<br />    )<br /><br />    try:<br />        get_secret_value_response = sm_client.get_secret_value(<br />            SecretId=secret_name<br />        )<br />    except ClientError as e:<br />        print(e)<br />        raise e<br />    else:<br />        if 'SecretString' in get_secret_value_response:<br />            return get_secret_value_response['SecretString']<br />        else:<br />            return base64.b64decode(get_secret_value_response['SecretBinary'])</pre> | 应用程序开发人员 | 
| 运行卸载命令。 | 要将数据卸载到 S3 存储桶，请使用如下示例代码。<pre>def execute_query(secret_dict, sql_query, s3_bucket_path, chained_s3_write_role, s3_bucket_region, redshift_db):<br />    conn_string = "dbname='%s' port='%s' user='%s' password='%s' host='%s'" \<br />                  % (redshift_db,<br />                     secret_dict["port"],<br />                     secret_dict["username"],<br />                     secret_dict["password"],<br />                     secret_dict["host"])<br /><br />    con = psycopg2.connect(conn_string)<br /><br />    unload_command = "UNLOAD ('{}') TO '{}' IAM_ROLE '{}' DELIMITER '|' REGION '{}';" \<br />        .format(sql_query,<br />                s3_bucket_path + str(datetime.datetime.now()) + ".csv",<br />                chained_s3_write_role,<br />                s3_bucket_region)<br /><br />    # Opening a cursor and run query<br />    cur = con.cursor()<br />    cur.execute(unload_command)<br /><br />    print(cur.fetchone())<br />    cur.close()<br />    con.close()</pre> | 应用程序开发人员 | 

### 清理
<a name="clean-up"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除 Lambda 函数。 | 为了避免产生计划外成本，请移除资源以及 DEV 账户与 PROD 账户之间的连接。要移除 Lambda 函数，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 移除 IAM 角色和策略。 | 从 DEV 账户和 PROD 账户中移除 IAM 角色和策略。在 DEV 账户中，执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html)在 PROD 账户中，执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 在 Secrets Manager 中删除密钥。 | 要删除密钥，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 移除 VPC 对等连接和安全组规则。 | 要移除 VPC 对等连接和安全组规则，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 从 S3 存储桶中移除数据。 | 要从 Amazon S3 中移除数据，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 清理 AWS KMS 钥匙。 | 如果您创建了任何用于加密的自定义 AWS KMS 密钥，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 
| 查看并删除 Amazon CloudWatch 日志。 | 要删除日 CloudWatch 志，请执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.html) | DevOps 工程师 | 

## 相关资源
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-resources"></a>
+ [亚马逊 CloudWatch 文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)
+ [IAM 文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)
+ [Lambda 文档](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)
+ [Amazon Redshift 文档](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html)
+ [Amazon S3 文档](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)
+ [AWS Secrets Manager 文档](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)
+ [AWS 安全原则](https://docs.aws.amazon.com/en_us/wellarchitected/2022-03-31/framework/sec-design.html)

## 附加信息
<a name="unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3-additional"></a>

将数据从 Amazon Redshift 卸载到 Amazon S3 之后，您可以使用 Amazon Athena 来分析这些数据。

[Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/getting-started.html) 是一项大数据查询服务，当您需要访问大量的数据时会非常有用。您无需预调配服务器或数据库，即可使用 Athena。Athena 支持复杂的查询，您可以在不同的对象上运行 Athena。

与大多数一样 AWS 服务，使用 Athena 的主要好处是，它在运行查询时提供了极大的灵活性，而不会增加复杂性。使用 Athena 时，无需更改数据类型，即可在 Amazon S3 中查询不同的数据类型，例如 CSV 和 JSON。您可以查询来自各种来源的数据，包括外部数据 AWS。Athena 降低了复杂性，因为您不必管理服务器。Athena 直接从 Amazon S3 读取数据，而无需在您运行查询之前加载或更改数据。

# 按照工作负载分类的数据库迁移模式
<a name="databases-database-migration-patterns-by-workload-pattern-list"></a>

**Topics**
+ [IBM](databases-database-migration-patterns-by-workload-ibm-pattern-list.md)
+ [Microsoft](databases-database-migration-patterns-by-workload-microsoft-pattern-list.md)
+ [不适用](databases-database-migration-patterns-by-workload-notapplicable-pattern-list.md)
+ [开源](databases-database-migration-patterns-by-workload-open-source-pattern-list.md)
+ [Oracle](databases-database-migration-patterns-by-workload-oracle-pattern-list.md)
+ [SAP](databases-database-migration-patterns-by-workload-sap-pattern-list.md)

# IBM
<a name="databases-database-migration-patterns-by-workload-ibm-pattern-list"></a>

**Topics**
+ [使用 AWS DMS 将 Db2 数据库从亚马逊迁移 EC2 到兼容 Aurora MySQL](migrate-a-db2-database-from-amazon-ec2-to-aurora-mysql-compatible-by-using-aws-dms.md)
+ [使用日志传送将适用于 LUW 的 Db2 迁移 EC2 到 Amazon 以减少中断时间](migrate-db2-for-luw-to-amazon-ec2-by-using-log-shipping-to-reduce-outage-time.md)
+ [通过高可用性灾难恢复将 Db2 for LUW 迁移到 Amazon EC2](migrate-db2-for-luw-to-amazon-ec2-with-high-availability-disaster-recovery.md)
+ [使用 AWS DMS 和 AWS SCT 从亚马逊上的 IBM Db2 迁移 EC2 到兼容 Aurora PostgreSQL](migrate-from-ibm-db2-on-amazon-ec2-to-aurora-postgresql-compatible-using-aws-dms-and-aws-sct.md)
+ [在 Amazon 上从 IBM WebSphere 应用程序服务器迁移到 Apache Tomcat EC2](migrate-from-ibm-websphere-application-server-to-apache-tomcat-on-amazon-ec2.md)
+ [将数据从 IBM Db2、SAP、Sybase 和其他数据库流式传输到 MongoDB Atlas AWS](stream-data-from-ibm-db2-to-mongodb-atlas.md)

# Microsoft
<a name="databases-database-migration-patterns-by-workload-microsoft-pattern-list"></a>

**Topics**
+ [加速 Microsoft 工作负载的发现以及向 AWS 的迁移](accelerate-the-discovery-and-migration-of-microsoft-workloads-to-aws.md)
+ [使用链接服务器从亚马逊 EC2 上的微软 SQL Server 访问本地微软 SQL Server 表](access-on-premises-microsoft-sql-server-tables-from-microsoft-sql-server-on-amazon-ec2-using-linked-servers.md)
+ [评测将 SQL Server 数据库迁移至 MongoDB Atlas on AWS 的查询性能](assess-query-performance-for-migrating-sql-server-databases-to-mongodb-atlas-on-aws.md)
+ [使用 AWS Lambda 任务计划程序在亚马逊 EC2 上运行的 SQL Server Express 版中自动执行数据库任务](automate-database-tasks-in-sql-server-express-edition-running-on-amazon-ec2.md)
+ [更改 Python 和 Perl 应用程序以支持数据库从Microsoft SQL Server 迁移至兼容 Amazon Aurora PostgreSQL 的版本](change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.md)
+ [在 AWS 上的 SQL Server 的“始终打开”可用性组中配置只读路由](configure-read-only-routing-in-an-always-on-availability-group-in-sql-server-on-aws.md)
+ [使用为适用于微软 SQL Server 的亚马逊 RDS 配置 Windows 身份验证 AWS Managed Microsoft AD](configure-windows-authentication-for-amazon-rds-using-microsoft-ad.md)
+ [使用微软 Excel 和 Python 为 AWS DMS 任务创建 AWS CloudFormation 模板](create-aws-cloudformation-templates-for-aws-dms-tasks-using-microsoft-excel-and-python.md)
+ [使用 Terraform 在亚马逊 EC2 和亚马逊 FSx 上部署 SQL Server 故障转移集群实例](deploy-sql-server-failover-cluster-instances-on-amazon-ec2-and-amazon-fsx.md)
+ [使用 AWS DMS 将 Microsoft SQL Server 数据库导出至 Amazon S3](export-a-microsoft-sql-server-database-to-amazon-s3-by-using-aws-dms.md)
+ [使用 AWS DMS 将 Amazon RDS for SQL Server 表导出至 S3 存储桶](export-amazon-rds-for-sql-server-tables-to-an-s3-bucket-by-using-aws-dms.md)
+ [从 SQL Server 迁移到 PostgreSQL 时，对 PII 数据实施 SHA1 哈希处理](implement-sha1-hashing-for-pii-data-when-migrating-from-sql-server-to-postgresql.md)
+ [将 EC2 Windows 实例提取并迁移到 AWS Managed Services 账户](ingest-and-migrate-ec2-windows-instances-into-an-aws-managed-services-account.md)
+ [EC2 使用 FSx 适用于 Windows 文件服务器的亚马逊上设置微软 SQL Server 故障转移群集](microsoft-sql-failover-cluster-on-amazon-ec2.md)
+ [将消息队列从 Microsoft Azure 服务总线迁移到 Amazon SQS](migrate-a-messaging-queue-from-microsoft-azure-service-bus-to-amazon-sqs.md)
+ [使用 AWS DMS 将微软 SQL Server 数据库从亚马逊迁移 EC2 到亚马逊 DocumentDB](migrate-a-microsoft-sql-server-database-from-amazon-ec2-to-amazon-documentdb-by-using-aws-dms.md)
+ [使用 AWS DMS 和 AWS SCT 将 Microsoft SQL Server 数据库迁移到 Aurora MySQL](migrate-a-microsoft-sql-server-database-to-aurora-mysql-by-using-aws-dms-and-aws-sct.md)
+ [将 .NET 应用程序从 Microsoft Azure 应用服务迁移到 AWS Elastic Beanstalk](migrate-a-net-application-from-microsoft-azure-app-service-to-aws-elastic-beanstalk.md)
+ [将本地微软 SQL Server 数据库迁移到亚马逊 EC2](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-ec2.md)
+ [将本地 Microsoft SQL Server 数据库迁移至 Amazon RDS for SQL Server](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-rds-for-sql-server.md)
+ [使用链接服务器将本地 Microsoft SQL Server 数据库迁移至 Amazon RDS for SQL Server](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-rds-for-sql-server-using-linked-servers.md)
+ [使用本机备份和还原将本地 Microsoft SQL Server 数据库迁移到 Amazon RDS for SQL Server。](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-rds-for-sql-server-using-native-backup-and-restore-methods.md)
+ [使用 AWS DMS 将本地 Microsoft SQL Server 数据库迁移至 Amazon Redshift](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-redshift-using-aws-dms.md)
+ [使用 AWS SCT 数据提取代理将本地 Microsoft SQL Server 数据库迁移至 Amazon Redshift](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.md)
+ [将本地微软 SQL Server 数据库迁移到 EC2 运行 Linux 的亚马逊上的微软 SQL Server](migrate-an-on-premises-microsoft-sql-server-database-to-microsoft-sql-server-on-amazon-ec2-running-linux.md)
+ [使用 Rclone 将数据从 Microsoft Azure Blob 迁移至 Amazon S3](migrate-data-from-microsoft-azure-blob-to-amazon-s3-by-using-rclone.md)
+ [使用 appcmd.exe 将 IIS 托管的应用程序迁移 EC2 到亚马逊](migrate-iis-hosted-applications-to-amazon-ec2-by-using-appcmd.md)
+ [使用迁移微软 SQL Server Always On 可用性组 AWS Application Migration Service](migrate-microsoft-sql-server-always-on-group-using-mgn.md)
+ [EC2 使用应用程序迁移服务将本地 Microsoft SQL Server 数据库迁移到亚马逊](migrate-microsoft-sql-server-to-amazon-ec2-using-aws-mgn.md)
+ [将关系数据库迁移到 MongoDB Atlas AWS](migrate-relational-database-to-mongodb-atlas.md)
+ [使用分布式可用性组将 SQL Server 迁移至 AWS](migrate-sql-server-to-aws-using-distributed-availability-groups.md)
+ [使用 ACM 将 Windows SSL 凭证迁移到应用程序负载均衡器](migrate-windows-ssl-certificates-to-an-application-load-balancer-using-acm.md)
+ [在 Amazon Web Services Cloud 中重新托管本地工作负载：迁移核对清单](rehost-on-premises-workloads-in-the-aws-cloud-migration-checklist.md)
+ [解决将 Microsoft SQL Server 迁移至 Amazon Web Services Cloud 后出现的连接错误](resolve-connection-errors-after-migrating-microsoft-sql-server-to-the-aws-cloud.md)
+ [使用本地 SMTP 服务器和数据库邮件发送 Amazon RDS for SQL Server 数据库实例通知](send-notifications-for-an-amazon-rds-for-sql-server-database-instance-by-using-an-on-premises-smtp-server-and-database-mail.md)
+ [使用 Terraform 为数据库迁移设置 CI/CD 管道](set-up-ci-cd-pipeline-for-db-migration-with-terraform.md)
+ [使用 Amazon 为 SQL Server Always On FCI 设置多可用区基础架构 FSx](set-up-multi-az-infrastructure-for-a-sql-server-always-on-fci-by-using-amazon-fsx.md)

# 不适用
<a name="databases-database-migration-patterns-by-workload-notapplicable-pattern-list"></a>

**Topics**
+ [在重新托管迁移到的过程中，为防火墙请求创建批准流程 AWS](create-an-approval-process-for-firewall-requests-during-a-rehost-migration-to-aws.md)
+ [加密现有 Amazon RDS for PostgreSQL 数据库实例](encrypt-an-existing-amazon-rds-for-postgresql-db-instance.md)
+ [估算 Amazon DynamoDB 表的存储成本](estimate-storage-costs-for-an-amazon-dynamodb-table.md)
+ [通过 AWS DMS 和 Amazon Aurora 实施跨区域灾难恢复](implement-cross-region-disaster-recovery-with-aws-dms-and-amazon-aurora.md)

# 开源
<a name="databases-database-migration-patterns-by-workload-open-source-pattern-list"></a>

**Topics**
+ [使用 Python 应用程序为 Amazon DynamoDB 自动生成 PynamoDB 模型和 CRUD 函数](automatically-generate-a-pynamodb-model-and-crud-functions-for-amazon-dynamodb-by-using-a-python-application.md)
+ [在 pgAdmin 中使用 SSH 隧道进行连接](connect-by-using-an-ssh-tunnel-in-pgadmin.md)
+ [在 Aurora PostgreSQL 兼容中创建应用程序用户和角色](create-application-users-and-roles-in-aurora-postgresql-compatible.md)
+ [在 Amazon RDS 中为 PostgreSQL 数据库实例启用加密连接](enable-encrypted-connections-for-postgresql-db-instances-in-amazon-rds.md)
+ [使用并使用和，将 Amazon RDS for Oracle 迁移到适用于 PostgreSQL AWS SCT 的 Amazon RDS AWS DMS AWS CLI CloudFormation](migrate-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-with-aws-sct-and-aws-dms-using-aws-cli-and-aws-cloudformation.md)
+ [使用原生工具将本地 MariaDB 数据库迁移至 Amazon RDS for MariaDB](migrate-an-on-premises-mariadb-database-to-amazon-rds-for-mariadb-using-native-tools.md)
+ [将本地 MySQL 数据库迁移至 Amazon EC2](migrate-an-on-premises-mysql-database-to-amazon-ec2.md)
+ [将本地 MySQL 数据库迁移至 Amazon RDS for MySQL](migrate-an-on-premises-mysql-database-to-amazon-rds-for-mysql.md)
+ [将本地 MySQL 数据库迁移至 Aurora MySQL](migrate-an-on-premises-mysql-database-to-aurora-mysql.md)
+ [将本地 PostgreSQL 数据库迁移到 Aurora PostgreSQL](migrate-an-on-premises-postgresql-database-to-aurora-postgresql.md)
+ [将 Couchbase 服务器数据库迁移到亚马逊 EC2](migrate-couchbase-server-ec2.md)
+ [使用 Auto Scaling 从 IBM WebSphere 应用程序服务器迁移到亚马逊 EC2 上的 Apache Tomcat](migrate-from-ibm-websphere-application-server-to-apache-tomcat-on-amazon-ec2-with-auto-scaling.md)
+ [使用和 A SharePlex WS DMS 从 Oracle 8i 或 9i 迁移到 Amazon RDS for Oracle](migrate-from-oracle-8i-or-9i-to-amazon-rds-for-oracle-using-shareplex-and-aws-dms.md)
+ [使用 pglogical 从 EC2 亚马逊上的 PostgreSQL 迁移到适用于 PostgreSQL 的亚马逊 RDS](migrate-from-postgresql-on-amazon-ec2-to-amazon-rds-for-postgresql-using-pglogical.md)
+ [使用 AWS App2Container 将本地 Java 应用程序迁移到 AWS](migrate-on-premises-java-applications-to-aws-using-aws-app2container.md)
+ [使用 Percona、A XtraBackup mazon EFS 和 Amazon S3 将本地 MySQL 数据库迁移到 Aurora MySQL](migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3.md)
+ [将 Oracle 外部表迁移到 Amazon Aurora PostgreSQL-Compatible](migrate-oracle-external-tables-to-amazon-aurora-postgresql-compatible.md)
+ [将含有 100 多个参数的 Oracle 函数和过程迁移到 PostgreSQL](migrate-oracle-functions-and-procedures-that-have-more-than-100-arguments-to-postgresql.md)
+ [将 Redis 工作负载迁移至 Redis Enterprise Cloud on AWS](migrate-redis-workloads-to-redis-enterprise-cloud-on-aws.md)
+ [监控 Amazon Aurora 以查找未加密的实例](monitor-amazon-aurora-for-instances-without-encryption.md)
+ [重启 RHEL 源服务器 SELinux 后，无需禁用 AWS 复制代理即可自动重启 AWS 复制代理](restart-the-aws-replication-agent-automatically-without-disabling-selinux-after-rebooting-a-rhel-source-server.md)
+ [使用 Lambda 和 Secrets Manager 计划适用于 Amazon RDS for PostgreSQL 和 Aurora PostgreSQL 的任务](schedule-jobs-for-amazon-rds-for-postgresql-and-aurora-postgresql-by-using-lambda-and-secrets-manager.md)
+ [使用 pg\$1transport 在两个 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库](transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport.md)
+ [将不同账户中的 Amazon Redshift 集群中的数据卸载到 Amazon S3](unload-data-from-amazon-redshift-cross-accounts-to-amazon-s3.md)

# Oracle
<a name="databases-database-migration-patterns-by-workload-oracle-pattern-list"></a>

**Topics**
+ [使用只读副本 PeopleSoft 在 Amazon RDS Custom 上将 HA 添加到 Oracle](add-ha-to-oracle-peoplesoft-on-amazon-rds-custom-by-using-a-read-replica.md)
+ [将 JSON Oracle 查询转换至 PostgreSQL 数据库 SQL](convert-json-oracle-queries-into-postgresql-database-sql.md)
+ [将 Oracle 的 VARCHAR2 (1) 种数据类型转换为亚马逊 Aurora PostgreSQL 的布尔数据类型](convert-varchar2-1-data-type-for-oracle-to-boolean-data-type-for-amazon-aurora-postgresql.md)
+ [通过使用兼容 PostgreSQL 的 Aurora 全局数据库来模拟 Oracle 灾难恢复](emulate-oracle-dr-by-using-a-postgresql-compatible-aurora-global-database.md)
+ [在 Amazon Aurora PostgreSQL 中模拟 Oracle PL/SQL 关联数组和适用于 PostgreSQL 的亚马逊 RDS](emulate-oracle-plsql-associative-arrays-in-aurora-and-rds-postgresql.md)
+ [使用 AWR 报告估计 Oracle 数据库的 Amazon RDS 引擎大小](estimate-the-amazon-rds-engine-size-for-an-oracle-database-by-using-awr-reports.md)
+ [在 Aurora PostgreSQL 中处理动态 SQL 语句中的匿名块](handle-anonymous-blocks-in-dynamic-sql-statements-in-aurora-postgresql.md)
+ [使用 Oracle SQL Developer 和 AWS SCT 以增量方式从 Amazon RDS for Oracle 迁移至 Amazon RDS for PostgreSQL](incrementally-migrate-from-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-using-oracle-sql-developer-and-aws-sct.md)
+ [使用兼容 Aurora PostgreSQL 的文件编码将 BLOB 文件加载至文本中](load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible.md)
+ [使用 AWS DMS 在 SSL 模式下将 Amazon RDS for Oracle 迁移到 Amazon RDS for PostgreSQL](migrate-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-in-ssl-mode-by-using-aws-dms.md)
+ [将 Amazon RDS for Oracle 数据库迁移到另一个 AWS 区域 数据库 AWS 账户 并 AWS DMS 用于持续复制](migrate-an-amazon-rds-for-oracle-database-to-another-aws-account-and-aws-region-using-aws-dms-for-ongoing-replication.md)
+ [使用 Oracle 数据泵将本地 Oracle 数据库迁移到亚马逊 EC2](migrate-an-on-premises-oracle-database-to-amazon-ec2-by-using-oracle-data-pump.md)
+ [使用 Logstash 将本地 Oracle 数据库迁移到亚马逊 OpenSearch 服务](migrate-an-on-premises-oracle-database-to-amazon-opensearch-service-using-logstash.md)
+ [使用 AWS DMS 和 AWS SCT 将本地 Oracle 数据库迁移至 Amazon RDS for MySQL](migrate-an-on-premises-oracle-database-to-amazon-rds-for-mysql-using-aws-dms-and-aws-sct.md)
+ [将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle.md)
+ [使用通过数据库链接直接导入 Oracle Data Pump 将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-by-using-direct-oracle-data-pump-import-over-a-database-link.md)
+ [使用 Oracle 数据泵将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump.md)
+ [使用 Oracle Bystander 和 AWS DMS 将本地 Oracle 数据库迁移到 Amazon RDS for PostgreSQL](migrate-an-on-premises-oracle-database-to-amazon-rds-for-postgresql-by-using-an-oracle-bystander-and-aws-dms.md)
+ [将本地 Oracle 数据库迁移到亚马逊上的 Oracle EC2](migrate-an-on-premises-oracle-database-to-oracle-on-amazon-ec2.md)
+ [使用 AWS DMS 和 AWS SCT 将 Oracle 数据库从亚马逊迁移 EC2 到适用于 MariaDB 的亚马逊 RDS](migrate-an-oracle-database-from-amazon-ec2-to-amazon-rds-for-mariadb-using-aws-dms-and-aws-sct.md)
+ [使用 AWS DMS 将 Oracle 数据库从亚马逊迁移 EC2 到 Amazon RDS for Oracle](migrate-an-oracle-database-from-amazon-ec2-to-amazon-rds-for-oracle-using-aws-dms.md)
+ [使用 AWS DMS 将 Oracle 数据库迁移至 Amazon DynamoDB](migrate-an-oracle-database-to-amazon-dynamodb-using-aws-dms.md)
+ [使用 Oracle GoldenGate 平面文件适配器将 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-oracle-database-to-amazon-rds-for-oracle-by-using-oracle-goldengate-flat-file-adapters.md)
+ [使用 AWS DMS 和 AWS SCT 将 Oracle 数据库迁移至 Amazon Redshift](migrate-an-oracle-database-to-amazon-redshift-using-aws-dms-and-aws-sct.md)
+ [使用 AWS DMS 和 AWS SCT 将 Oracle 数据库迁移至 Aurora PostgreSQL](migrate-an-oracle-database-to-aurora-postgresql-using-aws-dms-and-aws-sct.md)
+ [使用 Oracle 数据泵和 AWS DMS 将 Oracle JD Edwards EnterpriseOne 数据库迁移到 AWS](migrate-an-oracle-jd-edwards-enterpriseone-database-to-aws-by-using-oracle-data-pump-and-aws-dms.md)
+ [使用 AWS DMS 将 Oracle 分区表迁移到 PostgreSQL](migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms.md)
+ [使用 AWS DMS 将 Oracle PeopleSoft 数据库迁移到 AWS](migrate-an-oracle-peoplesoft-database-to-aws-by-using-aws-dms.md)
+ [将数据从本地 Oracle 数据库迁移到 Aurora PostgreSQL](migrate-data-from-an-on-premises-oracle-database-to-aurora-postgresql.md)
+ [从 Amazon RDS for Oracle 迁移到 Amazon RDS for MySQL](migrate-from-amazon-rds-for-oracle-to-amazon-rds-for-mysql.md)
+ [使用实体化视图和 AWS DMS 从 Oracle 8i 或 9i 迁移至 Amazon RDS for PostgreSQL](migrate-from-oracle-8i-or-9i-to-amazon-rds-for-postgresql-using-materialized-views-and-aws-dms.md)
+ [使用和 AWS DMS 从 Oracle 8i 或 9i 迁移到适用于 SharePlex PostgreSQL 的亚马逊 RDS](migrate-from-oracle-8i-or-9i-to-amazon-rds-for-postgresql-using-shareplex-and-aws-dms.md)
+ [使用 Oracle 从 Oracle 数据库迁移到 Amazon RDS for PostgreSQL GoldenGate](migrate-from-oracle-database-to-amazon-rds-for-postgresql-by-using-oracle-goldengate.md)
+ [使用 AWS DMS 和 AWS SCT 从 Amazon EC2 上的 Oracle 迁移至 Amazon RDS for MySQL](migrate-from-oracle-on-amazon-ec2-to-amazon-rds-for-mysql-using-aws-dms-and-aws-sct.md)
+ [在 Amazon ECS 上从 Oracle 迁移 WebLogic 到 Apache Tomcat (ToMee)](migrate-from-oracle-weblogic-to-apache-tomcat-tomee-on-amazon-ecs.md)
+ [将基于函数的索引从 Oracle 迁移到 PostgreSQL](migrate-function-based-indexes-from-oracle-to-postgresql.md)
+ [将遗留应用程序从 Oracle Pro\$1C 迁移到 ECPG](migrate-legacy-applications-from-oracle-pro-c-to-ecpg.md)
+ [将 Oracle CLOB 值迁移到 AWS 上 PostgreSQL 中的单独的行](migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws.md)
+ [将 Oracle 数据库错误代码迁移到 Amazon Aurora PostgreSQL-Compatible 数据库](migrate-oracle-database-error-codes-to-an-amazon-aurora-postgresql-compatible-database.md)
+ [使用扩展将 Oracle 原生函数迁移到 PostgreSQL](migrate-oracle-native-functions-to-postgresql-using-extensions.md)
+ [将 Oracle 迁移 PeopleSoft 到亚马逊 RDS 定制版](migrate-oracle-peoplesoft-to-amazon-rds-custom.md)
+ [将 Oracle ROWID 功能迁移到 AWS 上的 PostgreSQL](migrate-oracle-rowid-functionality-to-postgresql-on-aws.md)
+ [将 Oracle SERIALLY\$1REUSABLE pragma 包迁移至 PostgreSQL](migrate-oracle-serially-reusable-pragma-packages-into-postgresql.md)
+ [将虚拟生成的列从 Oracle 迁移至 PostgreSQL](migrate-virtual-generated-columns-from-oracle-to-postgresql.md)
+ [使用亚马逊监控 Oracle GoldenGate 日志 CloudWatch](monitor-oracle-goldengate-logs-by-using-amazon-cloudwatch.md)
+ [分析对象依赖关系以将部分数据库数据从 Oracle 迁移到 PostgreSQL](multilevel-object-analysis-for-database-migration-from-oracle-to-postgresql.md)
+ [从 Oracle Database Enterprise Edition 更换平台到 Amazon RDS for Oracle 上的 Standard Edition 2。](replatform-oracle-database-enterprise-edition-to-standard-edition-2-on-amazon-rds-for-oracle.md)
+ [在 Amazon RDS Custom 上为 Oracle 电子商务套件设置 HA/DR 架构，并使用活动备用数据库](set-up-an-ha-dr-architecture-for-oracle-e-business-suite-on-amazon-rds-custom-with-an-active-standby-database.md)
+ [在 Aurora PostgreSQL-Compatible 上设置 Oracle UTL\$1FILE 功能](set-up-oracle-utl_file-functionality-on-aurora-postgresql-compatible.md)
+ [在 Amazon RDS 上为 Oracle PeopleSoft 应用程序过渡角色适用于 Oracle 定制](transition-roles-for-an-oracle-peoplesoft-application-on-amazon-rds-custom-for-oracle.md)
+ [从 Oracle 迁移至 Amazon Aurora PostgreSQL 后验证数据库对象](validate-database-objects-after-migrating-from-oracle-to-amazon-aurora-postgresql.md)

# SAP
<a name="databases-database-migration-patterns-by-workload-sap-pattern-list"></a>

**Topics**
+ [使用 Systems Manager 自动备份 SAP HANA 数据库和 EventBridge](automatically-back-up-sap-hana-databases-using-systems-manager-and-eventbridge.md)
+ [使用 AWS DMS 从 SAP ASE 迁移至 Amazon RDS for SQL Server](migrate-from-sap-ase-to-amazon-rds-for-sql-server-using-aws-dms.md)
+ [使用 AWS SCT 和 AWS DMS EC2 将亚马逊上的 SAP ASE 迁移到兼容 Aurora PostgreSQL 的亚马逊 Aurora](migrate-sap-ase-on-amazon-ec2-to-amazon-aurora-postgresql-compatible-using-aws-sct-and-aws-dms.md)
+ [使用具有相同主机名的 SAP HSR 将 SAP HANA 迁移至 AWS](migrate-sap-hana-to-aws-using-sap-hsr-with-the-same-hostname.md)
+ [在 IBM Db2 on AWS 上为 SAP 设置灾难恢复](set-up-disaster-recovery-for-sap-on-ibm-db2-on-aws.md)

# 更多模式
<a name="databases-more-patterns-pattern-list"></a>

**Topics**
+ [从 Amazon EKS 容器访问 Amazon Neptune 数据库](access-amazon-neptune-database-from-amazon-eks-container.md)
+ [使用 Athena 访问、查询和联接 Amazon DynamoDB 表](access-query-and-join-amazon-dynamodb-tables-using-athena.md)
+ [允许 EC2 实例在 AMS 账户中写入对 S3 存储桶的访问权限](allow-ec2-instances-write-access-to-s3-buckets-in-ams-accounts.md)
+ [使用 Amazon Athena 和 Amazon Quick Sight 分析和可视化嵌套的 JSON 数据](analyze-and-visualize-nested-json-data-with-amazon-athena-and-amazon-quicksight.md)
+ [使用 AWS Batch 自动备份 Amazon RDS for PostgreSQL 数据库实例](automate-backups-for-amazon-rds-for-postgresql-db-instances-by-using-aws-batch.md)
+ [使用 DynamoDB TTL 自动将项目归档到 Amazon S3](automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.md)
+ [自动修复未加密的 Amazon RDS 数据库实例和集群](automatically-remediate-unencrypted-amazon-rds-db-instances-and-clusters.md)
+ [使用 AWS Systems Manager 维护窗口自动停止和启动 Amazon RDS 数据库实例](automatically-stop-and-start-an-amazon-rds-db-instance-using-aws-systems-manager-maintenance-windows.md)
+ [建造一个包含 MongoDB Atlas 的 AWS 着陆区](build-aws-landing-zone-that-includes-mongodb-atlas.md)
+ [使用和构建 COBOL Db2 程序 AWS Mainframe Modernization AWS CodeBuild](build-cobol-db2-programs-mainframe-modernization-codebuild.md)
+ [使用 Amazon 构建企业数据网格 DataZone AWS CDK，以及 AWS CloudFormation](build-enterprise-data-mesh-amazon-data-zone.md)
+ [更改 Python 和 Perl 应用程序以支持数据库从Microsoft SQL Server 迁移至兼容 Amazon Aurora PostgreSQL 的版本](change-python-and-perl-applications-to-support-database-migration-from-microsoft-sql-server-to-amazon-aurora-postgresql-compatible-edition.md)
+ [使用 Python 在 AWS 上将 EBCDIC 数据转换并解压为 ASCII](convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.md)
+ [将 Teradata 标准化时态功能转换为 Amazon Redshift SQL](convert-the-teradata-normalize-temporal-feature-to-amazon-redshift-sql.md)
+ [将 Teradata RESET WHEN 功能转换为 Amazon Redshift SQL](convert-the-teradata-reset-when-feature-to-amazon-redshift-sql.md)
+ [将 Oracle 的 VARCHAR2 (1) 种数据类型转换为亚马逊 Aurora PostgreSQL 的布尔数据类型](convert-varchar2-1-data-type-for-oracle-to-boolean-data-type-for-amazon-aurora-postgresql.md)
+ [在 Aurora PostgreSQL 兼容中创建应用程序用户和角色](create-application-users-and-roles-in-aurora-postgresql-compatible.md)
+ [使用微软 Excel 和 Python 为 AWS DMS 任务创建 AWS CloudFormation 模板](create-aws-cloudformation-templates-for-aws-dms-tasks-using-microsoft-excel-and-python.md)
+ [使用 Kinesis Data Streams 和 Firehose 将 DynamoDB 记录传送到亚马逊 S3 AWS CDK](deliver-dynamodb-records-to-amazon-s3-using-kinesis-data-streams-and-amazon-data-firehose-with-aws-cdk.md)
+ [使用私有静态在 Amazon EC2 上部署 Cassandra 集群 IPs 以避免重新平衡](deploy-a-cassandra-cluster-on-amazon-ec2-with-private-static-ips-to-avoid-rebalancing.md)
+ [使用 Terraform 在亚马逊 EKS 中部署 CockroachDB 集群](deploy-cockroachdb-on-eks-using-terraform.md)
+ [使用 RAG 和提示开发基于人工智能聊天的高级生成式 AI 助手 ReAct](develop-advanced-generative-ai-chat-based-assistants-by-using-rag-and-react-prompting.md)
+ [通过使用兼容 PostgreSQL 的 Aurora 全局数据库来模拟 Oracle 灾难恢复](emulate-oracle-dr-by-using-a-postgresql-compatible-aurora-global-database.md)
+ [允许将 DB2 日志直接存档到 IBM Db2 数据库中的 Amazon S3](enable-db2-logarchive-directly-to-amazon-s3-in-ibm-db2-database.md)
+ [在 Amazon RDS for SQL Server 中启用透明数据加密](enable-transparent-data-encryption-in-amazon-rds-for-sql-server.md)
+ [使用 AWS DMS 将 Microsoft SQL Server 数据库导出至 Amazon S3](export-a-microsoft-sql-server-database-to-amazon-s3-by-using-aws-dms.md)
+ [从 SQL Server 迁移到 PostgreSQL 时，对 PII 数据实施 SHA1 哈希处理](implement-sha1-hashing-for-pii-data-when-migrating-from-sql-server-to-postgresql.md)
+ [使用 Oracle SQL Developer 和 AWS SCT 以增量方式从 Amazon RDS for Oracle 迁移至 Amazon RDS for PostgreSQL](incrementally-migrate-from-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-using-oracle-sql-developer-and-aws-sct.md)
+ [使用兼容 Aurora PostgreSQL 的文件编码将 BLOB 文件加载至文本中](load-blob-files-into-text-by-using-file-encoding-in-aurora-postgresql-compatible.md)
+ [使用 AWS Secrets Manager 管理凭证](manage-credentials-using-aws-secrets-manager.md)
+ [使用 AWS DMS 将 Db2 数据库从亚马逊迁移 EC2 到兼容 Aurora MySQL](migrate-a-db2-database-from-amazon-ec2-to-aurora-mysql-compatible-by-using-aws-dms.md)
+ [使用 AWS DMS 将微软 SQL Server 数据库从亚马逊迁移 EC2 到亚马逊 DocumentDB](migrate-a-microsoft-sql-server-database-from-amazon-ec2-to-amazon-documentdb-by-using-aws-dms.md)
+ [使用 AWS DMS 和 AWS SCT 将 Microsoft SQL Server 数据库迁移到 Aurora MySQL](migrate-a-microsoft-sql-server-database-to-aurora-mysql-by-using-aws-dms-and-aws-sct.md)
+ [使用 AWS DMS 在 SSL 模式下将 Amazon RDS for Oracle 迁移到 Amazon RDS for PostgreSQL](migrate-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-in-ssl-mode-by-using-aws-dms.md)
+ [使用并使用和，将 Amazon RDS for Oracle 迁移到适用于 PostgreSQL AWS SCT 的 Amazon RDS AWS DMS AWS CLI CloudFormation](migrate-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-with-aws-sct-and-aws-dms-using-aws-cli-and-aws-cloudformation.md)
+ [将 Amazon RDS 数据库实例迁移到另一个 VPC 或账户](migrate-an-amazon-rds-db-instance-to-another-vpc-or-account.md)
+ [将 Amazon RDS for Oracle 数据库迁移到另一个 AWS 区域 数据库 AWS 账户 并 AWS DMS 用于持续复制](migrate-an-amazon-rds-for-oracle-database-to-another-aws-account-and-aws-region-using-aws-dms-for-ongoing-replication.md)
+ [将 Amazon Redshift 集群迁移至中国的 AWS 区域](migrate-an-amazon-redshift-cluster-to-an-aws-region-in-china.md)
+ [使用原生工具将本地 MariaDB 数据库迁移至 Amazon RDS for MariaDB](migrate-an-on-premises-mariadb-database-to-amazon-rds-for-mariadb-using-native-tools.md)
+ [将本地微软 SQL Server 数据库迁移到亚马逊 EC2](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-ec2.md)
+ [将本地 Microsoft SQL Server 数据库迁移至 Amazon RDS for SQL Server](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-rds-for-sql-server.md)
+ [使用链接服务器将本地 Microsoft SQL Server 数据库迁移至 Amazon RDS for SQL Server](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-rds-for-sql-server-using-linked-servers.md)
+ [使用本机备份和还原将本地 Microsoft SQL Server 数据库迁移到 Amazon RDS for SQL Server。](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-rds-for-sql-server-using-native-backup-and-restore-methods.md)
+ [使用 AWS DMS 将本地 Microsoft SQL Server 数据库迁移至 Amazon Redshift](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-redshift-using-aws-dms.md)
+ [使用 AWS SCT 数据提取代理将本地 Microsoft SQL Server 数据库迁移至 Amazon Redshift](migrate-an-on-premises-microsoft-sql-server-database-to-amazon-redshift-using-aws-sct-data-extraction-agents.md)
+ [将本地微软 SQL Server 数据库迁移到 EC2 运行 Linux 的亚马逊上的微软 SQL Server](migrate-an-on-premises-microsoft-sql-server-database-to-microsoft-sql-server-on-amazon-ec2-running-linux.md)
+ [将本地 MySQL 数据库迁移至 Amazon RDS for MySQL](migrate-an-on-premises-mysql-database-to-amazon-rds-for-mysql.md)
+ [将本地 MySQL 数据库迁移至 Aurora MySQL](migrate-an-on-premises-mysql-database-to-aurora-mysql.md)
+ [使用 Oracle 数据泵将本地 Oracle 数据库迁移到亚马逊 EC2](migrate-an-on-premises-oracle-database-to-amazon-ec2-by-using-oracle-data-pump.md)
+ [使用 Logstash 将本地 Oracle 数据库迁移到亚马逊 OpenSearch 服务](migrate-an-on-premises-oracle-database-to-amazon-opensearch-service-using-logstash.md)
+ [使用 AWS DMS 和 AWS SCT 将本地 Oracle 数据库迁移至 Amazon RDS for MySQL](migrate-an-on-premises-oracle-database-to-amazon-rds-for-mysql-using-aws-dms-and-aws-sct.md)
+ [将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle.md)
+ [使用通过数据库链接直接导入 Oracle Data Pump 将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-by-using-direct-oracle-data-pump-import-over-a-database-link.md)
+ [使用 Oracle 数据泵将本地 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-on-premises-oracle-database-to-amazon-rds-for-oracle-using-oracle-data-pump.md)
+ [使用 Oracle Bystander 和 AWS DMS 将本地 Oracle 数据库迁移到 Amazon RDS for PostgreSQL](migrate-an-on-premises-oracle-database-to-amazon-rds-for-postgresql-by-using-an-oracle-bystander-and-aws-dms.md)
+ [将本地 Oracle 数据库迁移到亚马逊上的 Oracle EC2](migrate-an-on-premises-oracle-database-to-oracle-on-amazon-ec2.md)
+ [将本地 PostgreSQL 数据库迁移到 Aurora PostgreSQL](migrate-an-on-premises-postgresql-database-to-aurora-postgresql.md)
+ [将本地 ThoughtSpot Falcon 数据库迁移到亚马逊 Redshift](migrate-an-on-premises-thoughtspot-falcon-database-to-amazon-redshift.md)
+ [使用 AWS DMS 和 AWS SCT 将 Oracle 数据库从亚马逊迁移 EC2 到适用于 MariaDB 的亚马逊 RDS](migrate-an-oracle-database-from-amazon-ec2-to-amazon-rds-for-mariadb-using-aws-dms-and-aws-sct.md)
+ [使用 AWS DMS 将 Oracle 数据库从亚马逊迁移 EC2 到 Amazon RDS for Oracle](migrate-an-oracle-database-from-amazon-ec2-to-amazon-rds-for-oracle-using-aws-dms.md)
+ [使用 Oracle GoldenGate 平面文件适配器将 Oracle 数据库迁移到 Amazon RDS for Oracle](migrate-an-oracle-database-to-amazon-rds-for-oracle-by-using-oracle-goldengate-flat-file-adapters.md)
+ [使用 AWS DMS 和 AWS SCT 将 Oracle 数据库迁移至 Amazon Redshift](migrate-an-oracle-database-to-amazon-redshift-using-aws-dms-and-aws-sct.md)
+ [使用 AWS DMS 和 AWS SCT 将 Oracle 数据库迁移至 Aurora PostgreSQL](migrate-an-oracle-database-to-aurora-postgresql-using-aws-dms-and-aws-sct.md)
+ [使用 Oracle 数据泵和 AWS DMS 将 Oracle JD Edwards EnterpriseOne 数据库迁移到 AWS](migrate-an-oracle-jd-edwards-enterpriseone-database-to-aws-by-using-oracle-data-pump-and-aws-dms.md)
+ [使用 AWS DMS 将 Oracle 分区表迁移到 PostgreSQL](migrate-an-oracle-partitioned-table-to-postgresql-by-using-aws-dms.md)
+ [使用 AWS DMS 将 Oracle PeopleSoft 数据库迁移到 AWS](migrate-an-oracle-peoplesoft-database-to-aws-by-using-aws-dms.md)
+ [将 Couchbase 服务器数据库迁移到亚马逊 EC2](migrate-couchbase-server-ec2.md)
+ [将数据从本地 Oracle 数据库迁移到 Aurora PostgreSQL](migrate-data-from-an-on-premises-oracle-database-to-aurora-postgresql.md)
+ [使用 Starburs AWS 云 t 将数据迁移到](migrate-data-to-the-aws-cloud-by-using-starburst.md)
+ [使用日志传送将适用于 LUW 的 Db2 迁移 EC2 到 Amazon 以减少中断时间](migrate-db2-for-luw-to-amazon-ec2-by-using-log-shipping-to-reduce-outage-time.md)
+ [通过高可用性灾难恢复将 Db2 for LUW 迁移到 Amazon EC2](migrate-db2-for-luw-to-amazon-ec2-with-high-availability-disaster-recovery.md)
+ [从 Amazon RDS for Oracle 迁移到 Amazon RDS for MySQL](migrate-from-amazon-rds-for-oracle-to-amazon-rds-for-mysql.md)
+ [从 Couchbase Server 迁移至 AWS 上的 Couchbase Capella](migrate-from-couchbase-server-to-couchbase-capella-on-aws.md)
+ [使用 AWS DMS 和 AWS SCT 从亚马逊上的 IBM Db2 迁移 EC2 到兼容 Aurora PostgreSQL](migrate-from-ibm-db2-on-amazon-ec2-to-aurora-postgresql-compatible-using-aws-dms-and-aws-sct.md)
+ [使用实体化视图和 AWS DMS 从 Oracle 8i 或 9i 迁移至 Amazon RDS for PostgreSQL](migrate-from-oracle-8i-or-9i-to-amazon-rds-for-postgresql-using-materialized-views-and-aws-dms.md)
+ [使用和 AWS DMS 从 Oracle 8i 或 9i 迁移到适用于 SharePlex PostgreSQL 的亚马逊 RDS](migrate-from-oracle-8i-or-9i-to-amazon-rds-for-postgresql-using-shareplex-and-aws-dms.md)
+ [使用 Oracle 从 Oracle 数据库迁移到 Amazon RDS for PostgreSQL GoldenGate](migrate-from-oracle-database-to-amazon-rds-for-postgresql-by-using-oracle-goldengate.md)
+ [使用 AWS DMS 和 AWS SCT 从 Amazon EC2 上的 Oracle 迁移至 Amazon RDS for MySQL](migrate-from-oracle-on-amazon-ec2-to-amazon-rds-for-mysql-using-aws-dms-and-aws-sct.md)
+ [使用 pglogical 从 EC2 亚马逊上的 PostgreSQL 迁移到适用于 PostgreSQL 的亚马逊 RDS](migrate-from-postgresql-on-amazon-ec2-to-amazon-rds-for-postgresql-using-pglogical.md)
+ [使用 AWS DMS 从 SAP ASE 迁移至 Amazon RDS for SQL Server](migrate-from-sap-ase-to-amazon-rds-for-sql-server-using-aws-dms.md)
+ [将基于函数的索引从 Oracle 迁移到 PostgreSQL](migrate-function-based-indexes-from-oracle-to-postgresql.md)
+ [将遗留应用程序从 Oracle Pro\$1C 迁移到 ECPG](migrate-legacy-applications-from-oracle-pro-c-to-ecpg.md)
+ [EC2 使用应用程序迁移服务将本地 Microsoft SQL Server 数据库迁移到亚马逊](migrate-microsoft-sql-server-to-amazon-ec2-using-aws-mgn.md)
+ [将本地 Cloudera 工作负载迁移到 Cloudera Data Platform on AWS](migrate-on-premises-cloudera-workloads-to-cloudera-data-platform-on-aws.md)
+ [使用 Percona、A XtraBackup mazon EFS 和 Amazon S3 将本地 MySQL 数据库迁移到 Aurora MySQL](migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3.md)
+ [将 Oracle 商业智能 12c 从本地服务器迁移到 Amazon Web Services Cloud](migrate-oracle-business-intelligence-12c-to-the-aws-cloud-from-on-premises-servers.md)
+ [将 Oracle CLOB 值迁移到 AWS 上 PostgreSQL 中的单独的行](migrate-oracle-clob-values-to-individual-rows-in-postgresql-on-aws.md)
+ [将 Oracle 数据库错误代码迁移到 Amazon Aurora PostgreSQL-Compatible 数据库](migrate-oracle-database-error-codes-to-an-amazon-aurora-postgresql-compatible-database.md)
+ [将 Oracle 外部表迁移到 Amazon Aurora PostgreSQL-Compatible](migrate-oracle-external-tables-to-amazon-aurora-postgresql-compatible.md)
+ [使用扩展将 Oracle 原生函数迁移到 PostgreSQL](migrate-oracle-native-functions-to-postgresql-using-extensions.md)
+ [将 Oracle 迁移 PeopleSoft 到亚马逊 RDS 定制版](migrate-oracle-peoplesoft-to-amazon-rds-custom.md)
+ [将 Oracle ROWID 功能迁移到 AWS 上的 PostgreSQL](migrate-oracle-rowid-functionality-to-postgresql-on-aws.md)
+ [将 Oracle SERIALLY\$1REUSABLE pragma 包迁移至 PostgreSQL](migrate-oracle-serially-reusable-pragma-packages-into-postgresql.md)
+ [使用 AWS SCT 和 AWS DMS EC2 将亚马逊上的 SAP ASE 迁移到兼容 Aurora PostgreSQL 的亚马逊 Aurora](migrate-sap-ase-on-amazon-ec2-to-amazon-aurora-postgresql-compatible-using-aws-sct-and-aws-dms.md)
+ [将虚拟生成的列从 Oracle 迁移至 PostgreSQL](migrate-virtual-generated-columns-from-oracle-to-postgresql.md)
+ [建立最小可行数据空间以在组织之间共享数据](minimum-viable-data-space-share-data-organizations.md)
+ [监控 Amazon ElastiCache 集群的静态加密](monitor-amazon-elasticache-clusters-for-at-rest-encryption.md)
+ [使用 Amazon Athena 通过 SQL 查询 Amazon DynamoDB 表](query-amazon-dynamodb-tables-sql-amazon-athena.md)
+ [使用可信上下文在 AWS 上的 Db2 联合身份验证数据库中保护和简化用户访问](secure-and-streamline-user-access-in-a-db2-federation-database-on-aws-by-using-trusted-contexts.md)
+ [在 AWS 上设置高度可用的 PeopleSoft 架构](set-up-a-highly-available-peoplesoft-architecture-on-aws.md)
+ [在 Aurora PostgreSQL-Compatible 上设置 Oracle UTL\$1FILE 功能](set-up-oracle-utl_file-functionality-on-aurora-postgresql-compatible.md)
+ [使用 PGO 简化 Amazon EKS 上的 PostgreSQL 部署](streamline-postgresql-deployments-amazon-eks-pgo.md)
+ [以 CSV 文件形式将大规模 Db2 z/OS 数据传输到亚马逊 S3](transfer-large-scale-db2-z-os-data-to-amazon-s3-in-csv-files.md)
+ [使用 pg\$1transport 在两个 Amazon RDS 数据库实例之间传输 PostgreSQL 数据库](transport-postgresql-databases-between-two-amazon-rds-db-instances-using-pg-transport.md)
+ [从 Oracle 迁移至 Amazon Aurora PostgreSQL 后验证数据库对象](validate-database-objects-after-migrating-from-oracle-to-amazon-aurora-postgresql.md)