在Google Cloud SQL PostgreSQL实例中记录慢查询

17

我所在的公司使用Google Cloud SQL来管理他们在生产环境中的SQL数据库。

我们遇到了性能问题,我认为(除其他措施外),查看/监视所有查询时间超过特定阈值(例如250毫秒)是个好主意。

通过查看PostgreSQL文档,我认为log_min_duration_statement似乎是我需要的标志。

log_min_duration_statement(整数)

如果语句运行时间至少达到指定的毫秒数,则记录每个完成语句的持续时间。将其设置为零可打印所有语句持续时间。

但从Cloud SQL文档中可以看出,只能设置一小部分数据库标志(如针对每个DB实例),但正如您可以从这里看到的那样,log_min_duration_statement不属于其中支持的标志。

因此,问题来了。如何使用Google Cloud SQL记录/监视我的慢速PostgreSQL查询?如果不可能,那么您建议我使用什么样的工具/方法来实现类似的结果?


最近添加了一个支持 log_min_duration_statement 的标志。 - Will Hua
这就是被接受的答案所说的。https://dev59.com/t1UL5IYBdhLWcg3wk4zK#55575830 - Francesco Casula
4个回答

33

2019年4月3日更新

现在可以在Google Cloud SQL PostgreSQL实例中记录慢查询,详情请参见:https://cloud.google.com/sql/docs/release-notes#april_3_2019:

database_flags = [
  {
    name = "log_min_duration_statement"
    value = "1000"
  },
]

启用 log_min_duration_statement 后,您可以使用 Stackdriver 日志查看日志。选择 Cloud SQL 数据库 - > cloudsql.googleapis.com/postgres.log, 您将会看到这样的日志。

[103402]: [9-1] db=cloudsqladmin,user=cloudsqladmin LOG: duration: 11.211 ms statement: [YOUR SQL HERE]

参考文献:


2
一旦启用 log_min_duration_statement,我在哪里可以查看日志? - Metalhead1247
2
@Metalhead1247,你找到如何做到那个了吗? - Lulu

8
目前,Cloud SQL实例无法监控缓慢的PostgreSQL查询。正如您所提到的,Cloud SQL当前不支持log_min_duration_statement标志。目前,我们正在努力为Cloud SQL添加此功能,并且您可以通过此链接了解进展情况。您可以在左上角点击星形图标以获取电子邮件通知,每当取得重大进展时,都会向您发出通知。

1
哇,这是一个非常基本的功能,居然没有提供。 - mattes

3

通过Cloud SQL支持的pg_stat_statements扩展,有一种记录缓慢查询的方法。

由于Cloud SQL不会授予任何用户超级用户权限,因此您需要使用某些解决方法。首先,您需要启用扩展:

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

然后您可以使用类似的查询来检查慢查询。
SELECT pd.datname,
       us.usename,
       pss.userid,
       pss.query                         AS SQLQuery,
       pss.rows                          AS TotalRowCount,
       (pss.total_time / 1000)           AS TotalSecond,
       ((pss.total_time / 1000) / calls) as TotalAverageSecond
FROM pg_stat_statements AS pss
       INNER JOIN pg_database AS pd
                  ON pss.dbid = pd.oid
       INNER JOIN pg_user AS us
                  ON pss.userid = us.usesysid
ORDER BY TotalAverageSecond DESC
LIMIT 10;

作为postgres用户,您可以查看所有慢查询,但由于该用户不是超级用户,您将在其他用户的查询中看到<权限不足>。 为了解决这个限制,您可以在其他数据库上安装扩展(通常只有postgres用户有权安装扩展),然后可以与数据库所有者一起检查查询文本。

1
你的意思是“你也可以在其他数据库上安装扩展”,但我不明白这如何帮助我解决“权限不足”的问题。 - aodj
我已经启用了扩展并重新启动了SQL实例,但在重载下运行24小时后,在pg_stat_statements中没有看到任何行。此外,该表仅包含三列:useriddbidqueryid - runeks
更新:在运行“SELECT pg_stat_statements_reset()”重置“pg_stat_statements”表后,我现在可以看到表中的行。 - runeks

2

虽然不是理想的方法,但我们会在cron上每分钟运行类似以下内容的代码,并记录输出结果:

SELECT EXTRACT(EPOCH FROM now() - query_start) AS seconds, query
 FROM  pg_stat_activity 
 WHERE state = 'active' AND now() - query_start > interval '1 seconds' AND query NOT LIKE '%pg_stat_activity%'
 ORDER BY seconds DESC LIMIT 20

如果需要毫秒级别的精度,您需要调整查询,并且即使如此,它也只能捕获与cron频率重叠的查询,但可能比没有好?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接