![](/img/trans.png)
[英]How to log SQL queries on a Google Cloud SQL PostgreSQL 11 instance?
[英]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]
參考:
log_min_duration_statement
CTRL+F): https : log_min_duration_statement
目前無法監控 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.