【问题标题】:Logging slow queries on Google Cloud SQL PostgreSQL instances在 Google Cloud SQL PostgreSQL 实例上记录慢查询
【发布时间】:2018-10-12 18:45:27
【问题描述】:

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

我们遇到了性能问题,我认为最好(除其他外)查看/监控所有超过特定阈值(例如 250 毫秒)的查询。

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

log_min_duration_statement(整数)

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

但从 Cloud SQL 文档来看,我看到只能设置一组狭窄的数据库标志(如每个数据库实例),但正如您从 here 看到的那样,log_min_duration_statement 不在那些受支持的标志之列.

那么问题来了。如何使用 Google Cloud SQL 记录/监控我的慢速 PostgreSQL 查询?如果不可能,那么您建议我使用哪种工具/方法来获得类似的结果?

【问题讨论】:

标签: postgresql performance monitoring google-cloud-sql


【解决方案1】:

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 Database -> cloudsql.googleapis.com/postgres.log,你会看到这样的日志。

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

参考资料:

【讨论】:

  • 启用log_min_duration_statement后在哪里可以查看日志?
  • @Metalhead1247 你有没有找到方法?
【解决方案2】:

目前无法监控 Cloud SQL 实例的慢速 PostgreSQL 查询。正如您所评论的,Cloud SQL 目前不支持 log_min_duration_statement 标志。

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

【讨论】:

  • 哇。这么基本的功能,不可用。
【解决方案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 用户,您可以查看所有慢速查询,但由于该用户不是超级用户,您将在所有其他用户的查询中看到<insufficient privilege>。 为了解决这个限制,您也可以在其他数据库上安装扩展(通常只有postgres 用户有安装扩展的权限),您可以与数据库所有者检查查询文本。

【讨论】:

  • “您也可以在其他数据库上安装扩展”是什么意思?我不明白这将如何让我解决<insufficient privilege> 问题
  • 我已启用扩展并重新启动 SQL 实例,但在高负载下运行 24 小时后,pg_stat_statements 中没有看到任何行。此外,该表仅包含三列:useriddbidqueryid
  • 更新:通过运行SELECT pg_stat_statements_reset() 重置pg_stat_statements 表后,我现在可以看到表中的行。
【解决方案4】:

无论如何都不理想,但我们所做的是每分钟在 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 频率重叠的查询,但总比没有好?

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多