

# Amazon RDS 零 ETL 集成
<a name="zero-etl"></a>

Amazon RDS 与 Amazon Redshift 和 Amazon SageMaker AI 的零 ETL 集成支持使用 RDS 中的数据进行近乎实时的分析和机器学习（ML）。这是一个完全托管式解决方案，用于在将事务数据写入 RDS 数据库后，使这些数据在分析目标中可用。*提取、转换*、*加载*（ETL）是将来自多个来源的数据合并到一个大型中央数据仓库的过程。

借助零 ETL 集成，RDS 数据库中的数据可在 Amazon Redshift 或 Amazon SageMaker AI 智能湖仓中以近乎实时的方式使用。一旦这些数据进入目标数据仓库或数据湖中，您就可以使用各种内置功能为分析、机器学习和人工智能工作负载提供支持，例如机器学习、实体化视图、数据共享、对多个数据存储和数据湖的联合访问，以及与 Amazon SageMaker AI、Quick 及其他 AWS 服务的集成。

要创建零 ETL 集成，您需要将 RDS 数据库指定为*源*，并将支持的数据仓库或智能湖仓指定为*目标*。该集成会将数据从源数据库复制到目标数据仓库或智能湖仓中。

下图展示了这项与 Amazon Redshift 进行零 ETL 集成的功能：

