簡體   English   中英

在 Google Cloud SQL PostgreSQL 實例上記錄慢查詢

[英]Logging slow queries on Google Cloud SQL PostgreSQL instances

我工作的公司使用 Google Cloud SQL 來管理生產中的 SQL 數據庫。

我們遇到了性能問題,我認為查看/監控高於特定閾值(例如 250 毫秒)的所有查詢是一個好主意(除其他外)。

通過查看PostgreSQL 文檔,我認為log_min_duration_statement似乎是我需要的標志。

log_min_duration_statement(整數)

如果語句至少運行了指定的毫秒數,則導致記錄每個已完成語句的持續時間。 將此設置為零會打印所有語句持續時間。

但是從 Cloud SQL 文檔來看,我看到只能設置一組狹窄的數據庫標志(如每個數據庫實例),但正如您從這里看到的那樣, log_min_duration_statement不在這些受支持的標志中。

那么問題來了。 如何使用 Google Cloud SQL 記錄/監控我的慢速 PostgreSQL 查詢? 如果不可能,那么您建議我使用哪種工具/方法來實現類似的結果?

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]

參考:

目前無法監控 Cloud SQL 實例的慢速 PostgreSQL 查詢。 正如您所評論的,Cloud SQL 目前不支持log_min_duration_statement標志。

目前,正在將此功能添加到 Cloud SQL,您可以通過此鏈接跟蹤進度。 每當取得任何重大進展時,您都可以單擊左上角的星形圖標以獲取電子郵件通知。

有一種方法可以通過 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用戶具有安裝擴展的權限),並且您可以與數據庫的所有者一起檢查查詢文本。

無論如何都不是理想的,但我們所做的是每分鍾在 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 頻率重疊的查詢,但可能總比沒有好?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM