我想对 Amazon Aurora PostgreSQL 兼容版数据库 (DB) 集群上运行的查询出现的语句超时错误进行故障排除。
解决方法
重要事项:性能详情将于 2026 年 6 月 30 日到期。您可以在 2026 年 6 月 30 日之前升级到数据库洞察的高级模式。如果您不进行升级,则使用性能详情的数据库集群将默认采用数据库洞察的标准模式。只有数据库洞察的高级模式才支持执行计划和按需分析。如果您的集群默认采用标准模式,则您可能无法在控制台上使用这些功能。要开启高级模式,请参阅开启适用于 Amazon RDS 的数据库洞察的高级模式和开启适用于 Amazon Aurora 的数据库洞察的高级模式。
如果查询未能在 statement_timeout 参数指定的时间内执行,则 statement_timeout 参数会取消查询。您会收到以下错误消息:
"ERROR: canceling statement due to statement timeout."
要对此错误进行故障排除,请执行以下操作。
检查已配置的 statement_timeout 参数
要检查数据库集群参数组或数据库参数组中的 statement_timeout 参数,请运行以下 SELECT 查询:
SELECT name, setting, unit, context, source FROM pg_settings WHERE name = 'statement_timeout';
预期输出:
name | setting | unit | context | source
-------------------+---------+------+---------+--------------------
statement_timeout | 5000 | ms | user | configuration file
**注意:**在示例输出中,statement_timeout 参数的值为 5000 毫秒。"source" 字段显示 "configuration file",这表示参数是在集群参数组级别设置的。
然后,检查角色级别和数据库级别的 statement_timeout 参数。
要检查数据库集群中所有角色的角色级别配置,请运行以下查询:
SELECT r.rolname, d.datname, s.setconfig
FROM pg_db_role_setting s
JOIN pg_roles r ON r.oid = s.setrole
LEFT JOIN pg_database d ON d.oid = s.setdatabase
WHERE s.setconfig::text LIKE '%statement_timeout%'
ORDER BY r.rolname;
要检查集群中所有数据库的数据库级别配置,请运行以下查询:
SELECT d.datname, rs.setconfig
FROM pg_db_role_setting rs
JOIN pg_database d ON d.oid = rs.setdatabase
WHERE rs.setrole = 0;
查看输出,确定是否存在角色级别或数据库级别设置的 statement_timeout 配置,这些配置可能会覆盖集群级别的设置。
**注意:**使用 ALTER ROLE SET 设置的 Statement_timeout 参数不会继承给子角色。如果为某个角色配置了 statement_timeout 参数,则只能在登录该角色时使用该参数。有关详细信息,请参阅 PostgreSQL 网站上的 ALTER ROLE。
识别已取消的 SQL 查询
查看 PostgreSQL 错误日志文件,然后确定 log_min_error_statement 参数是否设置为 ERROR 或更低的严重性。识别出失败的语句后,查找失败的 SQL 和表名。有关更多信息,请参阅了解 log_line_prefix 参数。
识别查询执行时间过长的原因
如果找到了失败的 SQL 查询,则使用 CloudWatch 数据库洞察来识别被阻止的事务。
要使用 CloudWatch 数据库洞察分析性能,请完成以下步骤:
- 打开 Amazon Relational Database Service (Amazon RDS) 控制台。
- 在导航窗格中,选择 Databases(数据库)。
- 选择您的 Aurora PostgreSQL 数据库集群。
- 选择 Monitoring(监控)选项卡。
- 对于性能详情,选择 View details(查看详细信息)。
- 查看数据库负载。您可以按等待事件、SQL 查询、主机或用户对数据库负载进行分组,以便识别被阻止的事务。
如果问题持续复现,则为数据库实例配置 log_min_duration_statement 参数并使用 auto_explain 模块。有关详细信息,请参阅如何记录 Amazon RDS PostgreSQL 或 Aurora PostgreSQL 查询的执行计划以调优查询性能?
您也可以使用 EXPLAIN 和 EXPLAIN ANALYZE 命令来过去查询执行计划。有关详细信息,请参阅如何确定我的 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版数据库实例中的性能问题和运行缓慢的查询并对其进行故障排除?
检查源表中的死行
死行或死元组会增加 SELECT 耗时。要检查源表中是否存在大量死行,请运行以下查询:
SELECT * FROM pg_stat_user_tables WHERE relname = 'table_name';
**注意:**请将 table_name 替换为源表的名称。
相关信息
如何结束我的 Amazon RDS for PostrgreSQL 或 Aurora PostgreSQL 兼容版数据库实例中长时间运行的查询?
如何确定 Amazon RDS PostgreSQL 或 Aurora PostgreSQL 数据库实例上的查询被阻止的原因?