PostgreSQL開(kāi)啟慢查詢(xún)?nèi)罩镜姆椒ㄔ斀?/h1>
更新時(shí)間:2025年11月18日 09:06:03 作者:檀越@新空間
PostgreSQL?可以通過(guò)配置參數(shù)來(lái)記錄執(zhí)行時(shí)間超過(guò)指定閾值的查詢(xún),即慢查詢(xún)?nèi)罩?下面小編就為大家詳細(xì)講講開(kāi)啟慢查詢(xún)?nèi)罩镜脑敿?xì)步驟吧
PostgreSQL 可以通過(guò)配置參數(shù)來(lái)記錄執(zhí)行時(shí)間超過(guò)指定閾值的查詢(xún),即慢查詢(xún)?nèi)罩?。以下是開(kāi)啟慢查詢(xún)?nèi)罩镜牟襟E:

1. 修改 postgresql.conf 配置文件
找到 PostgreSQL 的配置文件(通常位于數(shù)據(jù)目錄中,如 /var/lib/postgresql/data/postgresql.conf 或 /etc/postgresql/[版本]/main/postgresql.conf),修改以下參數(shù):
# 開(kāi)啟日志記錄
logging_collector = on
# 設(shè)置日志輸出目錄(可選)
log_directory = 'pg_log'
# 設(shè)置日志文件名模式(可選)
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
# 記錄慢查詢(xún)(單位:毫秒)
log_min_duration_statement = 1000 # 記錄執(zhí)行超過(guò)1秒的查詢(xún)
# 可選:記錄所有語(yǔ)句(包括慢查詢(xún))
#log_statement = 'all' # 可選值為 none, ddl, mod, all
# 可選:記錄執(zhí)行計(jì)劃
#auto_explain.log_min_duration = 1000
#auto_explain.log_analyze = on
#auto_explain.log_buffers = on
#auto_explain.log_timing = on
#auto_explain.log_triggers = on
#auto_explain.log_verbose = on
#auto_explain.log_nested_statements = on
2. 重新加載配置
不需要重啟 PostgreSQL 服務(wù),只需執(zhí)行以下命令重新加載配置:
# 方法1:使用 psql
psql -U postgres -c "SELECT pg_reload_conf();"
# 方法2:使用系統(tǒng)命令
sudo systemctl reload postgresql # 根據(jù)您的系統(tǒng)和服務(wù)管理工具可能不同
3. 驗(yàn)證配置
-- 檢查當(dāng)前配置
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('logging_collector', 'log_min_duration_statement');
4. 查看慢查詢(xún)?nèi)罩?/h2>
日志文件默認(rèn)會(huì)生成在配置的 log_directory 目錄中,文件名遵循 log_filename 模式。
5.高級(jí)選項(xiàng)
記錄執(zhí)行計(jì)劃:?jiǎn)⒂?auto_explain 模塊可以記錄查詢(xún)的執(zhí)行計(jì)劃
shared_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '1s'
auto_explain.log_analyze = on
按用戶(hù)或數(shù)據(jù)庫(kù)記錄:
# 只記錄特定數(shù)據(jù)庫(kù)的慢查詢(xún)
log_min_duration_statement = 1000
log_connections = on
log_disconnections = on
log_line_prefix = '%m [%p] %q%u@%d '
日志輪轉(zhuǎn):
log_rotation_age = 1d # 每天輪轉(zhuǎn)
log_rotation_size = 10MB # 或按大小輪轉(zhuǎn)
6.知識(shí)擴(kuò)展
PostgreSQL 慢查詢(xún)獲取方法整理
1.獲取慢查詢(xún)的方法
- 方法一 :開(kāi)啟慢查詢(xún)?nèi)罩?/li>
- 方法二 :使用pg_stat_statementes擴(kuò)展(推薦)
- 方法三 : 捕獲當(dāng)前連接中的查詢(xún)
2.開(kāi)啟慢查詢(xún)?nèi)罩?/p>
postgresql.conf
log_destination = 'csvlog' #日志基礎(chǔ)設(shè)置
logging_collector = on #日志基礎(chǔ)設(shè)置(重啟生效)
log_directory = 'pg_log' #日志基礎(chǔ)設(shè)置
log_filename = 'postgresql-%Y-%m-%d.log' #日志基礎(chǔ)設(shè)置
log_file_mode = 0600 #日志基礎(chǔ)設(shè)置
log_truncate_on_rotation = off #日志基礎(chǔ)設(shè)置
log_rotation_age = 1d #日志基礎(chǔ)設(shè)置
log_rotation_size = 0 #日志基礎(chǔ)設(shè)置
log_statement = none #需要記錄的語(yǔ)句,默認(rèn)只記錄錯(cuò)誤日志。none,ddl,mod,all
log_min_duration_statement = 500 #慢查詢(xún)最小時(shí)長(zhǎng),毫秒。log_statement=all同時(shí)設(shè)置時(shí)失效
shared_preload_libraries = 'auto_explain' #只需要編譯,不需要安裝擴(kuò)展
auto_explain.log_min_duration = 1s #超過(guò)時(shí)長(zhǎng)的慢查詢(xún),給出執(zhí)行計(jì)劃
postgres=# select pg_reload_conf();
針對(duì)某個(gè)用戶(hù)或數(shù)據(jù)說(shuō)庫(kù)進(jìn)行設(shè)置
postgres=# alter database db_name set log_min_duration_statement=5000;
postgres=# alter user user_name set log_min_duration_statement=1000;
3.pg_stat_statementes擴(kuò)展(推薦)
pg_stat_statements 模塊提供了跟蹤服務(wù)器執(zhí)行的所有SQL語(yǔ)句的執(zhí)行統(tǒng)計(jì)信息的方法。如果想要開(kāi)啟模塊,必須在配置文件中將 pg_stat_statements 添加到 shared_preload_libraries中。因?yàn)樗枰~外的共享內(nèi)存,所以必須重啟服務(wù)添加或刪除。當(dāng) pg_stat_statements 被加載,會(huì)跟蹤服務(wù)器所有的數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息。
為了安全,只有superuser和 pg_read_all_stats role 用戶(hù)可以訪(fǎng)問(wèn) SQL text 和 queryid。其他用戶(hù)可以訪(fǎng)問(wèn) statistics。
根據(jù)內(nèi)部哈希計(jì)算具有相同的查詢(xún)結(jié)構(gòu),可計(jì)劃查詢(xún)(即SELECT,INSERT,UPDATE和DELETE)就會(huì)合并到單個(gè)pg_stat_statements條目中。 通常,如果兩個(gè)查詢(xún)?cè)谡Z(yǔ)義上等效,則除了查詢(xún)中出現(xiàn)的文字常量的值之外,它們將被視為相同。 但是,實(shí)用命令(即所有其他命令)嚴(yán)格地根據(jù)其文本查詢(xún)字符串進(jìn)行比較。
安裝配置及使用
安裝
cd pg_soft/contrib/pg_stat_statements
make && make install
postgres=# create extension pg_stat_statements;
重要配置
shared_preload_libraries='auto_explain,pg_stat_statements'
log_min_duration_statement = 100 #慢查詢(xún)最小時(shí)長(zhǎng),毫秒
track_activity_query_size = 10000 #SQL文本的最大長(zhǎng)度
pg_stat_statements.max = 10000 #跟蹤模塊中最多保留多少條統(tǒng)計(jì)信息,通過(guò)LRU算法。
pg_stat_statements.track = all #all包括函數(shù)內(nèi)的SQL, top不包含函數(shù)內(nèi)的sql), none
pg_stat_statements.track_utility = true #是否跟蹤非DML語(yǔ)句 (例如DDL,DCL)
pg_stat_statements.save = true #表示當(dāng)pg停止時(shí),把信息存入磁盤(pán)文件。
使用
#重置統(tǒng)計(jì)信息
select pg_stat_statements_reset() ;
#最慢的TOP10
SELECT * FROM pg_stat_statements order by total_time desc limit 10;
4.捕獲當(dāng)前連接中的查詢(xún)
select *
from pg_stat_activity
where state<>'idle' and now()-query_start > interval '1 s' order by query_start ;
到此這篇關(guān)于PostgreSQL開(kāi)啟慢查詢(xún)?nèi)罩镜姆椒ㄔ斀獾奈恼戮徒榻B到這了,更多相關(guān)PostgreSQL慢查詢(xún)?nèi)罩緝?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
-
Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法
這篇文章主要介紹了Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2020-12-12
-
啟動(dòng)PostgreSQL服務(wù)器 并用pgAdmin連接操作
這篇文章主要介紹了啟動(dòng)PostgreSQL服務(wù)器 并用pgAdmin連接操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧 2021-01-01
-
Docker環(huán)境下升級(jí)PostgreSQL的步驟方法詳解
這篇文章主要介紹了Docker環(huán)境下升級(jí)PostgreSQL的步驟方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2021-01-01
-
如何查看PostgreSQL數(shù)據(jù)庫(kù)中所有表
這篇文章主要介紹了如何查看PostgreSQL數(shù)據(jù)庫(kù)中所有表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-03-03
-
Postgresql導(dǎo)入幾何數(shù)據(jù)(shp,geojson)的幾種方式
本文主要介紹了Postgresql導(dǎo)入幾何數(shù)據(jù)(shp,geojson)的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2026-02-02
-
postgresql如何找到表中重復(fù)數(shù)據(jù)的行并刪除
這篇文章主要介紹了postgresql如何找到表中重復(fù)數(shù)據(jù)的行并刪除問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-05-05
-
PostgreSQL實(shí)戰(zhàn)之啟動(dòng)恢復(fù)讀取checkpoint記錄失敗的條件詳解
這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)戰(zhàn)之啟動(dòng)恢復(fù)讀取checkpoint記錄失敗的條件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2018-08-08
最新評(píng)論
PostgreSQL 可以通過(guò)配置參數(shù)來(lái)記錄執(zhí)行時(shí)間超過(guò)指定閾值的查詢(xún),即慢查詢(xún)?nèi)罩?。以下是開(kāi)啟慢查詢(xún)?nèi)罩镜牟襟E:

