在副本中捕获 Aurora PostgreSQL 执行计划 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

在副本中捕获 Aurora PostgreSQL 执行计划

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

先决条件

在 Aurora 副本中开启 capture_plan_baselines parameter - 将 capture_plan_baselines 参数设置为自动或手动在 Aurora 副本中捕获计划。有关更多信息,请参阅apg_plan_mgmt.capture_plan_baselines

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

postgres=> CREATE EXTENSION IF NOT EXISTS postgres_fdw;

管理 Aurora 副本的计划捕获

开启 Aurora 副本的计划捕获

您必须具有 rds_superuser 权限才能在 Aurora 副本中创建或删除计划捕获。有关用户角色和权限的更多信息,请参阅了解 PostgreSQL 角色和权限

要捕获计划,请在写入器数据库实例中调用 apg_plan_mgmt.create_replica_plan_capture 函数,如下所示:

postgres=> CALL apg_plan_mgmt.create_replica_plan_capture('cluster_endpoint', 'password');
  • cluster_endpoint-cluster_endpoint(写入器终端节点)为 Aurora 副本中的计划捕获提供故障转移支持。

  • 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_plan_mgmt.create_replica_plan_capture() 才能使用集群终端节点和密码在 Aurora 副本中开启计划捕获。

问题排查

下文介绍了 Aurora 副本中未按预期捕获计划的排查思路和解决方法。

  • 参数设置 - 检查 capture_plan_baselines 参数是否设置为正确的值以开启计划捕获。

  • postgres_fdw 扩展已安装 - 使用以下查询来检查 postgres_fdw 是否已安装。

    postgres=> SELECT * FROM pg_extension WHERE extname = 'postgres_fdw'
  • create_replica_plan_capture() 已调用 - 使用以下命令检查用户映射是否退出。否则,请调用 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_plan_mgmt.delete_plan() 之后,必须调用 apg_plan_mgmt.reload() 才能使删除函数生效。这将确保更改成功实施。

  • Password - 您必须按照上述准则在 create_replica_plan_capture() 中输入密码。否则,您将会收到错误消息。有关更多信息,请参阅管理 Aurora 副本的计划捕获。使用其它符合要求的密码。

  • 跨区域连接 - Aurora 全局数据库还支持 Aurora 副本中的计划捕获,其中写入器实例和 Aurora 副本可以位于不同的区域。写入器实例和跨区域副本必须能够使用 VPC 对等进行通信。有关更多信息,请参阅 VPC 对等。如果发生跨区域故障转移,则必须将终端节点重新配置为新的主数据库集群终端节点。