PostgreSQL執行超時的問題
使用背景
最近在使用PostgreSQL的時候,在執行一些數據庫事務的時候,先后出現了statement timetout 和idle-in-transaction timeout的問題,導致數據庫操作失敗。
經研究查找,PostgreSQL有關於SQL語句執行超時和事務執行超時的相關配置,而默認超時時間是10000毫秒,即10秒鍾的時間,這樣會導致執行時間稍長的任務執行失敗。可以通過修改PostgreSQL服務器配置文件的方式修改默認配置。
參數說明
statement_timeout
statement_timeout 在 postgresql 被用來控制語句執行時長,單位是ms。
$ vi postgresql.conf
#statement_timeout = 0 # in milliseconds, 0 is disabled
- 1
- 2
默認是0,表示語句可以一直執行下去。
如果設置為10000,那就意味着語句最多可以執行 10000ms = 10s。
建議設置為0,禁用該參數。
idle_in_transaction_session_timeout
PostgreSQL 9.6版本開始支持自動查殺超過指定時間的 idle in transaction 空閑事務連接,用於清理應用代碼中忘記關閉已開啟的事務,或者系統中存在僵死進程等。
idle_in_transaction_session_timeout 在 postgresql 被用來控制事務執行時長,單位是ms。
$ vi postgresql.conf
#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled
- 1
- 2
默認是0,表示語句可以一直執行下去。超時會報 FATAL: terminating connection due to idle-in-transaction timeout。
修改方法
查找配置
通過命令查找到postgresql配置文件的位置,用vi進行編輯。
find / -name "postgresql.conf"
vi /var/lib/pgsql/9.6/data/postgresql.conf
修改參數
進入vi編輯界面,可以通過vi查找命令定位到相關參數,修改成合適的時間,保存退出。
:/statement_timeout
重啟配置
通過以下命令,查找pg_ctl的位置,然后執行 pg_ctl reload重新加載配置。
find / -name "pg_ctl"
/usr/pgsql-9.6/bin/pg_ctl reload
PG_CTL用法
啟動服務器
啟動服務器:
$ pg_ctl start
啟動服務器的一個例子,等到服務器啟動了才退出:
$ pg_ctl -w start
服務器使用 5433 端口,而且不帶 fsync
運行,使用:
$ pg_ctl -o "-F -p 5433" start
停止服務器
$ pg_ctl stop
使用 -m 選項停止服務器允許用戶控制如何關閉后端。
重啟服務器
這個命令幾乎等於先停止服務器然后再啟動它,只不過 pg_ctl 保存並重新使用上一次運行服務器的命令行參數。重啟服務器的最簡單的方法是:
$ pg_ctl restart
重啟服務器,等待其停止和重啟:
$ pg_ctl -w restart
使用 5433 端口重啟並且重啟后關閉 fsync
:
$ pg_ctl -o "-F -p 5433" restart
顯示服務器狀態
下面是來自 pg_ctl 的狀態輸出的例子:
$ pg_ctl statuspg_ctl: server is running (pid: 13718)
Command line was:
/usr/local/pgsql/bin/postgres '-D' '/usr/local/pgsql/data' '-p' '5433' '-B' '128'
這就是在 restart 模式中被調用的命令行。
作者:朝雨憶輕塵
出處:https://www.cnblogs.com/xifengxiaoma/
版權所有,歡迎轉載,轉載請注明原文作者及出處。