

# 在副本中捕获 Aurora PostgreSQL 执行计划
<a name="AuroraPostgreSQL.QPM.Plancapturereplicas"></a>

QPM（查询计划管理）允许您捕获由 Aurora 副本生成的查询计划并将其存储在 Aurora 数据库集群的主数据库实例上。您可以从所有 Aurora 副本中收集查询计划，并在主实例的中央永久表中维护一组最佳计划。然后，您可以在需要时将这些计划应用于其他副本。这将有助于您保持执行计划的稳定性，并跨数据库集群和引擎版本提高查询性能。

**Topics**
+ [先决条件](#AuroraPostgreSQL.QPM.Plancapturereplicas.Prereq)
+ [管理 Aurora 副本的计划捕获](#AuroraPostgreSQL.QPM.Plancapturereplicas.managing)
+ [故障排除](#AuroraPostgreSQL.QPM.Plancapturereplicas.Troubleshooting)

## 先决条件
<a name="AuroraPostgreSQL.QPM.Plancapturereplicas.Prereq"></a>

**在 Aurora 副本中开启 `capture_plan_baselines parameter`** - 将 `capture_plan_baselines` 参数设置为自动或手动在 Aurora 副本中捕获计划。有关更多信息，请参阅 [apg\$1plan\$1mgmt.capture\$1plan\$1baselines](AuroraPostgreSQL.Optimize.Parameters.md#AuroraPostgreSQL.Optimize.Parameters.capture_plan_baselines)。

**安装 postgres\$1fdw 扩展** - 必须安装 `postgres_fdw` 外部数据包装器扩展才能在 Aurora 副本中捕获计划。要安装扩展，请在每个数据库中运行以下命令。

```
postgres=> CREATE EXTENSION IF NOT EXISTS postgres_fdw;
```

## 管理 Aurora 副本的计划捕获
<a name="AuroraPostgreSQL.QPM.Plancapturereplicas.managing"></a>

**开启 Aurora 副本的计划捕获**  
您必须具有 `rds_superuser` 权限才能在 Aurora 副本中创建或删除计划捕获。有关用户角色和权限的更多信息，请参阅[了解 PostgreSQL 角色和权限](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.Roles.html)。

要捕获计划，请在写入器数据库实例中调用 apg\$1plan\$1mgmt.create\$1replica\$1plan\$1capture 函数，如下所示：

```
postgres=> CALL apg_plan_mgmt.create_replica_plan_capture('endpoint', 'password');
```
+ 端点：Aurora Global Database 写入器端点或 cluster\$1endpoint 为 Aurora 副本中的计划捕获提供失效转移支持。

  有关 Aurora Global Database 写入器端点的更多信息，请参阅[查看 Amazon Aurora Global Database 的端点](aurora-global-database-connecting.md#viewing-endpoints)。

  有关集群端点的更多信息，请参阅 [Amazon Aurora 的集群端点](Aurora.Endpoints.Cluster.md)。
+ password - 我们建议您在创建密码时遵循以下准则以增强安全性：
  + 必须至少包含 8 个字符。
  + 必须包含至少一个大写字母、一个小写字母和一个数字。
  + 必须至少包含一个特殊字符（`?`、`!`、`#`、`<`、`>`、`*` 等等）。

**注意**  
如果您更改了端点、密码或端口号，则必须使用端点和密码再次运行 `apg_plan_mgmt.create_replica_plan_capture()`，才能重新初始化计划捕获。否则，从 Aurora 副本中捕获计划将失败。

**关闭 Aurora 副本的计划捕获**  
您可以通过在参数组中将 Aurora 副本中的参数 `capture_plan_baselines` 设置为 `off`，来将其关闭。

**删除 Aurora 副本的计划捕获**  
您可以在 Aurora 副本中完全删除计划捕获，但要确保在删除之前执行相关操作。要删除计划捕获，请调用 `apg_plan_mgmt.remove_replica_plan_capture`，如下所示：

```
postgres=> CALL apg_plan_mgmt.remove_replica_plan_capture();
```

您必须再次调用 apg\$1plan\$1mgmt.create\$1replica\$1plan\$1capture()，才能使用端点和密码在 Aurora 副本中开启计划捕获。

## 故障排除
<a name="AuroraPostgreSQL.QPM.Plancapturereplicas.Troubleshooting"></a>

下文介绍了 Aurora 副本中未按预期捕获计划的排查思路和解决方法。
+ **参数设置** - 检查 `capture_plan_baselines` 参数是否设置为正确的值以开启计划捕获。
+ **`postgres_fdw` 扩展已安装** - 使用以下查询来检查 `postgres_fdw` 是否已安装。

  ```
  postgres=> SELECT * FROM pg_extension WHERE extname = 'postgres_fdw'
  ```
+ **create\$1replica\$1plan\$1capture() 已调用** - 使用以下命令检查用户映射是否退出。否则，请调用 `create_replica_plan_capture()` 以初始化该功能。

  ```
  postgres=> SELECT * FROM pg_foreign_server WHERE srvname = 'apg_plan_mgmt_writer_foreign_server';
  ```
+ **集群端点和端口号**：检查端点和端口号是否合适。如果这些值不正确，则不会显示任何错误消息。

  使用以下命令验证是否在 create() 中使用了终端节点，并检查它位于哪个数据库中：

  ```
  postgres=> SELECT srvoptions FROM pg_foreign_server WHERE srvname = 'apg_plan_mgmt_writer_foreign_server';
  ```
+ **reload()** - 在 Aurora 副本中调用 apg\$1plan\$1mgmt.delete\$1plan() 之后，必须调用 apg\$1plan\$1mgmt.reload() 才能使删除函数生效。这将确保更改成功实施。
+ **Password** - 您必须按照上述准则在 create\$1replica\$1plan\$1capture() 中输入密码。否则，您将会收到错误消息。有关更多信息，请参阅[管理 Aurora 副本的计划捕获](#AuroraPostgreSQL.QPM.Plancapturereplicas.managing)。使用其他符合要求的密码。
+ **跨区域连接** - Aurora 全局数据库还支持 Aurora 副本中的计划捕获，其中写入器实例和 Aurora 副本可以位于不同的区域。确保在失效转移或切换事件发生后，使用 Aurora Global Database 写入器端点来保持连接。有关 Aurora Global Database 端点的更多信息，请参阅[查看 Amazon Aurora Global Database 的端点](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-global-database-connecting.html#viewing-endpoints)。写入器实例和跨区域副本必须能够使用 VPC 对等进行通信。有关更多信息，请参阅 [VPC 对等](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html)。如果发生跨区域故障转移，则必须将终端节点重新配置为新的主数据库集群终端节点。
**注意**  
使用集群端点而不是 Aurora Global Database 写入器端点时，您将需要在执行全局失效转移或切换操作后更新集群端点。