1. 修改 postgresql.conf 配置文件
找到 PostgreSQL 的配置文件(通常位于數(shù)據(jù)目錄中,如 /var/lib/postgresql/data/postgresql.conf 或 /etc/postgresql/[版本]/main/postgresql.conf),修改以下參數(shù):
# 開(kāi)啟日志記錄 logging_collector = on # 設(shè)置日志輸出目錄(可選) log_directory = 'pg_log' # 設(shè)置日志文件名模式(可選) log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # 記錄慢查詢(xún)(單位:毫秒) log_min_duration_statement = 1000 # 記錄執(zhí)行超過(guò)1秒的查詢(xún) # 可選:記錄所有語(yǔ)句(包括慢查詢(xún)) #log_statement = 'all' # 可選值為 none, ddl, mod, all # 可選:記錄執(zhí)行計(jì)劃 #auto_explain.log_min_duration = 1000 #auto_explain.log_analyze = on #auto_explain.log_buffers = on #auto_explain.log_timing = on #auto_explain.log_triggers = on #auto_explain.log_verbose = on #auto_explain.log_nested_statements = on
2. 重新加載配置
不需要重啟 PostgreSQL 服務(wù),只需執(zhí)行以下命令重新加載配置:
# 方法1:使用 psql psql -U postgres -c "SELECT pg_reload_conf();" # 方法2:使用系統(tǒng)命令 sudo systemctl reload postgresql # 根據(jù)您的系統(tǒng)和服務(wù)管理工具可能不同
3. 驗(yàn)證配置
-- 檢查當(dāng)前配置
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('logging_collector', 'log_min_duration_statement');
4. 查看慢查詢(xún)?nèi)罩?/h2>
日志文件默認(rèn)會(huì)生成在配置的 log_directory 目錄中,文件名遵循 log_filename 模式。
5.高級(jí)選項(xiàng)
記錄執(zhí)行計(jì)劃:?jiǎn)⒂?auto_explain 模塊可以記錄查詢(xún)的執(zhí)行計(jì)劃
shared_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '1s' auto_explain.log_analyze = on
按用戶(hù)或數(shù)據(jù)庫(kù)記錄:
# 只記錄特定數(shù)據(jù)庫(kù)的慢查詢(xún) log_min_duration_statement = 1000 log_connections = on log_disconnections = on log_line_prefix = '%m [%p] %q%u@%d '
日志輪轉(zhuǎn):
log_rotation_age = 1d # 每天輪轉(zhuǎn) log_rotation_size = 10MB # 或按大小輪轉(zhuǎn)
6.知識(shí)擴(kuò)展
PostgreSQL 慢查詢(xún)獲取方法整理
1.獲取慢查詢(xún)的方法
- 方法一 :開(kāi)啟慢查詢(xún)?nèi)罩?/li>
- 方法二 :使用pg_stat_statementes擴(kuò)展(推薦)
- 方法三 : 捕獲當(dāng)前連接中的查詢(xún)
2.開(kāi)啟慢查詢(xún)?nèi)罩?/p>
postgresql.conf
log_destination = 'csvlog' #日志基礎(chǔ)設(shè)置
logging_collector = on #日志基礎(chǔ)設(shè)置(重啟生效)
log_directory = 'pg_log' #日志基礎(chǔ)設(shè)置
log_filename = 'postgresql-%Y-%m-%d.log' #日志基礎(chǔ)設(shè)置
log_file_mode = 0600 #日志基礎(chǔ)設(shè)置
log_truncate_on_rotation = off #日志基礎(chǔ)設(shè)置
log_rotation_age = 1d #日志基礎(chǔ)設(shè)置
log_rotation_size = 0 #日志基礎(chǔ)設(shè)置
log_statement = none #需要記錄的語(yǔ)句,默認(rèn)只記錄錯(cuò)誤日志。none,ddl,mod,all
log_min_duration_statement = 500 #慢查詢(xún)最小時(shí)長(zhǎng),毫秒。log_statement=all同時(shí)設(shè)置時(shí)失效
shared_preload_libraries = 'auto_explain' #只需要編譯,不需要安裝擴(kuò)展
auto_explain.log_min_duration = 1s #超過(guò)時(shí)長(zhǎng)的慢查詢(xún),給出執(zhí)行計(jì)劃
postgres=# select pg_reload_conf();
針對(duì)某個(gè)用戶(hù)或數(shù)據(jù)說(shuō)庫(kù)進(jìn)行設(shè)置
postgres=# alter database db_name set log_min_duration_statement=5000;
postgres=# alter user user_name set log_min_duration_statement=1000;3.pg_stat_statementes擴(kuò)展(推薦)
pg_stat_statements 模塊提供了跟蹤服務(wù)器執(zhí)行的所有SQL語(yǔ)句的執(zhí)行統(tǒng)計(jì)信息的方法。如果想要開(kāi)啟模塊,必須在配置文件中將 pg_stat_statements 添加到 shared_preload_libraries中。因?yàn)樗枰~外的共享內(nèi)存,所以必須重啟服務(wù)添加或刪除。當(dāng) pg_stat_statements 被加載,會(huì)跟蹤服務(wù)器所有的數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息。
為了安全,只有superuser和 pg_read_all_stats role 用戶(hù)可以訪(fǎng)問(wèn) SQL text 和 queryid。其他用戶(hù)可以訪(fǎng)問(wèn) statistics。
根據(jù)內(nèi)部哈希計(jì)算具有相同的查詢(xún)結(jié)構(gòu),可計(jì)劃查詢(xún)(即SELECT,INSERT,UPDATE和DELETE)就會(huì)合并到單個(gè)pg_stat_statements條目中。 通常,如果兩個(gè)查詢(xún)?cè)谡Z(yǔ)義上等效,則除了查詢(xún)中出現(xiàn)的文字常量的值之外,它們將被視為相同。 但是,實(shí)用命令(即所有其他命令)嚴(yán)格地根據(jù)其文本查詢(xún)字符串進(jìn)行比較。
安裝配置及使用
安裝
cd pg_soft/contrib/pg_stat_statements
make && make install
postgres=# create extension pg_stat_statements;重要配置
shared_preload_libraries='auto_explain,pg_stat_statements'
log_min_duration_statement = 100 #慢查詢(xún)最小時(shí)長(zhǎng),毫秒
track_activity_query_size = 10000 #SQL文本的最大長(zhǎng)度
pg_stat_statements.max = 10000 #跟蹤模塊中最多保留多少條統(tǒng)計(jì)信息,通過(guò)LRU算法。
pg_stat_statements.track = all #all包括函數(shù)內(nèi)的SQL, top不包含函數(shù)內(nèi)的sql), none
pg_stat_statements.track_utility = true #是否跟蹤非DML語(yǔ)句 (例如DDL,DCL)
pg_stat_statements.save = true #表示當(dāng)pg停止時(shí),把信息存入磁盤(pán)文件。使用
#重置統(tǒng)計(jì)信息 select pg_stat_statements_reset() ; #最慢的TOP10 SELECT * FROM pg_stat_statements order by total_time desc limit 10;
4.捕獲當(dāng)前連接中的查詢(xún)
select * from pg_stat_activity where state<>'idle' and now()-query_start > interval '1 s' order by query_start ;
到此這篇關(guān)于PostgreSQL開(kāi)啟慢查詢(xún)?nèi)罩镜姆椒ㄔ斀獾奈恼戮徒榻B到這了,更多相關(guān)PostgreSQL慢查詢(xún)?nèi)罩緝?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法
這篇文章主要介紹了Postgresql創(chuàng)建新增、刪除與修改觸發(fā)器的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
啟動(dòng)PostgreSQL服務(wù)器 并用pgAdmin連接操作
這篇文章主要介紹了啟動(dòng)PostgreSQL服務(wù)器 并用pgAdmin連接操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
Docker環(huán)境下升級(jí)PostgreSQL的步驟方法詳解
這篇文章主要介紹了Docker環(huán)境下升級(jí)PostgreSQL的步驟方法詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
如何查看PostgreSQL數(shù)據(jù)庫(kù)中所有表
這篇文章主要介紹了如何查看PostgreSQL數(shù)據(jù)庫(kù)中所有表問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Postgresql導(dǎo)入幾何數(shù)據(jù)(shp,geojson)的幾種方式
本文主要介紹了Postgresql導(dǎo)入幾何數(shù)據(jù)(shp,geojson)的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
postgresql如何找到表中重復(fù)數(shù)據(jù)的行并刪除
這篇文章主要介紹了postgresql如何找到表中重復(fù)數(shù)據(jù)的行并刪除問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
PostgreSQL實(shí)戰(zhàn)之啟動(dòng)恢復(fù)讀取checkpoint記錄失敗的條件詳解
這篇文章主要給大家介紹了關(guān)于PostgreSQL實(shí)戰(zhàn)之啟動(dòng)恢復(fù)讀取checkpoint記錄失敗的條件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08