![\[零 ETL 集成\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/zero-etl-integrations.png)


下图展示了这项与 Amazon SageMaker AI 智能湖仓进行零 ETL 集成的功能：

![\[与 Amazon SageMaker AI 智能湖仓的零 ETL 集成\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/zero-etl-rds-lakehouse.png)


该集成还会监控数据管道的运行状况，并在可能的情况下从问题中恢复。您可以创建多个 RDS 数据库与单个目标数据仓库或智能湖仓的集成，从而使您能够获得跨多个应用程序的全面洞察。

**Topics**
+ [优势](#zero-etl.benefits)
+ [重要概念](#zero-etl.concepts)
+ [限制](#zero-etl.reqs-lims)
+ [配额](#zero-etl.quotas)
+ [支持的区域](#zero-etl.regions)
+ [开始使用 Amazon RDS 零 ETL 集成](zero-etl.setting-up.md)
+ [创建 Amazon RDS 与 Amazon Redshift 的零 ETL 集成](zero-etl.creating.md)
+ [创建 Amazon RDS 与 Amazon SageMaker 智能湖仓的零 ETL 集成](zero-etl.creating-smlh.md)
+ [Amazon RDS 零 ETL 集成的数据筛选](zero-etl.filtering.md)
+ [向源 RDS 数据库中添加数据并查询数据](zero-etl.querying.md)
+ [查看和监控 Amazon RDS 零 ETL 集成](zero-etl.describingmonitoring.md)
+ [修改 Amazon RDS 零 ETL 集成](zero-etl.modifying.md)
+ [删除 Amazon RDS 零 ETL 集成](zero-etl.deleting.md)
+ [Amazon RDS 零 ETL 集成故障排除](zero-etl.troubleshooting.md)

## 优势
<a name="zero-etl.benefits"></a>

RDS 零 ETL 集成具有以下好处：
+ 帮助您从多个数据来源获得整体见解。
+ 无需构建和维护执行提取、转换、加载（ETL）操作的复杂数据管道。零 ETL 集成通过为您预调配和管理管道来消除构建和管理管道所带来的挑战。
+ 减少运营负担和成本，让您专注于改进应用程序。
+ 让您利用目标目的地的分析和机器学习功能，从事务数据和其它数据中获得见解，从而有效地应对关键的、时间敏感的事件。

## 重要概念
<a name="zero-etl.concepts"></a>

在开始使用零 ETL 集成时，请考虑以下概念：

**集成**  
完全托管式数据管道，可自动将事务数据和架构从 RDS 数据库复制到数据仓库或目录。

**源数据库**  
从中复制数据的 RDS 数据库。可以指定单可用区或多可用区数据库实例，或多可用区数据库集群（仅适用于 RDS for MySQL）。

**Target**  
要将数据复制到的数据仓库或智能湖仓。有两种类型的数据仓库：[预调配集群](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html)数据仓库和[无服务器](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-workgroup-namespace.html)数据仓库。预调配集群数据仓库是一个由称作节点的各种计算资源构成的集合，这些节点已整理到名为*集群*的组中。无服务器数据仓库由存储计算资源的工作组和存放数据库对象和用户的命名空间组成。这两个数据仓库都运行分析引擎并包含一个或多个数据库。  
目标智能湖仓由目录、数据库、表和视图组成。有关智能湖仓架构的更多信息，请参阅《Amazon SageMaker AI Unified Studio User Guide》**中的 [https://docs.aws.amazon.com/sagemaker-unified-studio/latest/userguide/lakehouse-components.html](https://docs.aws.amazon.com/sagemaker-unified-studio/latest/userguide/lakehouse-components.html)。  
多个源数据库可以写入同一个目标。  
有关更多信息，请参阅《Amazon Redshift 开发人员指南》**中的[数据仓库系统架构](https://docs.aws.amazon.com/redshift/latest/dg/c_high_level_system_architecture.html)。

## 限制
<a name="zero-etl.reqs-lims"></a>

以下限制适用于 RDS 零 ETL 集成。

**Topics**
+ [一般限制](#zero-etl.reqs-lims-general)
+ [RDS for MySQL 限制](#zero-etl.reqs-lims-mysql)
+ [RDS for PostgreSQL 限制](#zero-etl.reqs-lims-rds-postgres)
+ [RDS for Oracle 的限制](#zero-etl.reqs-lims-oracle)
+ [Amazon Redshift 限制](#zero-etl.reqs-lims-redshift)
+ [Amazon SageMaker AI 智能湖仓限制](#zero-etl.reqs-lims-sagemaker-)

### 一般限制
<a name="zero-etl.reqs-lims-general"></a>
+ 源数据库必须与目标位于同一区域。
+ 如果集群已有集成，则无法重命名数据库或其任何实例。
+ 不能在相同的源数据库和目标数据库之间创建多个集成。
+ 您无法删除已有集成的数据库。您必须先删除所有关联的集成。
+ 如果您停止源数据库，则在恢复数据库之前，可能不会将最后几个事务复制到目标。
+ 如果源数据库实例已停止，则无法删除集成。
+ 如果您的数据库是蓝绿部署的源，则在切换期间，蓝色和绿色环境无法具有现有的零 ETL 集成。您必须先删除集成，接着切换，然后重新创建集成。
+ 如果源数据库正在积极创建另一个集成，则无法为其创建集成。
+ 最初创建集成或重新同步表时，从源到目标的数据做种可能需要 20-25 分钟或更长时间，具体取决于源数据库的大小。这种延迟可能导致副本滞后延长。
+ 某些数据类型不支持。有关更多信息，请参阅 [RDS 和 Amazon Redshift 数据库之间的数据类型差异](zero-etl.querying.md#zero-etl.data-type-mapping)。
+ 系统表、临时表和视图不会复制到目标仓库。
+ 对源表执行 DDL 命令（例如 `ALTER TABLE`）可能会触发表重新同步，从而使表在重新同步时无法用于查询。有关更多信息，请参阅 [我的一个或多个 Amazon Redshift 表需要重新同步](zero-etl.troubleshooting.md#zero-etl.troubleshooting.resync)。

### RDS for MySQL 限制
<a name="zero-etl.reqs-lims-mysql"></a>
+ 源数据库必须运行受支持的 RDS for MySQL 版本。有关受支持的版本的列表，请参阅 [支持 Amazon RDS 零 ETL 集成的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.ZeroETL.md)。
+ 同一 AWS 区域中的主实例和只读副本实例均不支持零 ETL 集成。
+ 零 ETL 集成依赖于 MySQL 二进制日志（binlog）来捕获持续数据更改。请勿使用基于二进制日志的数据筛选，因为这可能会导致源数据库和目标数据库之间的数据不一致。
+ 零 ETL 集成仅适用于配置为使用 InnoDB 存储引擎的数据库。
+ 不支持带有预定义表更新的外键引用。具体而言，`CASCADE`、`SET NULL` 和 `SET DEFAULT` 操作不支持 `ON DELETE` 和 `ON UPDATE` 规则。尝试使用对另一个表的此类引用创建或更新表会使该表进入失败状态。
+ 如果源数据库使用机械硬盘存储，则无法为其创建集成。

### RDS for PostgreSQL 限制
<a name="zero-etl.reqs-lims-rds-postgres"></a>
+ 源数据库必须是运行版本 15.7\$1、16.3\$1 或 17.1\$1 的 RDS for PostgreSQL 实例。不支持更早的版本。
+ RDS for PostgreSQL 零 ETL 集成不支持将多可用区数据库集群作为源数据库。
+ 无法从 RDS for PostgreSQL 只读副本实例创建零 ETL 集成。
+ PostgreSQL 未记录的表和实体化视图不会复制到 Amazon Redshift。
+ 由于 Amazon Redshift 的限制，不支持复制某些 PostgreSQL 数据类型，例如 [geometry data types](https://www.postgresql.org/docs/current/datatype-geometric.html) 和大于 64 KB 的数据。有关 RDS For PostgreSQL 和 Amazon Redshift 之间的数据类型差异的更多信息，请参阅**数据类型差异**部分中的 [RDS for PostgreSQL](zero-etl.querying.md#zero-etl.data-type-mapping-postgres)。
+ 当源 RDS for PostgreSQL 实例具有有效的零 ETL 集成时，您无法对其执行[主要版本升级](USER_UpgradeDBInstance.PostgreSQL.md)。要升级源实例，必须先删除所有现有的零 ETL 集成。在完成主要版本升级后，可以重新创建零 ETL 集成。
+ 如果对源数据库实例执行 [declarative partitioning](https://www.postgresql.org/docs/current/ddl-partitioning.html#DDL-PARTITIONING-DECLARATIVE) 事务，则所有受影响的表都将进入失败状态，并且不再可供访问。

### RDS for Oracle 的限制
<a name="zero-etl.reqs-lims-oracle"></a>
+ 源数据库必须是运行版本 19c 企业版或标准版 2、2019 年 7 月版本更新或更高版本的 RDS for Oracle 实例。不支持更早的版本。
+ 无法从 RDS for Oracle 只读副本实例创建零 ETL 集成。
+ 如果[租户数据库](Oracle.Concepts.CDBs.md)上存在零 ETL 集成，则无法重命名该租户数据库。
+ 一个租户数据库只能有一个零 ETL 集成。
+ RDS for Oracle 和 Amazon Redshift 有一些数据类型差异。有关更多信息，请参阅**数据类型差异**部分中的 [RDS for Oracle](zero-etl.querying.md#zero-etl.data-type-mapping-oracle)。

### Amazon Redshift 限制
<a name="zero-etl.reqs-lims-redshift"></a>

有关与零 ETL 集成相关的 Amazon Redshift 限制的列表，请参阅《Amazon Redshift 管理指南》**中的[将零 ETL 集成与 Amazon Redshift 结合使用时的注意事项](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl.reqs-lims.html)。

### Amazon SageMaker AI 智能湖仓限制
<a name="zero-etl.reqs-lims-sagemaker-"></a>

以下是 Amazon SageMaker AI 智能湖仓零 ETL 集成的限制。
+ 目录名称的长度限制为 19 个字符。

## 配额
<a name="zero-etl.quotas"></a>

您的账户有以下与 RDS 零 ETL 集成相关的限额。除非另行指定，否则每个限额将基于区域。


| 名称 | 默认值 | 说明 | 
| --- | --- | --- | 
| 集成 | 100 | AWS 账户内的集成总数。 | 
| 每个目标的集成数 | 50 | 向单个目标数据仓库或智能湖仓发送数据的集成数量。 | 
| 每个源实例的集成数量 | 5 | 从单个源数据库实例发送数据的集成数量。 | 

此外，目标仓库对每个数据库实例或集群节点中支持的表数量设置了某些限制。有关 Amazon Redshift 配额和限制的更多信息，请参阅《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配额和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。

## 支持的区域
<a name="zero-etl.regions"></a>

RDS 零 ETL 集成在 AWS 区域的一个子集中提供。有关受支持区域的列表，请参阅。[支持 Amazon RDS 零 ETL 集成的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.ZeroETL.md)

# 开始使用 Amazon RDS 零 ETL 集成
<a name="zero-etl.setting-up"></a>

在创建零 ETL 集成之前，请使用所需的参数和权限配置 RDS 数据库和数据仓库。在安装过程中，您将完成以下步骤：

1. [创建自定义数据库参数组。](#zero-etl.parameters)

1. [创建源数据库](#zero-etl.create-cluster)。

1. [为 Amazon Redshift 创建目标数据仓库](#zero-etl-setting-up.data-warehouse)或[创建目标 Amazon SageMaker 智能湖仓](#zero-etl-setting-up.sagemaker)。

完成这些任务后，请继续执行[创建 Amazon RDS 与 Amazon Redshift 的零 ETL 集成](zero-etl.creating.md)或[创建 Amazon RDS 与 Amazon SageMaker 智能湖仓的零 ETL 集成](zero-etl.creating-smlh.md)。

**提示**  
您可以在创建集成时让 RDS 为您完成这些设置步骤，而不必手动执行这些步骤。要立即开始创建集成，请参阅[创建 Amazon RDS 与 Amazon Redshift 的零 ETL 集成](zero-etl.creating.md)。

对于步骤 3，您可以根据需要，选择创建目标数据仓库（步骤 3a）或目标智能湖仓（步骤 3b）：
+ 如果您需要传统的数据仓库功能以及基于 SQL 的分析，请选择数据仓库。
+ 如果您需要机器学习功能并希望将智能湖仓功能用于数据科学和机器学习工作流程，请选择 Amazon SageMaker 智能湖仓。

## 步骤 1：创建自定义数据库参数组
<a name="zero-etl.parameters"></a>

Amazon RDS 零 ETL 集成要求为控制数据复制的数据库参数提供特定的值。具体的参数取决于源数据库引擎。要配置这些参数，必须先创建自定义数据库参数组，然后将其与源数据库关联。根据您的源数据库引擎配置以下参数值。有关创建参数组的说明，请参阅。[Amazon RDS 数据库实例的数据库参数组](USER_WorkingWithDBInstanceParamGroups.md)我们建议您在同一个请求中配置所有参数值，以避免出现依赖项问题。

**RDS for MySQL**：
+ `binlog_format=ROW`
+ `binlog_row_image=full`

此外，请确保 `binlog_row_value_options` 参数*未*设置为 `PARTIAL_JSON`。如果源数据库为多可用区数据库集群，请确保 `binlog_transaction_compression` 参数*未*设置为 `ON`。

其中一些参数（例如 `binlog_format`）是动态的，这意味着可以在不触发重启的情况下对参数应用更改。这意味着某些现有会话可能会继续使用该参数的旧值。为防止这在创建零 ETL 集成时导致出现问题，请启用[性能架构](USER_PerfInsights.EnableMySQL.md)。性能架构可确保运行零 ETL 预检查，这有助于在此过程的早期检测到缺失的参数。

**RDS for PostgreSQL**：
+ `rds.logical_replication = 1`
+ `rds.replica_identity_full = 1`
+ `session_replication_role = origin`
+ `wal_sender_timeout ≥ 20000 or = 0`
+ `max_wal_senders ≥ 20`
+ `max_replication_slots ≥ 20`

对于多个 PostgreSQL 集成，每个集成将使用一个逻辑复制槽。根据您的使用情况查看 `max_replication_slots` 和 `max_wal_senders` 参数。

要在零 ETL 集成中实现高效的数据同步，请在源数据库实例中设置 `rds.replica_identity_full`。这指示数据库在 `UPDATE` 和 `DELETE` 操作期间在预写日志（WAL）中[记录完整行数据](https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY)，而不仅仅是主键信息。零 ETL 需要完整行数据，即使所有复制的表都需要有主键，也是如此。要确定哪些数据在查询期间可见，Amazon Redshift 使用专门的反联接策略将您的数据与内部删除跟踪表进行比较。记录完整行映像有助于 Amazon Redshift 高效地执行这些反联接。如果没有完整行数据，Amazon Redshift 将需要执行额外的查找，这可能会降低在 Amazon Redshift 使用的列式引擎中进行高吞吐量操作时的性能。

**重要**  
将副本身份设置为记录完整行[会增加 WAL 量](https://www.postgresql.org/docs/current/runtime-config-wal.html#GUC-WAL-LEVEL)，这可能会导致更高的写入放大率和 I/O 使用率，尤其对于宽表或频繁的更新。为了应对这些影响，请规划存储容量和 I/O 需求，监控 WAL 增长，并跟踪写入密集型工作负载中的复制延迟。

**RDS for Oracle**：

RDS for Oracle 不要求更改参数。

## 步骤 2：选择或创建源数据库
<a name="zero-etl.create-cluster"></a>

创建自定义数据库参数组后，选择或创建一个 RDS 数据库实例。此数据库将成为向目标数据仓库复制数据的来源。有关创建单可用区或多可用区数据库实例的说明，请参阅 [创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)。有关创建多可用区数据库集群（仅适用于 RDS for MySQL）的说明，请参阅[创建 Amazon RDS 的多可用区数据库集群](create-multi-az-db-cluster.md)。

数据库必须运行受支持的数据库引擎版本。有关受支持的版本的列表，请参阅 [支持 Amazon RDS 零 ETL 集成的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.ZeroETL.md)。

创建数据库时，在**其他配置**下，将默认的**数据库参数组**更改为您在上一步中创建的自定义参数组。

**注意**  
如果您在已创建数据库*之后*将参数组与数据库关联，则必须重启数据库以应用更改，然后才能创建零 ETL 集成。有关说明，请参阅 [重启数据库实例](USER_RebootInstance.md) 或 [重启 Amazon RDS 的多可用区数据库集群和读取器数据库实例](multi-az-db-clusters-concepts-rebooting.md)。

此外，请确保对数据库启用了自动备份。有关更多信息，请参阅 [启用自动备份](USER_WorkingWithAutomatedBackups.Enabling.md)。

## 步骤 3a：创建目标数据仓库
<a name="zero-etl-setting-up.data-warehouse"></a>

创建源数据库后，必须创建和配置目标数据仓库。数据仓库必须满足以下要求：
+ 使用 RA3 节点类型以及至少两个节点或 Redshift Serverless。
+ 已加密（如果使用预置集群）。有关更多信息，请参阅 [Amazon Redshift 数据库加密](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-db-encryption.html)。

有关创建数据仓库的说明，请参阅预调配集群的[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster)或 Redshift Serverless 的[创建带命名空间的工作组](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-console-workgroups-create-workgroup-wizard.html)。

### 在数据仓库上启用区分大小写
<a name="zero-etl-setting-up.case-sensitivity"></a>

要使集成成功，必须为数据仓库启用区分大小写参数（[https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)）。默认情况下，所有预调配集群和 Redshift Serverless 工作组均禁用区分大小写。

要启用区分大小写，请根据您的数据仓库类型执行以下步骤：
+ **预调配集群** – 要在预调配集群上启用区分大小写，请创建一个启用 `enable_case_sensitive_identifier` 参数的自定义参数组。然后，将该参数组与集群关联。有关说明，请参阅[使用控制台管理参数组](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-parameter-groups-console.html)或[使用 AWS CLI 配置参数值](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html#configure-parameters-using-the-clil)。
**注意**  
将自定义参数组与集群关联后，请记得重启集群。
+ **无服务器工作组** - 要在 Redshift Serverless 工作组上启用区分大小写，必须使用 AWS CLI。Amazon Redshift 控制台目前不支持修改 Redshift Serverless 参数值。发送以下 [update-workgroup](https://docs.aws.amazon.com/cli/latest/reference/redshift-serverless/update-workgroup.html) 请求：

  ```
  aws redshift-serverless update-workgroup \
    --workgroup-name target-workgroup \
    --config-parameters parameterKey=enable_case_sensitive_identifier,parameterValue=true
  ```

  修改参数值后，无需重启工作组。

### 为数据仓库配置授权
<a name="zero-etl.setup-auth"></a>

创建数据仓库后，必须将源 RDS 数据库配置为授权的集成源。有关说明，请参阅[为您的 Amazon Redshift 数据仓库配置授权](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-using.redshift-iam)。

## 使用 AWS SDK 设置集成
<a name="zero-etl.setup-sdk"></a>

您可以运行以下 Python 脚本来自动设置所需的资源，而不必手动设置每个资源。此代码示例使用 [适用于 Python (Boto3) 的 AWS SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) 创建源 RDS for MySQL 数据库实例和目标数据仓库，其中每个都具有所需的参数值。然后，它会等待数据库变为可用后，再在它们之间创建零 ETL 集成。您可以根据需要设置的资源注释掉不同的函数。

要安装所需依赖项，请运行以下命令：

```
pip install boto3
pip install time
```

在脚本中，可以选择修改源组、目标组和参数组的名称。最后一个函数在设置资源后创建一个名为 `my-integration` 的集成。

### Python 代码示例
<a name="zero-etl.setup-sdk-python"></a>

```
import boto3
import time

# Build the client using the default credential configuration.
# You can use the CLI and run 'aws configure' to set access key, secret
# key, and default Region.

rds = boto3.client('rds')
redshift = boto3.client('redshift')
sts = boto3.client('sts')

source_db_name = 'my-source-db' # A name for the source database
source_param_group_name = 'my-source-param-group' # A name for the source parameter group
target_cluster_name = 'my-target-cluster' # A name for the target cluster
target_param_group_name = 'my-target-param-group' # A name for the target parameter group

def create_source_db(*args):
    """Creates a source RDS for MySQL DB instance"""

    response = rds.create_db_parameter_group(
        DBParameterGroupName=source_param_group_name,
        DBParameterGroupFamily='mysql8.0',
        Description='RDS for MySQL zero-ETL integrations'
    )
    print('Created source parameter group: ' + response['DBParameterGroup']['DBParameterGroupName'])

    response = rds.modify_db_parameter_group(
        DBParameterGroupName=source_param_group_name,
        Parameters=[
            {
                'ParameterName': 'binlog_format',
                'ParameterValue': 'ROW',
                'ApplyMethod': 'pending-reboot'
            },
            {
                'ParameterName': 'binlog_row_image',
                'ParameterValue': 'full',
                'ApplyMethod': 'pending-reboot'
            }
        ]
    )
    print('Modified source parameter group: ' + response['DBParameterGroupName'])

    response = rds.create_db_instance(
        DBInstanceIdentifier=source_db_name,
        DBParameterGroupName=source_param_group_name,
        Engine='mysql',
        EngineVersion='8.0.32',
        DBName='mydb',
        DBInstanceClass='db.m5.large',
        AllocatedStorage=15,
        MasterUsername='username',
        MasterUserPassword='Password01**'
    )
    print('Creating source database: ' + response['DBInstance']['DBInstanceIdentifier'])
    source_arn = (response['DBInstance']['DBInstanceArn'])
    create_target_cluster(target_cluster_name, source_arn, target_param_group_name)
    return(response)

def create_target_cluster(target_cluster_name, source_arn, target_param_group_name):
    """Creates a target Redshift cluster"""

    response = redshift.create_cluster_parameter_group(
        ParameterGroupName=target_param_group_name,
        ParameterGroupFamily='redshift-1.0',
        Description='RDS for MySQL zero-ETL integrations'
    )
    print('Created target parameter group: ' + response['ClusterParameterGroup']['ParameterGroupName'])

    response = redshift.modify_cluster_parameter_group(
        ParameterGroupName=target_param_group_name,
        Parameters=[
            {
                'ParameterName': 'enable_case_sensitive_identifier',
                'ParameterValue': 'true'
            }
        ]
    )
    print('Modified target parameter group: ' + response['ParameterGroupName'])

    response = redshift.create_cluster(
        ClusterIdentifier=target_cluster_name,
        NodeType='ra3.4xlarge',
        NumberOfNodes=2,
        Encrypted=True,
        MasterUsername='username',
        MasterUserPassword='Password01**',
        ClusterParameterGroupName=target_param_group_name
    )
    print('Creating target cluster: ' + response['Cluster']['ClusterIdentifier'])
    
    # Retrieve the target cluster ARN
    response = redshift.describe_clusters(
        ClusterIdentifier=target_cluster_name
    )
    target_arn = response['Clusters'][0]['ClusterNamespaceArn']

    # Retrieve the current user's account ID
    response = sts.get_caller_identity()
    account_id = response['Account']

    # Create a resource policy granting access to source database and account ID
    response = redshift.put_resource_policy(
        ResourceArn=target_arn,
        Policy='''
        {
            \"Version\":\"2012-10-17\",		 	 	 
            \"Statement\":[
                {\"Effect\":\"Allow\",
                \"Principal\":{
                    \"Service\":\"redshift.amazonaws.com\"
                },
                \"Action\":[\"redshift:AuthorizeInboundIntegration\"],
                \"Condition\":{
                    \"StringEquals\":{
                        \"aws:SourceArn\":\"%s\"}
                    }
                },
                {\"Effect\":\"Allow\",
                \"Principal\":{
                    \"AWS\":\"arn:aws:iam::%s:root\"},
                \"Action\":\"redshift:CreateInboundIntegration\"}
            ]
        }
        ''' % (source_arn, account_id)
    )
    return(response)

def wait_for_db_availability(*args):
    """Waits for both databases to be available"""

    print('Waiting for source and target to be available...')

    response = rds.describe_db_instances(
        DBInstanceIdentifier=source_db_name
    )
    source_status = response['DBInstances'][0]['DBInstanceStatus']
    source_arn = response['DBInstances'][0]['DBInstanceArn']

    response = redshift.describe_clusters(
        ClusterIdentifier=target_cluster_name
    )
    target_status = response['Clusters'][0]['ClusterStatus']
    target_arn = response['Clusters'][0]['ClusterNamespaceArn']

    # Every 60 seconds, check whether the databases are available
    if source_status != 'available' or target_status != 'available':
        time.sleep(60)
        response = wait_for_db_availability(
            source_db_name, target_cluster_name)
    else:
        print('Databases available. Ready to create zero-ETL integration.')
        create_integration(source_arn, target_arn)
        return

def create_integration(source_arn, target_arn):
    """Creates a zero-ETL integration using the source and target databases"""

    response = rds.create_integration(
        SourceArn=source_arn,
        TargetArn=target_arn,
        IntegrationName='my-integration'
    )
    print('Creating integration: ' + response['IntegrationName'])
    
def main():
    """main function"""
    create_source_db(source_db_name, source_param_group_name)
    wait_for_db_availability(source_db_name, target_cluster_name)

if __name__ == "__main__":
    main()
```

## 步骤 3b：为 Amazon SageMaker 智能湖仓零 ETL 集成创建 AWS Glue 目录
<a name="zero-etl-setting-up.sagemaker"></a>

当创建与 Amazon SageMaker 智能湖仓的零 ETL 集成时，必须在 AWS Lake Formation 中创建 AWS Glue 托管式目录。目标目录必须是 Amazon Redshift 托管目录。要创建 Amazon Redshift 托管目录，请先创建 `AWSServiceRoleForRedshift` 服务相关角色。在 Lake Formation 控制台中，将 `AWSServiceRoleForRedshift` 添加为只读管理员。

有关先前任务的更多信息，请参阅以下主题。
+ 有关创建 Amazon Redshift 托管目录的信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Creating an Amazon Redshift managed catalog in the AWS Glue Data Catalog](https://docs.aws.amazon.com/lake-formation/latest/dg/create-rms-catalog.html)。
+ 有关 Amazon Redshift 的服务相关角色的信息，请参阅《Amazon Redshift 管理指南》**中的[对 Amazon Redshift 使用服务相关角色](https://docs.aws.amazon.com/redshift/latest/mgmt/using-service-linked-roles.html)。
+ 有关 Lake Formation 的只读管理员权限的信息，请参阅《AWS Lake Formation Developer Guide》**中的 [Lake Formation personas and IAM permissions reference](https://docs.aws.amazon.com/lake-formation/latest/dg/permissions-reference.html)。

### 配置目标 AWS Glue 目录的权限
<a name="zero-etl-setting-up.sagemaker-permissions"></a>

在为零 ETL 集成创建目标目录之前，必须创建 Lake Formation 目标创建角色和 AWS Glue 数据传输角色。使用 Lake Formation 目标创建角色来创建目标目录。创建目标目录时，在**从引擎访问**部分的 **IAM 角色**字段中输入 Glue 数据传输角色。

#### Lake Formation 目标创建角色
<a name="zero-etl-setting-up.target-creation-role"></a>

目标创建角色必须是 Lake Formation 管理员，并且需要以下权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "lakeformation:RegisterResource",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:PutEncryptionConfiguration",
                "iam:PassRole",
                "glue:CreateCatalog",
                "glue:GetCatalog",
                "s3:PutBucketTagging",
                "s3:PutLifecycleConfiguration",
                "s3:PutBucketPolicy",
                "s3:CreateBucket",
                "redshift-serverless:CreateNamespace",
                "s3:DeleteBucket",
                "s3:PutBucketVersioning",
                "redshift-serverless:CreateWorkgroup"
            ],
            "Resource": [
                "arn:aws:glue:*:111122223333:catalog",
                "arn:aws:glue:*:111122223333:catalog/*",
                "arn:aws:s3:::*",
                "arn:aws:redshift-serverless:*:111122223333:workgroup/*",
                "arn:aws:redshift-serverless:*:111122223333:namespace/*",
                "arn:aws:iam::111122223333:role/GlueDataCatalogDataTransferRole"
            ]
        }
    ]
}
```

------

目标创建角色必须拥有以下信任关系。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "glue.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        },
        {
          "Effect": "Allow",
          "Principal": {
            "AWS": "arn:aws:iam::111122223333:user/Username"
          },
          "Action": "sts:AssumeRole"
        }
    ]
}
```

------

#### Glue 数据传输角色
<a name="zero-etl-setting-up.glue-data-transfer-role"></a>

Glue 数据传输角色是 MySQL 目录操作所必需的，并且必须具有以下权限。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DataTransferRolePolicy",
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey",
                "kms:Decrypt",
                "glue:GetCatalog",
                "glue:GetDatabase"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

Glue 数据传输角色必须拥有以下信任关系。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "glue.amazonaws.com",
                    "redshift.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

## 后续步骤
<a name="zero-etl.setup-next"></a>

借助源 RDS 数据库和 Amazon Redshift 目标数据仓库或 Amazon SageMaker 智能湖仓，您可以创建零 ETL 集成并复制数据。有关说明，请参阅[创建 Amazon RDS 与 Amazon Redshift 的零 ETL 集成](zero-etl.creating.md)。

# 创建 Amazon RDS 与 Amazon Redshift 的零 ETL 集成
<a name="zero-etl.creating"></a>

在创建 Amazon RDS 零 ETL 集成时，需要指定源 RDS 数据库和目标 Amazon Redshift 数据仓库。您还可以自定义加密设置和添加标签。Amazon RDS 在源数据库与其目标之间创建集成。集成激活后，您插入到源数据库中的任何数据都将复制到配置的 Amazon Redshift 目标中。

## 先决条件
<a name="zero-etl.create-prereqs"></a>

在创建零 ETL 集成之前，必须创建源数据库和目标 Amazon Redshift 数据仓库。您还必须通过将数据库添加为授权集成源来允许复制到数据仓库。

有关完成其中每个步骤的说明，请参阅[开始使用 Amazon RDS 零 ETL 集成](zero-etl.setting-up.md)。

## 所需的权限
<a name="zero-etl.create-permissions"></a>

创建零 ETL 集成需要具有某些 IAM 权限。至少您需要具有执行以下操作的权限：
+ 为源 RDS 数据库创建零 ETL 集成。
+ 查看和删除所有零 ETL 集成。
+ 在目标数据仓库中创建入站集成。

以下示例策略演示了创建和管理集成所需的[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。如果您的用户或角色具有更广泛的权限（例如 `AdministratorAccess` 托管式策略），则可能不需要这些确切的权限。

**注意**  
Redshift Amazon 资源名称（ARN）采用以下格式。请注意，在无服务器命名空间 UUID 之前使用了正斜杠（`(/`）而不是冒号（`:`）。  
预调配集群 – `arn:aws:redshift:{region}:{account-id}:namespace:namespace-uuid`
无服务器 – `arn:aws:redshift-serverless:{region}:{account-id}:namespace/namespace-uuid`

### Redshift 目标的示例策略
<a name="zero-etl.create-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CreateIntegration",
      "Effect": "Allow",
      "Action": [
        "rds:CreateIntegration"
      ],
      "Resource": [
        "arn:aws:rds:us-east-1:123456789012:db:source-db",
        "arn:aws:rds:us-east-1:123456789012:integration:*"
      ]
    },
    {
      "Sid": "DescribeIntegrationDetails",
      "Effect": "Allow",
      "Action": [
        "rds:DescribeIntegrations"
      ],
      "Resource": [
      "arn:aws:rds:us-east-1:123456789012:integration:*"
  ]
    },
    {
      "Sid": "ChangeIntegrationDetails",
      "Effect": "Allow",
      "Action": [
        "rds:DeleteIntegration",
        "rds:ModifyIntegration"
      ],
      "Resource": [
        "arn:aws:rds:us-east-1:123456789012:integration:*"
      ]
    },
    {
      "Sid": "AllowRedShiftIntegration",
      "Effect": "Allow",
      "Action": [
        "redshift:CreateInboundIntegration"
      ],
      "Resource": [
        "arn:aws:redshift:us-east-1:123456789012:namespace:namespace-uuid"
      ]
    }
  ]
}
```

------

### 在不同的账户中选择目标数据仓库
<a name="zero-etl.create-permissions-cross-account"></a>

如果您计划指定位于另一个 AWS 账户中的目标 Amazon Redshift 数据仓库，则必须创建一个角色，以允许当前账户中的用户访问目标账户中的资源。有关更多信息，请参阅[在您拥有的其他 AWS 账户中向 IAM 用户提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。

该角色必须具有以下权限，这些权限允许用户查看目标账户中可用的 Amazon Redshift 预调配集群和 Redshift Serverless 命名空间。

#### 必需的权限和信任策略
<a name="zero-etl.cross-account-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "redshift:DescribeClusters",
            "redshift-serverless:ListNamespaces"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}
```

------

该角色必须具有以下信任策略，该策略指定目标账户 ID。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

------

有关创建角色的说明，请参阅[使用自定义信任策略创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html)。

## 创建零 ETL 集成
<a name="zero-etl.create"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 创建零 ETL 集成。

**重要**  
零 ETL 集成不支持刷新或重新同步操作。如果在创建集成后遇到与集成相关的问题，必须删除此集成并创建一个新集成。

默认情况下，RDS for MySQL 会立即清除二进制日志文件。由于零 ETL 集成依赖二进制日志将数据从源复制到目标，因此源数据库的保留期必须至少为一小时。创建集成后，Amazon RDS 会立即检查所选源数据库的二进制日志文件保留期。如果当前值为 0 小时，则 Amazon RDS 会自动将其更改为 1 小时。否则，该值将保持不变。

### RDS 控制台
<a name="zero-etl.create-console"></a>

**创建零 ETL 集成**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在左侧导航窗格中，选择**零 ETL 集成**。

1. 选择**创建零 ETL 集成**。

1. 在**集成标识符**中，输入集成的名称。该名称可包含最多 63 个字母数字字符，并且可以包含连字符。
**重要**  
目录名称的长度限制为 19 个字符。如果要将集成标识符用作目录名称，请确保它符合此要求。

1. 选择**下一步**。

1. 对于**源**，选择数据将源自其中的 RDS 数据库。
**注意**  
如果数据库参数配置不正确，RDS 会通知您。如果您收到此消息，可以选择**为我修复**，也可以手动配置它们。有关手动修复它们的说明，请参阅[步骤 1：创建自定义数据库参数组](zero-etl.setting-up.md#zero-etl.parameters)。  
修改数据库参数需要重启。在创建集成之前，必须完成重启，并且必须成功地将新的参数值应用于数据库。

1. 成功配置源数据库后，选择**下一步**。

1. 对于**目标**，执行以下操作：

   1. （可选）要为 Amazon Redshift 目标使用不同的 AWS 账户，请选择**指定其他账户**。然后，输入有权显示您数据仓库的 IAM 角色的 ARN。有关创建 IAM 角色的说明，请参阅[在不同的账户中选择目标数据仓库](#zero-etl.create-permissions-cross-account)。

   1. 对于 **Amazon Redshift 数据仓库**，选择从源数据库中复制的数据的目标。您可以选择预调配的 Amazon Redshift *集群*或 Redshift Serverless *命名空间*作为目标。
**注意**  
如果指定数据仓库的资源策略或区分大小写设置配置不正确，RDS 会通知您。如果您收到此消息，可以选择**为我修复**，也可以手动配置它们。有关手动修复这些问题的说明，请参阅《Amazon Redshift 管理指南》**中的[为您的数据仓库开启区分大小写](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-setting-up.case-sensitivity)[和为您的数据仓库配置授权](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-using.redshift-iam)。  
修改*预调配* Redshift 集群的区分大小写需要重启。在创建集成之前，必须完成重启，并且必须成功地将新的参数值应用于集群。  
如果您选择的源和目标位于不同的 AWS 账户，则 Amazon RDS 无法为您修复这些设置。您必须导航到另一个账户，然后在 Amazon Redshift 中手动修复这些问题。

1. 正确配置目标数据仓库后，选择**下一步**。

1. （可选）对于**标签**，向集成添加一个或多个标签。有关更多信息，请参阅 [为 Amazon RDS 资源添加标签](USER_Tagging.md)。

1. 对于**加密**，请指定您希望如何加密集成。默认情况下，RDS 会加密所有与 AWS 拥有的密钥 的集成。要改为选择客户自主管理型密钥，请启用**自定义加密设置**并选择用于加密的 KMS 密钥。有关更多信息，请参阅 [加密 Amazon RDS 资源](Overview.Encryption.md)。

   （可选）添加加密上下文。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[加密内容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。
**注意**  
除了您添加的任何加密上下文对外，Amazon RDS 还会添加以下加密上下文对：  
`aws:redshift:integration:arn` - `IntegrationArn`
`aws:servicename:id` - `Redshift`
这会将您可以添加的加密上下文对总数从 8 减少到 6，并增加授予约束条件的总字符限制。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [Using grant constraints](https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints)。

1. 选择**下一步**。

1. 查看您的集成设置并选择**创建零 ETL 集成**。

   如果创建失败，请参阅[我无法创建零 ETL 集成](zero-etl.troubleshooting.md#zero-etl.troubleshooting.creation)以了解故障排除步骤。

集成在创建时状态为 `Creating`，而目标 Amazon Redshift 数据仓库的状态为 `Modifying`。在此期间，您无法查询数据仓库或对其进行任何配置更改。

成功创建集成后，集成和目标 Amazon Redshift 数据仓库的状态都更改为 `Active`。

### AWS CLI
<a name="zero-etl.create-cli"></a>

要使用 AWS CLI 创建零 ETL 集成，请使用带有以下选项的 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/rds/create-integration.html) 命令：

**注意**  
请记住，目录名称限制为 19 个字符。如果要将集成名称用作目录名称，请相应地选择集成名称。
+ `--integration-name` – 指定集成的名称。
+ `--source-arn` – 指定将作为集成源的 RDS 数据库的 ARN。
+ `--target-arn` – 指定将作为集成目标的 Amazon Redshift 数据仓库的 ARN。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-integration \
    --integration-name my-integration \
    --source-arn arn:aws:rds:{region}:{account-id}:my-db \
    --target-arn arn:aws:redshift:{region}:{account-id}:namespace:namespace-uuid
```
对于：Windows  

```
aws rds create-integration ^
    --integration-name my-integration ^
    --source-arn arn:aws:rds:{region}:{account-id}:my-db ^
    --target-arn arn:aws:redshift:{region}:{account-id}:namespace:namespace-uuid
```

### RDS API
<a name="zero-etl.create-api"></a>

要使用 Amazon RDS API 创建零 ETL 集成，请结合以下参数使用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateIntegration.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateIntegration.html) 操作：

**注意**  
目录名称限制为 19 个字符。如果要将 IntegrationName 参数用作目录名称，请确保它符合此要求。
+ `IntegrationName` – 指定集成的名称。
+ `SourceArn` – 指定将作为集成源的 RDS 数据库的 ARN。
+ `TargetArn` – 指定将作为集成目标的 Amazon Redshift 数据仓库的 ARN。

## 使用客户自主管理型密钥加密集成
<a name="zero-etl.create-encrypt"></a>

如果您指定自定义 KMS 密钥而不是创建集成时的 AWS 拥有的密钥，则密钥策略必须为 Amazon Redshift 服务主体提供对 `CreateGrant` 操作的访问权限。此外，它必须允许当前用户执行 `DescribeKey` 和 `CreateGrant` 操作。

以下示例策略演示了如何提供密钥策略中所需的权限。它包括用于进一步缩小权限范围的上下文键。

### 示例密钥策略
<a name="zero-etl.kms-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "Key policy",
    "Statement": [
        {
            "Sid": "Enables IAM user permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allows the Redshift service principal to add a grant to a KMS key",
            "Effect": "Allow",
            "Principal": {
                "Service": "redshift.amazonaws.com"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:{context-key}": "{context-value}"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": [
                        "Decrypt",
                        "GenerateDataKey",
                        "CreateGrant"
                    ]
                }
            }
        },
        {
            "Sid": "Allows the current user or role to add a grant to a KMS key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/{role-name}"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:{context-key}": "{context-value}",
                    "kms:ViaService": "rds.us-east-1.amazonaws.com"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": [
                        "Decrypt",
                        "GenerateDataKey",
                        "CreateGrant"
                    ]
                }
            }
        },
        {
            "Sid": "Allows the current uer or role to retrieve information about a KMS key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/{role-name}"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*"
        }
    ]
}
```

------

有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)。

## 后续步骤
<a name="zero-etl.create-next"></a>

成功创建零 ETL 集成后，您必须在目标 Amazon Redshift 集群或工作组中创建目标数据库。然后，您可以开始向源 RDS 数据库中添加数据，并在 Amazon Redshift 中对其进行查询。有关说明，请参阅[在 Amazon Redshift 中创建目标数据库](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html)。

# 创建 Amazon RDS 与 Amazon SageMaker 智能湖仓的零 ETL 集成
<a name="zero-etl.creating-smlh"></a>

在创建 Amazon RDS 与 Amazon SageMaker 智能湖仓的零 ETL 集成时，您应指定源 RDS 数据库和目标 AWS Glue 托管目录。您还可以自定义加密设置和添加标签。Amazon RDS 在源数据库与其目标之间创建集成。在集成处于活动状态后，您插入到源数据库中的任何数据都将复制到配置的目标中。

## 先决条件
<a name="zero-etl.create-prereqs-smlh"></a>

在创建与 Amazon SageMaker 智能湖仓的零 ETL 集成之前，必须创建源数据库和目标 AWS Glue 托管目录。您还必须通过将数据库添加为授权的集成源来支持复制到目录。

有关完成其中每个步骤的说明，请参阅[开始使用 Amazon RDS 零 ETL 集成](zero-etl.setting-up.md)。

## 所需的权限
<a name="zero-etl.create-permissions-smlh"></a>

创建与 Amazon SageMaker 智能湖仓的零 ETL 集成需要具有某些 IAM 权限。至少您需要具有执行以下操作的权限：
+ 为源 RDS 数据库创建零 ETL 集成。
+ 查看和删除所有零 ETL 集成。
+ 创建到目标 AWS Glue 托管目录的入站集成。
+ 访问 AWS Glue 托管目录使用的 Amazon S3 存储桶。
+ 如果配置了自定义加密，则使用 AWS KMS 密钥进行加密。
+ 将资源注册到 Lake Formation 中。
+ 将资源策略放在 AWS Glue 托管目录上以对入站集成进行授权。

以下示例策略演示了创建和管理与 Amazon SageMaker 智能湖仓的集成所需的[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。如果您的用户或角色具有更广泛的权限（例如 `AdministratorAccess` 托管式策略），则可能不需要这些确切的权限。

此外，您必须在目标 AWS Glue 托管目录上配置资源策略以便对入站集成进行授权。使用以下 AWS CLI 命令来应用资源策略。

### 在目标目录上对入站集成进行授权的示例 AWS CLI 命令
<a name="zero-etl.create-sample-policy-smlh"></a>

```
aws glue put-resource-policy \
      --policy-in-json  '{
    "Version": "2012-10-17",		 	 	 
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
            "Service": "glue.amazonaws.com"
        },
        "Action": [
            "glue:AuthorizeInboundIntegration"
        ],
        "Resource": ["arn:aws:glue:region:account_id:catalog/catalog_name"],
        "Condition": {
            "StringEquals": {
                "aws:SourceArn": "arn:aws:rds:region:account_id:db:source_name"
            }
        }
    },
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "account_id"
        },
        "Action": ["glue:CreateInboundIntegration"],
        "Resource": ["arn:aws:glue:region:account_id:catalog/catalog_name"]
    }
    ]
}' \
      --region region
```

**注意**  
Glue 目录 Amazon 资源名称（ARN）的格式如下：  
Glue 目录：`arn:aws:glue:{region}:{account-id}:catalog/catalog-name`

### 选择不同账户中的目标 AWS Glue 托管目录
<a name="zero-etl.create-permissions-cross-account-smlh"></a>

如果您计划指定位于另一个 AWS 账户中的目标 AWS Glue 托管目录，则必须创建一个角色，以支持当前账户中的用户访问目标账户中的资源。有关更多信息，请参阅[在您拥有的其他 AWS 账户中向 IAM 用户提供访问权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。

该角色必须具有以下权限，这些权限支持用户查看目标账户中可用的 AWS Glue 目录。

#### 必需的权限和信任策略
<a name="zero-etl.cross-account-sample-policy-smlh"></a>

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "glue:GetCatalog"
         ],
         "Resource":[
            "*"
         ]
      }
   ]
}
```

------

该角色必须具有以下信任策略，该策略指定目标账户 ID。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Principal":{
            "AWS": "arn:aws:iam::111122223333:root"
         },
         "Action":"sts:AssumeRole"
      }
   ]
}
```

------

有关创建角色的说明，请参阅[使用自定义信任策略创建角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-custom.html)。

## 创建与 Amazon SageMaker 智能湖仓的零 ETL 集成
<a name="zero-etl.create-smlh"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 创建与 Amazon SageMaker 智能湖仓的零 ETL 集成。

**重要**  
与 Amazon SageMaker 智能湖仓的零 ETL 集成不支持刷新或重新同步操作。如果在创建集成后遇到与集成相关的问题，必须删除此集成并创建一个新集成。

默认情况下，RDS for MySQL 会立即清除二进制日志文件。由于零 ETL 集成依赖二进制日志将数据从源复制到目标，因此源数据库的保留期必须至少为一小时。创建集成后，Amazon RDS 会立即检查所选源数据库的二进制日志文件保留期。如果当前值为 0 小时，则 Amazon RDS 会自动将其更改为 1 小时。否则，该值将保持不变。

### RDS 控制台
<a name="zero-etl.create-console-smlh"></a>

**创建与 Amazon SageMaker 智能湖仓的零 ETL 集成**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在左侧导航窗格中，选择**零 ETL 集成**。

1. 选择**创建零 ETL 集成**。

1. 在**集成标识符**中，输入集成的名称。该名称可包含最多 63 个字母数字字符，并且可以包含连字符。

1. 选择**下一步**。

1. 对于**源**，选择数据将源自其中的 RDS 数据库。
**注意**  
如果数据库参数配置不正确，RDS 会通知您。如果您收到此消息，可以选择**为我修复**，也可以手动配置它们。有关手动修复它们的说明，请参阅[步骤 1：创建自定义数据库参数组](zero-etl.setting-up.md#zero-etl.parameters)。  
修改数据库参数需要重启。在创建集成之前，必须完成重启，并且必须成功地将新的参数值应用于数据库。

1. 成功配置源数据库后，选择**下一步**。

1. 对于**目标**，执行以下操作：

   1. （可选）要为 Amazon SageMaker 智能湖仓目标使用不同的 AWS 账户，请选择**指定不同的账户**。然后，输入有权显示 AWS Glue 目录的 IAM 角色的 ARN。有关创建 IAM 角色的说明，请参阅[选择不同账户中的目标 AWS Glue 托管目录](#zero-etl.create-permissions-cross-account-smlh)。

   1. 对于 **AWS Glue 目录**，选择从源数据库中复制的数据的目标。可以选择使用现有 AWS Glue 托管目录作为目标。

   1. 目标 IAM 角色需要对目标目录的描述权限，并且必须具有以下权限：

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "VisualEditor0",
                  "Effect": "Allow",
                  "Action": "glue:GetCatalog",
                  "Resource": [
                      "arn:aws:glue:us-east-1:111122223333:catalog/*",
                      "arn:aws:glue:us-east-1:111122223333:catalog"
                  ]
              }
          ]
      }
      ```

------

      目标 IAM 角色必须拥有以下信任关系：

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "glue.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      ```

------

   1. 您必须使用在[步骤 3b：为 Amazon SageMaker 智能湖仓零 ETL 集成创建 AWS Glue 目录](zero-etl.setting-up.md#zero-etl-setting-up.sagemaker)中创建的 Lake Formation 管理员角色，来为目标 IAM 角色授予对目标 AWS Glue 托管目录的描述权限。
**注意**  
如果指定 AWS Glue 托管目录的资源策略或配置设置未得以正确配置，RDS 会通知您。如果您收到此消息，可以选择**为我修复**，也可以手动配置它们。  
如果您选择的源和目标位于不同的 AWS 账户，则 Amazon RDS 无法为您修复这些设置。您必须导航到另一个账户，然后在 SageMaker Unified Studio 中手动修复这些设置。

1. 在正确配置了目标 AWS Glue 托管目录后，选择**下一步**。

1. （可选）对于**标签**，向集成添加一个或多个标签。有关更多信息，请参阅 [为 Amazon RDS 资源添加标签](USER_Tagging.md)。

1. 对于**加密**，请指定您希望如何加密集成。默认情况下，RDS 会加密所有与 AWS 拥有的密钥 的集成。要改为选择客户自主管理型密钥，请启用**自定义加密设置**并选择用于加密的 KMS 密钥。有关更多信息，请参阅 [加密 Amazon RDS 资源](Overview.Encryption.md)。

   （可选）添加加密上下文。有关更多信息，请参阅 *AWS Key Management Service 开发人员指南*中的[加密内容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。
**注意**  
除了您添加的任何加密上下文对外，Amazon RDS 还会添加以下加密上下文对：  
`aws:glue:integration:arn` - `IntegrationArn`
`aws:servicename:id` - `glue`
这会将您可以添加的加密上下文对总数从 8 减少到 6，并增加授予约束条件的总字符限制。有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的 [Using grant constraints](https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints)。

1. 选择**下一步**。

1. 查看您的集成设置并选择**创建零 ETL 集成**。

   如果创建失败，请参阅[Amazon RDS 零 ETL 集成故障排除](zero-etl.troubleshooting.md)以了解故障排除步骤。

集成在创建时状态为 `Creating`，而目标 Amazon SageMaker 智能湖仓的状态为 `Modifying`。在此期间，您无法查询目录或对其进行任何配置更改。

成功创建集成后，集成和目标 Amazon SageMaker 智能湖仓的状态都更改为 `Active`。

### AWS CLI
<a name="zero-etl.create-cli-smlh"></a>

要使用 AWS CLI 来准备要进行零 ETL 集成的目标 AWS Glue 托管目录，必须首先使用带有以下选项的 [create-integration-resource-property](https://docs.aws.amazon.com/cli/latest/reference/rds/create-integration.html) 命令：
+ `--resource-arn`：指定将成为集成目标的 AWS Glue 托管目录的 ARN。
+ `--target-processing-properties`：指定 IAM 角色的 ARN 以访问目标 AWS Glue 托管目录 

```
aws glue create-integration-resource-property --region us-east-1
 --resource-arn arn:aws:glue:region:account_id:catalog/catalog_name \
 --target-processing-properties '{"RoleArn" : "arn:aws:iam::account_id:role/TargetIamRole"}'
```

要使用 AWS CLI 创建与 Amazon SageMaker 智能湖仓的零 ETL 集成，请使用带有以下选项的 [create-integration](https://docs.aws.amazon.com/cli/latest/reference/rds/create-integration.html) 命令：
+ `--integration-name` – 指定集成的名称。
+ `--source-arn` – 指定将作为集成源的 RDS 数据库的 ARN。
+ `--target-arn`：指定将成为集成目标的 AWS Glue 托管目录的 ARN。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds create-integration \
    --integration-name my-sagemaker-integration \
    --source-arn arn:aws:rds:{region}:{account-id}:cluster:my-db \
    --target-arn arn:aws:glue:{region}:{account-id}:catalog/catalog-name
```
对于：Windows  

```
aws rds create-integration ^
    --integration-name my-sagemaker-integration ^
    --source-arn arn:aws:rds:{region}:{account-id}:cluster:my-db ^
    --target-arn arn:aws:glue:{region}:{account-id}:catalog/catalog-name
```

### RDS API
<a name="zero-etl.create-api-smlh"></a>

要使用 Amazon RDS API 创建与 Amazon SageMaker 的零 ETL 集成，请结合使用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateIntegration.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateIntegration.html) 操作和以下参数：

**注意**  
目录名称限制为 19 个字符。如果要将 IntegrationName 参数用作目录名称，请确保它符合此要求。
+ `IntegrationName` – 指定集成的名称。
+ `SourceArn` – 指定将作为集成源的 RDS 数据库的 ARN。
+ `TargetArn`：指定将成为集成目标的 AWS Glue 托管目录的 ARN。

## 使用客户自主管理型密钥加密集成
<a name="zero-etl.create-encrypt-smlh"></a>

如果您在创建与 Amazon SageMaker 的集成时指定自定义 KMS 密钥而不是 AWS 拥有的密钥，则密钥策略必须为 SageMaker Unified Studio 服务主体提供对 `CreateGrant` 操作的访问权限。此外，它必须允许当前用户执行 `DescribeKey` 和 `CreateGrant` 操作。

以下示例策略演示了如何提供密钥策略中所需的权限。它包括用于进一步缩小权限范围的上下文键。

### 示例密钥策略
<a name="zero-etl.kms-sample-policy"></a>

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "Key policy",
    "Statement": [
        {
            "Sid": "EnablesIAMUserPermissions",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "GlueServicePrincipalAddGrant",
            "Effect": "Allow",
            "Principal": {
                "Service": "glue.amazonaws.com"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:{context-key}":"{context-value}"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": [
                        "Decrypt",
                        "GenerateDataKey",
                        "CreateGrant"
                    ]
                }
            }
        },
        {
            "Sid": "AllowsCurrentUserRoleAddGrantKMSKey",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::111122223333:role/{role-name}"
            },
            "Action": "kms:CreateGrant",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:{context-key}":"{context-value}",
                    "kms:ViaService": "rds.us-east-1.amazonaws.com"
                },
                "ForAllValues:StringEquals": {
                    "kms:GrantOperations": [
                        "Decrypt",
                        "GenerateDataKey",
                        "CreateGrant"
                    ]
                }
            }
        },
        {
            "Sid": "AllowsCurrentUserRoleRetrieveKMSKeyInformation",
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::111122223333:role/{role-name}"
            },
            "Action": "kms:DescribeKey",
            "Resource": "*"
        }
    ]
}
```

------

有关更多信息，请参阅《AWS Key Management Service 开发人员指南》**中的[创建密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)。

## 后续步骤
<a name="zero-etl.create-next-smlh"></a>

在成功创建与 Amazon SageMaker 的零 ETL 集成后，您可以开始向源 RDS 数据库添加数据，并在 Amazon SageMaker 智能湖仓中查询这些数据。数据将自动复制，并可供分析和机器学习工作负载使用。

# Amazon RDS 零 ETL 集成的数据筛选
<a name="zero-etl.filtering"></a>

Amazon RDS 零 ETL 集成支持数据筛选，这使您可以控制哪些数据从源 Amazon RDS 数据库复制到目标数据仓库。您可以应用一个或多个筛选条件来有选择地包含或排除特定的表，而不是复制整个数据库。这可以通过确保只传输相关数据，来协助您优化存储和查询性能。目前，筛选仅限于数据库级和表级。不支持列级和行级筛选。

当您要执行以下操作时，数据筛选可能很有用：
+ 联接来自两个或更多不同源数据库的某些表，而您不需要来自任一数据库的完整数据。
+ 仅使用表的子集而不是整个数据库实例集来执行分析，从而节省成本。
+ 从某些表中筛选掉敏感信息，例如电话号码、地址或信用卡详细信息。

您可以使用 AWS 管理控制台、AWS Command Line Interface（AWS CLI）或 Amazon RDS API 向零 ETL 集成添加数据筛选条件。

如果集成将预置集群作为其目标，则该集群必须使用[补丁 180](https://docs.aws.amazon.com/redshift/latest/mgmt/cluster-versions.html#cluster-version-180) 或更高版本，才能使用数据筛选。

**Topics**
+ [数据筛选条件的格式](#zero-etl.filtering-format)
+ [筛选条件逻辑](#zero-etl.filtering-evaluate)
+ [筛选条件优先级](#zero-etl.filtering-precedence)
+ [RDS for MySQL 示例](#zero-etl.filtering-examples-mysql)
+ [RDS for PostgreSQL 示例](#zero-etl.filtering-examples-postgres)
+ [RDS for Oracle 示例](#zero-etl.filtering-examples-oracle)
+ [向集成添加数据筛选条件](#zero-etl.add-filter)
+ [从集成中移除数据筛选条件](#zero-etl.remove-filter)

## 数据筛选条件的格式
<a name="zero-etl.filtering-format"></a>

您可以为单个集成定义多个筛选条件。每个筛选条件要么包含、要么排除任何与筛选表达式中的模式之一匹配的现有和将来的数据库表。Amazon RDS 零 ETL 集成使用 [Maxwell 筛选条件语法](https://maxwells-daemon.io/filtering/)进行数据筛选。

每个筛选条件都包含以下元素：


| Element | 说明 | 
| --- | --- | 
| 筛选条件类型 |  `Include` 筛选条件类型*包括*与筛选表达式中的模式之一匹配的所有表。`Exclude` 筛选条件类型*排除*与模式之一匹配的所有表。  | 
| 筛选表达式 |  逗号分隔的模式列表。表达式必须使用 [Maxwell 筛选条件语法](https://maxwells-daemon.io/filtering/)。  | 
| Pattern |  一种筛选模式，格式为 `database.table`（对于 RDS for MySQL）；或者格式为 `database.schema.table`（对于 RDS for PostgreSQL）。您可以指定文字名称，也可以定义正则表达式。  对于 RDS for MySQL，数据库和表名称均支持正则表达式。对于 RDS for PostgreSQL，只有架构和表名称支持正则表达式，而数据库名称不支持正则表达式。  您不能包含列级别筛选条件或黑名单。 单个集成最多可以有总共 99 个模式。在控制台中，可以在单个筛选表达式中输入模式，也可以将它们分散在多个表达式中。单个模式的长度不能超过 256 个字符。  | 

**重要**  
如果选择 RDS for PostgreSQL 源数据库，则必须至少指定一种数据筛选模式。该模式必须至少包含一个数据库 (`database-name.*.*`)，才能复制到目标数据仓库。

下图显示了控制台中 RDS for MySQL 数据筛选条件的结构：

![\[零 ETL 集成的数据筛选条件\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/zero-etl-filter.png)


**重要**  
请勿在筛选条件模式中包含个人身份信息、机密信息或敏感信息。

### AWS CLI 中的数据筛选条件
<a name="zero-etl.filtering-cli"></a>

使用 AWS CLI 添加数据筛选条件时，语法与使用控制台略有不同。必须为每种模式分别指定筛选条件类型（`Include` 或 `Exclude`），因此不能将多个模式分组到一个筛选条件类型下。

例如，在控制台中，可以在单个 `Include` 语句下对以下逗号分隔的模式进行分组：

**RDS for MySQL**

```
mydb.mytable, mydb./table_\d+/
```

**RDS for PostgreSQL**

```
mydb.myschema.mytable, mydb.myschema./table_\d+/
```

但是，使用 AWS CLI 时，相同的数据筛选条件必须采用以下格式：

**RDS for MySQL**

```
'include: mydb.mytable, include: mydb./table_\d+/'
```

**RDS for PostgreSQL**

```
'include: mydb.myschema.mytable, include: mydb.myschema./table_\d+/'
```

## 筛选条件逻辑
<a name="zero-etl.filtering-evaluate"></a>

如果您在集成中未指定任何数据筛选条件，Amazon RDS 会采用默认筛选条件 `include:*.*`，这会将所有表复制到目标数据仓库。但是，如果您至少添加一个筛选条件，则默认逻辑会切换为 `exclude:*.*`，默认情况下这会排除所有表。这使您可以显式定义要在复制中包含哪些数据库和表。

例如，如果您定义以下筛选条件：

```
'include: db.table1, include: db.table2'
```

Amazon RDS 按以下方式评估筛选条件：

```
'exclude:*.*, include: db.table1, include: db.table2'
```

因此，Amazon RDS 仅将来自名为 `db` 的数据库的 `table1` 和 `table2` 复制到目标数据仓库。

## 筛选条件优先级
<a name="zero-etl.filtering-precedence"></a>

Amazon RDS 按您指定的顺序评估数据筛选条件。在 AWS 管理控制台中，它将从左到右、从上到下处理筛选表达式。第二个筛选条件或第一个筛选条件之后的单个模式可以覆盖它。

例如，如果第一个筛选条件是 `Include books.stephenking`，则它只包括 `books` 数据库中的 `stephenking` 表。但是，如果您添加第二个筛选条件 `Exclude books.*`，则它会覆盖第一个筛选条件。这可以防止将 `books` 索引中的任何表复制到目标数据仓库。

当您指定至少一个筛选条件时，默认情况下，逻辑以采用 `exclude:*.*` 开始，这会自动将所有表*排除* 在复制范围之外。作为最佳实践，请按照从最广泛到最具体的顺序定义筛选条件。首先使用一个或多个 `Include` 语句来指定要复制的数据，然后添加 `Exclude` 筛选条件来有选择性地移除某些表。

同样的原则也适用于使用 AWS CLI 定义的筛选条件。Amazon RDS 按您指定筛选条件模式的顺序评估这些模式，因此一个模式可能会覆盖您指定的在它之前的模式。

## RDS for MySQL 示例
<a name="zero-etl.filtering-examples-mysql"></a>

以下示例演示了如何将数据筛选用于 RDS for MySQL 示例零 ETL 集成：
+  包括所有数据库和所有表：

  ```
  'include: *.*'
  ```
+  包括 `books` 数据库中的所有表：

  ```
  'include: books.*'
  ```
+ 排除任何名为 `mystery` 的表：

  ```
  'include: *.*, exclude: *.mystery'
  ```
+ 包括 `books` 数据库中的两个特定表：

  ```
  'include: books.stephen_king, include: books.carolyn_keene'
  ```
+ 包括 `books` 数据库中的所有表，但那些包含子字符串 `mystery` 的表除外：

  ```
  'include: books.*, exclude: books./.*mystery.*/'
  ```
+ 包括 `books` 数据库中的所有表，但那些以 `mystery` 开头的表除外：

  ```
  'include: books.*, exclude: books./mystery.*/'
  ```
+ 包括 `books` 数据库中的所有表，但那些以 `mystery` 结束的表除外：

  ```
  'include: books.*, exclude: books./.*mystery/'
  ```
+ 包括 `books` 数据库中的所有以 `table_` 开头的表，但名为 `table_stephen_king` 的表除外。例如，将复制 `table_movies` 或 `table_books`，但不复制 `table_stephen_king`。

  ```
  'include: books./table_.*/, exclude: books.table_stephen_king'
  ```

## RDS for PostgreSQL 示例
<a name="zero-etl.filtering-examples-postgres"></a>

以下示例演示了如何将数据筛选用于 RDS for PostgreSQL 零 ETL 集成：
+ 包括 `books` 数据库中的所有表：

  ```
  'include: books.*.*'
  ```
+ 排除 `books` 数据库中名为 `mystery` 的所有表：

  ```
  'include: books.*.*, exclude: books.*.mystery'
  ```
+ 在 `mystery` 架构的 `books` 数据库中包括一个表，在 `finance` 架构的 `employee` 数据库中包括一个表：

  ```
  'include: books.mystery.stephen_king, include: employee.finance.benefits'
  ```
+ 包括 `books` 数据库和 `science_fiction` 架构中的所有表，但那些包含子字符串 `king` 的表除外：

  ```
  'include: books.science_fiction.*, exclude: books.*./.*king.*/
  ```
+ 包括 `books` 数据库中的所有表，但那些架构名称以 `sci` 开头的表除外：

  ```
  'include: books.*.*, exclude: books./sci.*/.*'
  ```
+ 包括 `books` 数据库中的所有表，但那些在 `mystery` 架构中以 `king` 结束的表除外：

  ```
  'include: books.*.*, exclude: books.mystery./.*king/'
  ```
+ 包括 `books` 数据库中的所有以 `table_` 开头的表，但名为 `table_stephen_king` 的表除外。例如，复制 `fiction` 架构中的 `table_movies` 和 `mystery` 架构中的 `table_books`，但不复制任一架构中的 `table_stephen_king`：

  ```
  'include: books.*./table_.*/, exclude: books.*.table_stephen_king'
  ```

## RDS for Oracle 示例
<a name="zero-etl.filtering-examples-oracle"></a>

以下示例演示了如何将数据筛选用于 RDS for Oracle 零 ETL 集成：
+ 包括 books 数据库中的所有表：

  ```
  'include: books.*.*'
  ```
+ 排除 books 数据库中名为 mystery 的所有表：

  ```
  'include: books.*.*, exclude: books.*.mystery'
  ```
+ 包括 mystery 架构中 books 数据库内的一个表，以及 finance 架构中 employee 数据库内的一个表：

  ```
  'include: books.mystery.stephen_king, include: employee.finance.benefits'
  ```
+ 包括 mystery 架构中 books 数据库内的所有表：

  ```
  'include: books.mystery.*'
  ```

### 大小写方面的注意事项
<a name="zero-etl.filtering-examples-oracle-case-sensitivity"></a>

Oracle Database 和 Amazon Redshift 对对象名称大小写的处理方式不同，这会影响数据筛选器配置和目标查询。请注意以下几点：
+ 除非 `CREATE` 语句中显式引用，否则 Oracle Database 以大写形式存储数据库、架构和对象名称。例如，如果您创建 `mytable`（不带引号），Oracle 数据字典会将表名存储为 `MYTABLE`。如果引用对象名称，则数据字典会保留大小写。
+ 零 ETL 数据筛选器区分大小写，并且必须与 Oracle 数据字典中显示的对象名称的大小写完全匹配。
+ 除非被显式引用，否则 Amazon Redshift 查询默认为小写对象名称。例如，查询 `MYTABLE`（无引号）会搜索 `mytable`。

在创建 Amazon Redshift 筛选条件和查询数据时，请注意大小写差异。

#### 创建一个使用大写名称的表
<a name="zero-etl.filtering-examples-oracle-uppercase"></a>

如果在创建表时没有用双引号指定名称，Oracle 数据库会将该名称以大写形式存储在数据字典中。例如，您可以使用以下任一 SQL 语句创建 `MYTABLE`。

```
CREATE TABLE REINVENT.MYTABLE (id NUMBER PRIMARY KEY, description VARCHAR2(100));
CREATE TABLE reinvent.mytable (id NUMBER PRIMARY KEY, description VARCHAR2(100));
CREATE TABLE REinvent.MyTable (id NUMBER PRIMARY KEY, description VARCHAR2(100));
CREATE TABLE reINVENT.MYtabLE (id NUMBER PRIMARY KEY, description VARCHAR2(100));
```

由于您在前面的语句中没有引用表名，因此 Oracle 数据库将对象名以大写形式存储为 `MYTABLE`。

要将此表复制到 Amazon Redshift，您必须在 `create-integration` 命令的数据筛选器中指定大写名称。零 ETL 筛选器名称和 Oracle 数据字典名称必须匹配。

```
aws rds create-integration \
  --integration-name upperIntegration \
  --data-filter "include: ORCL.REINVENT.MYTABLE" \
...
```

默认情况下，Amazon Redshift 以小写形式存储数据。要在 Amazon Redshift 的复制数据库中查询 `MYTABLE`，您必须引用大写名称 `MYTABLE`，使其与 Oracle 数据字典中的大小写匹配。

```
SELECT * FROM targetdb1."REINVENT"."MYTABLE";
```

以下查询不使用引用机制。它们都会返回错误，因为它们搜索名为 `mytable` 的 Amazon Redshift 表，该表使用默认的小写名称，但该表在 Oracle 数据字典中的名称为 `MYTABLE`。

```
SELECT * FROM targetdb1."REINVENT".MYTABLE;
SELECT * FROM targetdb1."REINVENT".MyTable;
SELECT * FROM targetdb1."REINVENT".mytable;
```

以下查询使用引用机制来指定大小写混用名称。这些查询都会返回错误，因为它们搜索的不是名为 `MYTABLE` 的 Amazon Redshift 表。

```
SELECT * FROM targetdb1."REINVENT"."MYtablE";
SELECT * FROM targetdb1."REINVENT"."MyTable";
SELECT * FROM targetdb1."REINVENT"."mytable";
```

#### 创建一个使用小写名称的表
<a name="zero-etl.filtering-examples-oracle-lowercase"></a>

在以下替代示例中，使用双引号将表名以小写形式存储在 Oracle 数据字典中。您可以按如下方式创建 `mytable`。

```
CREATE TABLE REINVENT."mytable" (id NUMBER PRIMARY KEY, description VARCHAR2(100));
```

Oracle 数据库以小写形式将表名存储为 `mytable`。要将此表复制到 Amazon Redshift，您必须在零 ETL 数据筛选器中指定小写名称 `mytable`。

```
aws rds create-integration \
  --integration-name lowerIntegration \
  --data-filter "include: ORCL.REINVENT.mytable" \
...
```

在 Amazon Redshift 的复制数据库中查询此表时，您可以指定小写名称 `mytable`。这次查询将会成功，因为它搜索一个名为 `mytable` 的表，该名称是 Oracle 数据字典中的表名。

```
SELECT * FROM targetdb1."REINVENT".mytable;
```

由于 Amazon Redshift 默认使用小写的对象名称，因此以下查询也可以成功找到 `mytable`。

```
SELECT * FROM targetdb1."REINVENT".MYtablE;
SELECT * FROM targetdb1."REINVENT".MYTABLE;
SELECT * FROM targetdb1."REINVENT".MyTable;
```

以下查询使用对象名称的引用机制。它们都会返回错误，因为它们搜索的 Amazon Redshift 表名不同于 `mytable`。

```
SELECT * FROM targetdb1."REINVENT"."MYTABLE";
SELECT * FROM targetdb1."REINVENT"."MyTable";
SELECT * FROM targetdb1."REINVENT"."MYtablE";
```

#### 创建一个包含大小写混合名称的表
<a name="zero-etl.filtering-examples-oracle-mixed-case"></a>

在以下示例中，使用双引号将表名以小写形式存储在 Oracle 数据字典中。您可以按如下方式创建 `MyTable`。

```
CREATE TABLE REINVENT."MyTable" (id NUMBER PRIMARY KEY, description VARCHAR2(100));
```

Oracle 数据库以大小写混合的方式将此表名存储为 `MyTable`。要将此表复制到 Amazon Redshift，您必须在数据筛选器中指定大小写混用名称。

```
aws rds create-integration \
  --integration-name mixedIntegration \
  --data-filter "include: ORCL.REINVENT.MyTable" \
...
```

在 Amazon Redshift 的复制数据库中查询此表时，必须通过引用对象名称来指定大小写混用名称 `MyTable`。

```
SELECT * FROM targetdb1."REINVENT"."MyTable";
```

由于 Amazon Redshift 默认使用小写对象名称，因此以下查询无法找到该对象，因为它们搜索的是小写名称 `mytable`。

```
SELECT * FROM targetdb1."REINVENT".MYtablE;
SELECT * FROM targetdb1."REINVENT".MYTABLE;
SELECT * FROM targetdb1."REINVENT".mytable;
```

**注意**  
在 RDS for Oracle 集成中，您不能在数据库名称、架构名称或表名称的筛选值中使用正则表达式。

## 向集成添加数据筛选条件
<a name="zero-etl.add-filter"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 Amazon RDS API 配置数据筛选。

**重要**  
如果您在创建集成后添加筛选条件，Amazon RDS 会将其视为似乎始终存在。它会移除目标数据仓库中不符合新筛选条件的任何数据，并重新同步所有受影响的表。

### RDS 控制台
<a name="add-filter-console"></a>

**将数据筛选条件添加到零 ETL 集成中**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**零 ETL 集成**。选择要向其添加数据筛选条件的集成，然后选择**修改**。

1. 在**源**下，添加一个或多个 `Include` 和 `Exclude` 语句。

   下图显示了 MySQL 集成的数据筛选条件的示例：  
![\[RDS 控制台中零 ETL 集成的数据筛选条件\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/zero-etl-filter-data.png)

1. 如果您对更改感到满意，请选择**继续**和**保存更改**。

### AWS CLI
<a name="add-filter-cli"></a>

要使用 AWS CLI 向零 ETL 集成添加数据筛选条件，请调用 [modify-integration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/modify-integration.html) 命令。除了集成标识符外，还要使用逗号分隔的 `Include` 和 `Exclude` Maxwell 筛选条件列表来指定 `--data-filter` 参数。

**Example**  
以下示例向 `my-integration` 添加筛选条件模式。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-integration \
    --integration-identifier my-integration \
    --data-filter 'include: foodb.*, exclude: foodb.tbl, exclude: foodb./table_\d+/'
```
对于：Windows  

```
aws rds modify-integration ^
    --integration-identifier my-integration ^
    --data-filter 'include: foodb.*, exclude: foodb.tbl, exclude: foodb./table_\d+/'
```

### RDS API
<a name="add-filter-api"></a>

要使用 RDS API 修改零 ETL 集成，请调用 [ModifyIntegration](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyIntegration.html) 操作。指定集成标识符，并提供逗号分隔的筛选条件模式列表。

## 从集成中移除数据筛选条件
<a name="zero-etl.remove-filter"></a>

当您从集成中移除数据筛选条件时，Amazon RDS 会重新评估剩余的筛选条件，就好像移除的筛选条件从未存在过一样。然后，它将所有以前排除但现在符合条件的数据复制到目标数据仓库。这会触发所有受影响的表重新同步。

# 向源 RDS 数据库中添加数据并查询数据
<a name="zero-etl.querying"></a>

要完成创建将数据从 Amazon RDS 复制到 Amazon Redshift 的零 ETL 集成，您必须在目标目的地中创建数据库。

要连接 Amazon Redshift，请连接到您的 Amazon Redshift 集群或工作组，并创建一个引用集成标识符的数据库。然后，您可以向源 RDS 数据库中添加数据，并在 Amazon Redshift 或 Amazon SageMaker 中查看复制的数据。

**Topics**
+ [创建目标数据库](#zero-etl.create-db)
+ [向源数据库中添加数据](#zero-etl.add-data-rds)
+ [在 Amazon Redshift 中查询您的 Amazon RDS 数据](#zero-etl.query-data-redshift)
+ [RDS 和 Amazon Redshift 数据库之间的数据类型差异](#zero-etl.data-type-mapping)
+ [适用于 RDS for PostgreSQL 的 DDL 操作](#zero-etl.ddl-postgres)

## 创建目标数据库
<a name="zero-etl.create-db"></a>

在开始将数据复制到 Amazon Redshift 中之前，创建集成后，您必须在目标数据仓库中创建一个数据库。此数据库必须包含对集成标识符的引用。您可以使用 Amazon Redshift 控制台或查询编辑器 v2 来创建数据库。

有关创建目标数据库的说明，请参阅[在 Amazon Redshift 中创建目标数据库](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html#zero-etl-using.create-db)。

## 向源数据库中添加数据
<a name="zero-etl.add-data-rds"></a>

在配置集成后，可以使用要复制到数据仓库中的数据填充源 RDS 数据库。

**注意**  
Amazon RDS 与目标分析仓库中的数据类型存在差异。有关数据类型映射的表，请参阅[RDS 和 Amazon Redshift 数据库之间的数据类型差异](#zero-etl.data-type-mapping)。

首先，使用您选择的 MySQL 客户端连接到源数据库。有关说明，请参阅。[连接到 MySQL 数据库实例](USER_ConnectToInstance.md)

然后，创建一个表并插入一行示例数据。

**重要**  
确保该表有主键。否则，它无法复制到目标数据仓库。

**RDS for MySQL**

以下示例使用 [MySQL Workbench 实用程序](https://dev.mysql.com/downloads/workbench/)。

```
CREATE DATABASE my_db;

USE my_db;

CREATE TABLE books_table (ID int NOT NULL, Title VARCHAR(50) NOT NULL, Author VARCHAR(50) NOT NULL,
Copyright INT NOT NULL, Genre VARCHAR(50) NOT NULL, PRIMARY KEY (ID));

INSERT INTO books_table VALUES (1, 'The Shining', 'Stephen King', 1977, 'Supernatural fiction');
```



**RDS for PostgreSQL**：

以下示例使用 `[psql](https://www.postgresql.org/docs/current/app-psql.html)` PostgreSQL 交互式终端。连接到数据库时，请包括要复制的数据库名称。

```
psql -h mydatabase.123456789012.us-east-2.rds.amazonaws.com -p 5432 -U username -d named_db;

named_db=> CREATE TABLE books_table (ID int NOT NULL, Title VARCHAR(50) NOT NULL, Author VARCHAR(50) NOT NULL,
Copyright INT NOT NULL, Genre VARCHAR(50) NOT NULL, PRIMARY KEY (ID));

named_db=> INSERT INTO books_table VALUES (1, 'The Shining', 'Stephen King', 1977, 'Supernatural fiction');
```

**RDS for Oracle**：

以下示例使用 SQL\$1Plus 连接到 RDS for Oracle 数据库。

```
sqlplus 'user_name@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=dns_name)(PORT=port))(CONNECT_DATA=(SID=database_name)))'

SQL> CREATE TABLE books_table (ID int NOT NULL, Title VARCHAR(50) NOT NULL, Author VARCHAR(50) NOT NULL,
Copyright INT NOT NULL, Genre VARCHAR(50) NOT NULL, PRIMARY KEY (ID));

SQL> INSERT INTO books_table VALUES (1, 'The Shining', 'Stephen King', 1977, 'Supernatural fiction');
```

## 在 Amazon Redshift 中查询您的 Amazon RDS 数据
<a name="zero-etl.query-data-redshift"></a>

将数据添加到 RDS 数据库后，数据会复制到目标数据库并准备好供查询。

**查询复制的数据**

1. 导航到 Amazon Redshift 控制台，然后从左侧导航窗格中选择**查询编辑器 v2**。

1. 连接到您的集群或工作组，然后从下拉菜单中选择您通过集成创建的目标数据库（本示例中为 **destination\$1database**）。有关创建目标数据库的说明，请参阅[在 Amazon Redshift 中创建目标数据库](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html#zero-etl-using.create-db)。

1. 使用 SELECT 语句来查询您的数据。在本例中，您可以运行以下命令，从您在源 RDS 数据库中创建的表中选择所有数据：

   ```
   SELECT * from my_db."books_table";
   ```  
![\[在查询编辑器中运行 SELECT 语句。结果是添加到 Amazon RDS 数据库中的单行示例数据。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/zero-etl-redshift-editor.png)
   + `my_db` 是 RDS 数据库模式名称。
   + `books_table` 是 RDS 表名称。

也可以使用命令行客户端查询数据。例如：

```
destination_database=# select * from my_db."books_table";

 ID |       Title |        Author |   Copyright |                  Genre |  txn_seq |  txn_id
----+–------------+---------------+-------------+------------------------+----------+--------+
  1 | The Shining |  Stephen King |        1977 |   Supernatural fiction |        2 |   12192
```

**注意**  
为了区分大小写，请对架构、表和列名使用双引号（" "）。有关更多信息，请参阅 [enable\$1case\$1sensitive\$1identifier](https://docs.aws.amazon.com/redshift/latest/dg/r_enable_case_sensitive_identifier.html)。

## RDS 和 Amazon Redshift 数据库之间的数据类型差异
<a name="zero-etl.data-type-mapping"></a>

下面的表显示 RDS for MySQL、RDS for PostgreSQL 和 RDS for Oracle 数据类型与相应目标数据类型的映射。*Amazon RDS 目前仅支持将这些数据类型用于零 ETL 集成。*

如果源数据库中的表包含不受支持的数据类型，则该表将不同步并且目的地目标无法使用该表。从源到目标的流式传输仍在继续，但数据类型不受支持的表不可用。要修复该表并使其在目标目的地中可用，您必须手动恢复重大更改，然后通过运行 `[ALTER DATABASE...INTEGRATION REFRESH](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_DATABASE.html)` 来刷新集成。

**注意**  
您无法刷新与 Amazon SageMaker 智能湖仓的零 ETL 集成。而是应删除并尝试重新创建集成。

**Topics**
+ [RDS for MySQL](#zero-etl.data-type-mapping-mysql)
+ [RDS for PostgreSQL](#zero-etl.data-type-mapping-postgres)
+ [RDS for Oracle](#zero-etl.data-type-mapping-oracle)

### RDS for MySQL
<a name="zero-etl.data-type-mapping-mysql"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/zero-etl.querying.html)

### RDS for PostgreSQL
<a name="zero-etl.data-type-mapping-postgres"></a>

RDS for PostgreSQL 的零 ETL 集成不支持自定义数据类型或由扩展创建的数据类型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/zero-etl.querying.html)

### RDS for Oracle
<a name="zero-etl.data-type-mapping-oracle"></a>

**不支持的数据类型**

Amazon Redshift 不支持以下 RDS for Oracle 数据类型：
+ `ANYDATA`
+ `BFILE`
+ `REF`
+ `ROWID`
+ `UROWID`
+ `VARRAY`
+ `SDO_GEOMETRY`
+ 用户定义的数据类型

**数据类型差异**

下表显示了当 RDS for Oracle 为源而 Amazon Redshift 为目标时，影响零 ETL 集成的数据类型差异。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/zero-etl.querying.html)

## 适用于 RDS for PostgreSQL 的 DDL 操作
<a name="zero-etl.ddl-postgres"></a>

Amazon Redshift 源自 PostgreSQL，由于具有共同的 PostgreSQL 架构，因此它与 RDS for PostgreSQL 共享多项功能。零 ETL 集成利用这些相似之处来简化从 RDS for PostgreSQL 到 Amazon Redshift 的数据复制，从而按名称映射数据库并利用共享的数据库、架构和表结构。

管理 RDS for PostgreSQL 零 ETL 集成时应考虑以下几点：
+ 隔离是在数据库级别进行管理。
+ 复制发生在数据库级别。
+ RDS for PostgreSQL 数据库按名称映射到 Amazon Redshift 数据库，如果原始 Redshift 数据库被重命名，则数据将流向相应的已重命名的数据库。

尽管 Amazon Redshift 和 RDS for PostgreSQL 有相似之处，但也存在重大差异。以下各节概述了 Amazon Redshift 系统对常见 DDL 操作的响应。

**Topics**
+ [数据库操作](#zero-etl.ddl-postgres-database)
+ [架构操作](#zero-etl.ddl-postgres-schema)
+ [表操作](#zero-etl.ddl-postgres-table)

### 数据库操作
<a name="zero-etl.ddl-postgres-database"></a>

下表显示了系统对数据库 DDL 操作的响应。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/zero-etl.querying.html)

### 架构操作
<a name="zero-etl.ddl-postgres-schema"></a>

下表显示了系统对架构 DDL 操作的响应。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/zero-etl.querying.html)

### 表操作
<a name="zero-etl.ddl-postgres-table"></a>

下表显示了系统对表 DDL 操作的响应。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/zero-etl.querying.html)

# 查看和监控 Amazon RDS 零 ETL 集成
<a name="zero-etl.describingmonitoring"></a>

您可以查看 Amazon RDS 零 ETL 集成的详细信息，以查看其配置信息和当前状态。您还可以通过在 Amazon Redshift 中查询特定的系统视图来监控集成的状态。此外，Amazon Redshift 向 Amazon CloudWatch 发布某些与集成相关的指标，您可以在 Amazon Redshift 控制台中查看这些指标。

**Topics**
+ [查看集成](#zero-etl.describing)
+ [对于 Amazon Redshift 使用系统表监控集成](#zero-etl.monitoring)
+ [监控与适用于 Amazon Redshift 的 Amazon EventBridge 的集成](#zero-etl.eventbridge)

## 查看集成
<a name="zero-etl.describing"></a>

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 来查看 Amazon RDS 零 ETL 集成。

### 控制台
<a name="zero-etl.describing-console"></a>

**查看零 ETL 集成的详细信息**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 从左侧导航窗格中，选择**零 ETL 集成**。

1. 选择一个集成以查看其详细信息，例如其源数据库和目标数据仓库。  
![\[有关零 ETL 集成的详细信息\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/zero-etl-integration-view.png)

集成可以具有以下状态：
+ `Creating` – 正在创建集成。
+ `Active` – 集成正在将事务数据发送到目标数据仓库。
+ `Syncing` – 集成遇到了可恢复的错误，正在重新设置数据种子。受影响的表在完成重新同步之前不可用于查询。
+ `Needs attention` – 集成遇到了需要手动干预才能解决的事件或错误。要修复问题，请按照集成详细信息页面上错误消息中的说明修复问题。
+ `Failed` – 集成遇到了无法恢复的事件或错误，无法修复。您必须删除并重新创建集成。
+ `Deleting` – 正在删除集成。

### AWS CLI
<a name="zero-etl.describing-cli"></a>

要使用 AWS CLI 查看当前账户中的所有 零 ETL 集成，请使用 [describe-integrations](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-integrations.html) 命令并指定 `--integration-identifier` 选项。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds describe-integrations \
    --integration-identifier ee605691-6c47-48e8-8622-83f99b1af374
```
对于：Windows  

```
aws rds describe-integrations ^
    --integration-identifier ee605691-6c47-48e8-8622-83f99b1af374
```

### RDS API
<a name="zero-etl.describing-api"></a>

要使用 Amazon RDS API 查看零 ETL 集成，请结合 `IntegrationIdentifier` 参数使用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeIntegrations.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeIntegrations.html) 操作。

## 对于 Amazon Redshift 使用系统表监控集成
<a name="zero-etl.monitoring"></a>

Amazon Redshift 具有包含系统运行方式相关信息的系统表和视图。您可以像查询任何其他数据库表那样查询这些系统表和视图。有关 Amazon Redshift 中的系统表和视图的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》**中的[系统表和视图参考](https://docs.aws.amazon.com//redshift/latest/dg/cm_chap_system-tables.html)。

您可以查询以下系统视图和表，以获取有关 零 ETL 集成的信息：
+  [SVV\$1INTEGRATION](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_INTEGRATION.html) – 为您的集成提供配置详细信息。
+ [SVV\$1INTEGRATION\$1TABLE\$1STATE](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_INTEGRATION_TABLE_STATE.html) – 描述集成中每个表的状态。
+ [SYS\$1INTEGRATION\$1TABLE\$1STATE\$1CHANGE](https://docs.aws.amazon.com/redshift/latest/dg/r_SYS_INTEGRATION_TABLE_STATE_CHANGE.html) – 显示集成的表状态更改日志。
+ [SYS\$1INTEGRATION\$1ACTIVITY](https://docs.aws.amazon.com/redshift/latest/dg/r_SYS_INTEGRATION_ACTIVITY.html) – 提供有关已完成的集成运行的信息。

所有集成相关的 Amazon CloudWatch 指标均源自 Amazon Redshift。有关更多信息，请参阅《Amazon Redshift 管理指南》**中的[零 ETL 集成的指标](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.monitoring.html)。目前，Amazon RDS 不向 Amazon CloudWatch 发布任何与集成相关的指标。

## 监控与适用于 Amazon Redshift 的 Amazon EventBridge 的集成
<a name="zero-etl.eventbridge"></a>

Amazon Redshift 会将集成相关的事件发送到 Amazon EventBridge。有关事件及其相应事件 ID 的列表，请参阅《Amazon Redshift 管理指南》中的[与 Amazon EventBridge 的零 ETL 集成事件通知](https://docs.aws.amazon.com/redshift/latest/mgmt/integration-event-notifications)。**

# 修改 Amazon RDS 零 ETL 集成
<a name="zero-etl.modifying"></a>

您只能在受支持的数据仓库中修改零 ETL 集成的名称、描述和数据筛选选项。您无法修改用于加密集成的 AWS KMS 密钥，也无法修改源数据库或目标数据库。

如果您将数据筛选条件添加到现有集成中，Amazon RDS 会重新评估筛选条件，就好像此筛选条件一直存在一样。它会移除当前位于目标数据仓库中，但与新筛选标准不匹配的所有数据。如果您从集成中*移除* 数据筛选条件，它会将以前不符合筛选标准（但现在符合）的所有数据复制到目标数据仓库中。有关更多信息，请参阅 [Amazon RDS 零 ETL 集成的数据筛选](zero-etl.filtering.md)。

您可以使用 AWS 管理控制台、AWS CLI 或 Amazon RDS API 修改零 ETL 集成。

## RDS 控制台
<a name="modify-integration-console"></a>

**修改零 ETL 集成**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在导航窗格中，选择**零 ETL 集成**，然后选择要修改的集成。

1. 选择**修改**，然后对任何可用设置进行修改。

1. 当所有更改都达到您的要求时，选择**修改**。

## AWS CLI
<a name="modify-integration-cli"></a>

要使用 AWS CLI 修改零 ETL 集成，请调用 [modify-integration](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-integration.html) 命令。与 `--integration-identifier` 一起，指定以下任意选项：
+ `--integration-name` – 为集成指定新名称。
+ `--description` – 为集成指定新描述。
+ `--data-filter` – 为集成指定数据筛选选项。有关更多信息，请参阅 [Amazon RDS 零 ETL 集成的数据筛选](zero-etl.filtering.md)。

**Example**  
以下请求修改现有集成。  
对于 Linux、macOS 或 Unix：  

```
aws rds modify-integration \
    --integration-identifier ee605691-6c47-48e8-8622-83f99b1af374 \
    --integration-name my-renamed-integration
```
对于 Windows：  

```
aws rds modify-integration ^
    --integration-identifier ee605691-6c47-48e8-8622-83f99b1af374 ^
    --integration-name my-renamed-integration
```

## RDS API
<a name="modify-integration-api"></a>

要使用 RDS API 修改零 ETL 集成，请调用 [ModifyIntegration](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyIntegration.html) 操作。指定集成标识符，以及您要修改的参数。

# 删除 Amazon RDS 零 ETL 集成
<a name="zero-etl.deleting"></a>

当您删除零 ETL 集成时，Amazon RDS 会将其从源数据库中删除。事务数据不会从 Amazon RDS 或分析目标中删除，但 Amazon RDS 不会向 Amazon Redshift 或 Amazon SageMaker 发送新数据。

只有当集成的状态为 `Active`、`Failed`、`Syncing` 或 `Needs attention` 时，您才能将其删除。

您可以使用 AWS 管理控制台、AWS CLI 或 RDS API 删除零 ETL 集成。

## 控制台
<a name="zero-etl.deleting-console"></a>

**删除零 ETL 集成**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 从左侧导航窗格中，选择**零 ETL 集成**。

1. 选择要删除的零 ETL 集成。

1. 依次选择**操作**和**删除**，然后确认删除。

## AWS CLI
<a name="zero-etl.deleting-cli"></a>

要删除零 ETL 集成，请使用 [delete-integration](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-integration.html) 命令并指定 `--integration-identifier` 选项。

**Example**  
对于 Linux、macOS 或 Unix：  

```
aws rds delete-integration \
    --integration-identifier ee605691-6c47-48e8-8622-83f99b1af374
```
对于 Windows：  

```
aws rds delete-integration ^
    --integration-identifier ee605691-6c47-48e8-8622-83f99b1af374
```

## RDS API
<a name="zero-etl.deleting-api"></a>

要使用 Amazon RDS API 删除零 ETL 集成，请结合 `IntegrationIdentifier` 参数使用 [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteIntegration.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DeleteIntegration.html) 操作。

# Amazon RDS 零 ETL 集成故障排除
<a name="zero-etl.troubleshooting"></a>

您可以通过在分析目标中查询 [SVV\$1INTEGRATION](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_INTEGRATION.html) 系统表来检查零 ETL 集成的状态。如果 `state` 列的值为 `ErrorState`，则表示有问题。有关更多信息，请参阅 [对于 Amazon Redshift 使用系统表监控集成](zero-etl.describingmonitoring.md#zero-etl.monitoring)。

使用以下信息来排查 Amazon RDS 零 ETL 集成的常见问题。

**重要**  
重新同步和刷新操作不适用于与 Amazon SageMaker AI 智能湖仓的零 ETL 集成。如果集成存在问题，则必须删除该集成并创建新的集成。您无法刷新或重新同步现有的集成。

**Topics**
+ [我无法创建零 ETL 集成](#zero-etl.troubleshooting.creation)
+ [我的集成卡在 `Syncing` 状态](#zero-etl.troubleshooting.syncing)
+ [我的表未复制到 Amazon Redshift](#zero-etl.troubleshooting.primarykey)
+ [我的一个或多个 Amazon Redshift 表需要重新同步](#zero-etl.troubleshooting.resync)
+ [Amazon SageMaker AI 智能湖仓零 ETL 集成的集成失败问题](#zero-etl.troubleshooting.integration-issues)

## 我无法创建零 ETL 集成
<a name="zero-etl.troubleshooting.creation"></a>

如果您无法创建零 ETL 集成，请确保源数据库的以下内容正确无误：
+ 源数据库必须运行受支持的数据库引擎版本。有关受支持的版本的列表，请参阅 [支持 Amazon RDS 零 ETL 集成的区域和数据库引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.ZeroETL.md)。
+  您正确配置了数据库参数。如果所需参数设置得不正确或与数据库不关联，则创建将失败。请参阅[步骤 1：创建自定义数据库参数组](zero-etl.setting-up.md#zero-etl.parameters)。

此外，请确保您的数据仓库在以下方面正确无误：
+ 已启用区分大小写。请参阅[为您的数据仓库开启区分大小写](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-setting-up.case-sensitivity)。
+ 您添加了正确的授权主体和集成源。请参阅[为您的 Amazon Redshift 数据仓库配置授权](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.setting-up.html#zero-etl-using.redshift-iam)。
+ 数据仓库已加密（如果它是预调配集群）。请参阅 [Amazon Redshift 数据库加密](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-db-encryption.html)。

## 我的集成卡在 `Syncing` 状态
<a name="zero-etl.troubleshooting.syncing"></a>

如果您更改其中一个必需的数据库集群参数的值，则集成状态可能会始终显示为 `Syncing`。

要修复此问题，请检查与源数据库关联的参数组中的参数值，并确保它们与所需值相匹配。有关更多信息，请参阅 [步骤 1：创建自定义数据库参数组](zero-etl.setting-up.md#zero-etl.parameters)。

如果您修改任何参数，请务必重启数据库来应用更改。

## 我的表未复制到 Amazon Redshift
<a name="zero-etl.troubleshooting.primarykey"></a>

如果您没有看到一个或多个表反映在 Amazon Redshift 中，可以运行以下命令来重新同步表：

```
ALTER DATABASE dbname INTEGRATION REFRESH TABLES table1, table2;
```

有关更多信息，请参阅《Amazon Redshift SQL 参考》中的 [ALTER DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_DATABASE.html)。

您的数据可能未复制，因为一个或多个源表没有主键。Amazon Redshift 中的监控控制面板将这些表的状态显示为 `Failed`，而总体零 ETL 集成的状态更改为 `Needs attention`。要解决此问题，您可以在表中确定一个可以成为主键的现有键，也可以添加合成主键。有关详细解决方案，请参阅 [Handle tables without primary keys while creating Amazon Aurora MySQL or Amazon RDS for MySQL zero-ETL integrations with Amazon Redshift](https://aws.amazon.com/blogs/database/handle-tables-without-primary-keys-while-creating-amazon-aurora-mysql-or-amazon-rds-for-mysql-zero-etl-integrations-with-amazon-redshift/)。

## 我的一个或多个 Amazon Redshift 表需要重新同步
<a name="zero-etl.troubleshooting.resync"></a>

在源数据库上运行某些命令可能需要重新同步您的表。在这些情况下，[SVV\$1INTEGRATION\$1TABLE\$1STATE](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_INTEGRATION_TABLE_STATE.html) 系统视图显示 `table_state` 为 `ResyncRequired`，这意味着集成必须将该特定表的数据从 MySQL 完全重新加载到 Amazon Redshift。

当表开始重新同步时，它进入 `Syncing` 状态。您无需执行任何手动操作即可重新同步表。在表数据重新同步时，您无法在 Amazon Redshift 中访问这些数据。

以下是一些可以使表进入 `ResyncRequired` 状态的示例操作，以及可供考虑的可能替代方案。


| 操作 | 示例 | 或者 | 
| --- | --- | --- | 
| 在特定位置添加一列  |  <pre>ALTER TABLE table_name<br />  ADD COLUMN column_name INTEGER<br />  NOT NULL first;</pre>  | Amazon Redshift 不支持使用 first 或 after 关键字将列添加到特定位置。如果目标表中列的顺序不重要，请使用更简单的命令将该列添加到表的末尾：<pre>ALTER TABLE table_name<br />  ADD COLUMN column_name column_type;</pre> | 
| 使用默认 CURRENT\$1TIMESTAMP 添加时间戳列 |  <pre>ALTER TABLE table_name<br />  ADD COLUMN column_name TIMESTAMP<br />  NOT NULL DEFAULT CURRENT_TIMESTAMP;</pre>  | 现有表行的 CURRENT\$1TIMESTAMP 值由 RDS for MySQL 计算，如果不进行完整表数据重新同步，就无法在 Amazon Redshift 中进行模拟。如果可能，请将默认值切换为文本常量（例如 `2023-01-01 00:00:15`），以避免表可用性出现延迟。 | 
| 在单个命令中执行多个列操作 |  <pre>ALTER TABLE table_name<br />  ADD COLUMN column_1,<br />  RENAME COLUMN column_2 TO column_3;</pre>  | 考虑将命令拆分为两个单独的操作（ADD 和 RENAME），这不需要重新同步。 | 

## Amazon SageMaker AI 智能湖仓零 ETL 集成的集成失败问题
<a name="zero-etl.troubleshooting.integration-issues"></a>

如果您在现有的与 Amazon SageMaker AI 智能湖仓的零 ETL 集成中遇到问题，唯一的解决方案是删除该集成并创建一个新的集成。与其它 AWS 服务不同，零 ETL 集成不支持刷新或重新同步操作。

解决集成问题：

1. 使用控制台、CLI 或 API 删除有问题的零 ETL 集成。

1. 验证源数据库和目标数据仓库的配置是否正确。

1. 使用相同或更新的配置创建新的零 ETL 集成。

此过程将导致完全重新初始化数据管道，这可能需要一些时间，具体取决于源数据库的大小。