PostgreSQL執行超時的問題


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/ 
版權所有,歡迎轉載,轉載請注明原文作者及出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM