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

Logging slow queries on Google Cloud SQL PostgreSQL instances

我工作的公司使用 Google 云 SQL 来管理生产中的 SQL 数据库。

我们遇到了性能问题,我认为 see/monitor 所有超过特定阈值(例如 250 毫秒)的查询是个好主意。

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

log_min_duration_statement (integer)

Causes the duration of each completed statement to be logged if the statement ran for at least the specified number of milliseconds. Setting this to zero prints all statement durations.

但是从 Cloud SQL 文档来看,我发现只能设置一组狭窄的数据库标志(如每个数据库实例),但正如您可以从 here log_min_duration_statement 不在支持的标志中。

那么问题来了。我如何使用 Google Cloud SQL log/monitor 我缓慢的 PostgreSQL 查询?如果不可能,那么您建议我使用哪种 tool/methodologies 来获得类似的结果?

监控云 SQL 实例的缓慢 PostgreSQL 查询的可能性当前不可用。正如您评论的那样,Cloud SQL 目前不支持 log_min_duration_statement 标志。

目前,正在努力将此功能添加到 Cloud SQL,您可以跟踪通过 this link 取得的进展。您可以单击左上角的星形图标,在取得任何重大进展时收到电子邮件通知。

无论如何都不理想,但我们所做的是 运行 每分钟在 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

您需要 fiddle 查询以获得毫秒粒度,即使那样它也只会捕获与您的 cron 频率重叠的查询,但总比没有好吧?

有一种方法可以通过 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 用户,您可以查看所有慢速查询,但由于该用户不是超级用户,您将看到 <insufficient privilege> 所有其他用户的查询。 要绕过此限制,您也可以在其他数据库上安装扩展(通常只有 postgres 用户有权安装扩展)并且您可以与数据库所有者核对查询文本。

2019 年 4 月 3 日更新

现在可以在Google云SQLPostgre[=44=上记录慢速查询] 实例,参见 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 日志记录查看日志。 Select Cloud SQL Database -> cloudsql.googleapis.com/postgres.log 你会看到这样的日志。

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

参考文献: