欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決PostgreSQL 執(zhí)行超時(shí)的情況

 更新時(shí)間:2021年01月16日 15:48:10   作者:朝雨憶輕塵  
這篇文章主要介紹了解決PostgreSQL 執(zhí)行超時(shí)的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

使用背景

最近在使用PostgreSQL的時(shí)候,在執(zhí)行一些數(shù)據(jù)庫(kù)事務(wù)的時(shí)候,先后出現(xiàn)了statement timetout 和idle-in-transaction timeout的問(wèn)題,導(dǎo)致數(shù)據(jù)庫(kù)操作失敗。

經(jīng)研究查找,PostgreSQL有關(guān)于SQL語(yǔ)句執(zhí)行超時(shí)和事務(wù)執(zhí)行超時(shí)的相關(guān)配置,而默認(rèn)超時(shí)時(shí)間是10000毫秒,即10秒鐘的時(shí)間,這樣會(huì)導(dǎo)致執(zhí)行時(shí)間稍長(zhǎng)的任務(wù)執(zhí)行失敗??梢酝ㄟ^(guò)修改PostgreSQL服務(wù)器配置文件的方式修改默認(rèn)配置。

參數(shù)說(shuō)明

statement_timeout
statement_timeout 在 postgresql 被用來(lái)控制語(yǔ)句執(zhí)行時(shí)長(zhǎng),單位是ms。
$ vi postgresql.conf 
#statement_timeout = 0         # in milliseconds, 0 is disabled

默認(rèn)是0,表示語(yǔ)句可以一直執(zhí)行下去。

如果設(shè)置為10000,那就意味著語(yǔ)句最多可以執(zhí)行 10000ms = 10s。

建議設(shè)置為0,禁用該參數(shù)。

idle_in_transaction_session_timeout

PostgreSQL 9.6版本開始支持自動(dòng)查殺超過(guò)指定時(shí)間的 idle in transaction 空閑事務(wù)連接,用于清理應(yīng)用代碼中忘記關(guān)閉已開啟的事務(wù),或者系統(tǒng)中存在僵死進(jìn)程等。

idle_in_transaction_session_timeout 在 postgresql 被用來(lái)控制事務(wù)執(zhí)行時(shí)長(zhǎng),單位是ms。

$ vi postgresql.conf 
#idle_in_transaction_session_timeout = 0         # in milliseconds, 0 is disabled

默認(rèn)是0,表示語(yǔ)句可以一直執(zhí)行下去。超時(shí)會(huì)報(bào) FATAL: terminating connection due to idle-in-transaction timeout。

修改方法

查找配置

通過(guò)命令查找到postgresql配置文件的位置,用vi進(jìn)行編輯。

find / -name "postgresql.conf"
vi /var/lib/pgsql/9.6/data/postgresql.conf

修改參數(shù)

進(jìn)入vi編輯界面,可以通過(guò)vi查找命令定位到相關(guān)參數(shù),修改成合適的時(shí)間,保存退出。

:/statement_timeout

重啟配置

通過(guò)以下命令,查找pg_ctl的位置,然后執(zhí)行 pg_ctl reload重新加載配置。

find / -name "pg_ctl"
/usr/pgsql-9.6/bin/pg_ctl reload

PG_CTL用法

啟動(dòng)服務(wù)器

啟動(dòng)服務(wù)器:

$ pg_ctl start

啟動(dòng)服務(wù)器的一個(gè)例子,等到服務(wù)器啟動(dòng)了才退出:

$ pg_ctl -w start

服務(wù)器使用 5433 端口,而且不帶 fsync 運(yùn)行,使用:

$ pg_ctl -o "-F -p 5433" start

停止服務(wù)器

$ pg_ctl stop

使用 -m 選項(xiàng)停止服務(wù)器允許用戶控制如何關(guān)閉后端。

重啟服務(wù)器

這個(gè)命令幾乎等于先停止服務(wù)器然后再啟動(dòng)它,只不過(guò) pg_ctl 保存并重新使用上一次運(yùn)行服務(wù)器的命令行參數(shù)。重啟服務(wù)器的最簡(jiǎn)單的方法是:

$ pg_ctl restart

重啟服務(wù)器,等待其停止和重啟:

$ pg_ctl -w restart

使用 5433 端口重啟并且重啟后關(guān)閉 fsync :

$ pg_ctl -o "-F -p 5433" restart

顯示服務(wù)器狀態(tài)

下面是來(lái)自 pg_ctl 的狀態(tài)輸出的例子:

$ 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 模式中被調(diào)用的命令行。

補(bǔ)充:PostgreSQL 設(shè)置單條SQL的執(zhí)行超時(shí) - 防雪崩

背景

設(shè)置單條SQL的執(zhí)行超時(shí),防雪崩。

通常來(lái)說(shuō)可以在SQL發(fā)起前設(shè)置事務(wù)級(jí)超時(shí)參數(shù),SQL執(zhí)行結(jié)束,重置。(如果SQL異常退出,會(huì)自動(dòng)重置事務(wù)級(jí)參數(shù))

例子

begin; 
...... 
set local statement_time='100ms'; 
select count(*) from a;  -- 這條SQL的執(zhí)行時(shí)間超過(guò)100MS則主動(dòng)退出,并回滾整個(gè)事務(wù)  
set local statement_timeout to default; 
...... 
end; 

函數(shù)級(jí)超時(shí)例子 - statement_timeout不可用

例如這個(gè)QUERY,我們想讓它100毫秒超時(shí)。

select count(*) as cnt, id from a where id<$1 group by id;  

將它寫到函數(shù)中,在函數(shù)中設(shè)置超時(shí)

create or replace function f1(int) returns setof record as $$ 
declare 
begin 
 set local statement_timeout='100ms'; 
 return query select count(*) as cnt, id from a where id<$1 group by id;  
end; 
$$ language plpgsql strict ; 

調(diào)用SQL改成這樣

select cnt,id from f1(1) as t(cnt int8, id int);  

但是這么做實(shí)際上是沒(méi)有效果的,原因是statement_timeout的設(shè)計(jì)之初是為交互性SQL設(shè)計(jì)的,在postgres.c中。

所以需要plpgsql超時(shí),需要通過(guò)插件HOOK來(lái)實(shí)現(xiàn)。

https://www.postgresql.org/message-id/flat/200702201200.53535.xzilla%40users.sourceforge.net#200702201200.53535.xzilla@users.sourceforge.net

statement_timeout is measured across an entire interactive command, not  
individual commands within a function; and the timeout that applies to  
an interactive command is determined at its beginning. So the above  
doesn't do what you think. 

參數(shù)級(jí)別

1、實(shí)例級(jí)

修改

postgresql.conf 

2、庫(kù)級(jí)

alter database dbname set parameter=?; 

3、用戶級(jí)

alter role rolname set parameter=?; 

4、會(huì)話級(jí)

set parameter=?; 

5、事務(wù)級(jí)

begin; 
set local parameter=?; 
.... 
end; 

6、函數(shù)級(jí)

alter function fun_name() set parameter=?; 

其他超時(shí)控制

1、空閑事務(wù)超時(shí)

idle_in_transaction_session_timeout = 2h  

2、鎖等待超時(shí)

lock_timeout = 1s

3、死鎖檢測(cè)超時(shí)間隔

deadlock_timeout = 1s

https://www.postgresql.org/docs/9.4/static/runtime-config-client.html

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • PostgreSQL操作json/jsonb方法詳解

    PostgreSQL操作json/jsonb方法詳解

    這篇文章主要給大家介紹了關(guān)于PostgreSQL操作json/jsonb的相關(guān)資料,PostgreSQL提供了兩種存儲(chǔ)JSON數(shù)據(jù)的類型:json和jsonb; jsonb是json的二進(jìn)制形式,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • pgsql之create user與create role的區(qū)別介紹

    pgsql之create user與create role的區(qū)別介紹

    這篇文章主要介紹了pgsql之create user與create role的區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Postgresql 跨庫(kù)同步表及postgres_fdw的用法說(shuō)明

    Postgresql 跨庫(kù)同步表及postgres_fdw的用法說(shuō)明

    這篇文章主要介紹了Postgresql 跨庫(kù)同步表及postgres_fdw的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • PostgreSQL進(jìn)行重置密碼的方法小結(jié)

    PostgreSQL進(jìn)行重置密碼的方法小結(jié)

    今天想測(cè)試一個(gè)PostgresSQL語(yǔ)法的 SQL,但是打開PostgresSQL之后沉默了,密碼是什么?日長(zhǎng)月久的,漸漸就忘記了,于是開始了尋找密碼的道路,所以本文介紹了Postgresql忘記密碼,如何重置密碼,需要的朋友可以參考下
    2024-05-05
  • PostgreSQL有效地處理數(shù)據(jù)序列化和反序列化的方法

    PostgreSQL有效地處理數(shù)據(jù)序列化和反序列化的方法

    在 PostgreSQL 中,處理數(shù)據(jù)的序列化和反序列化是確保數(shù)據(jù)在存儲(chǔ)、傳輸和處理過(guò)程中的一致性和可用性的重要任務(wù),這涉及到選擇合適的數(shù)據(jù)類型、轉(zhuǎn)換函數(shù)以及在應(yīng)用程序與數(shù)據(jù)庫(kù)之間進(jìn)行數(shù)據(jù)交互的策略,需要的朋友可以參考下
    2024-07-07
  • PostgreSQL中的psql命令詳解

    PostgreSQL中的psql命令詳解

    psql是PostgreSQL的一個(gè)命令行交互式客戶端工具,它具有非常豐富的功能,類似于Oracle的命令行工具sqlplus,這篇文章主要介紹了PostgreSQL-psql命令詳解,需要的朋友可以參考下
    2023-07-07
  • 如何查看postgres數(shù)據(jù)庫(kù)端口

    如何查看postgres數(shù)據(jù)庫(kù)端口

    這篇文章主要介紹了如何查看postgres數(shù)據(jù)庫(kù)端口操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 基于postgresql查詢某個(gè)字段屬于哪個(gè)表的說(shuō)明

    基于postgresql查詢某個(gè)字段屬于哪個(gè)表的說(shuō)明

    這篇文章主要介紹了基于postgresql查詢某個(gè)字段屬于哪個(gè)表的說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 如何解決PostgreSQL執(zhí)行語(yǔ)句長(zhǎng)時(shí)間卡著不動(dòng)不報(bào)錯(cuò)也不執(zhí)行的問(wèn)題

    如何解決PostgreSQL執(zhí)行語(yǔ)句長(zhǎng)時(shí)間卡著不動(dòng)不報(bào)錯(cuò)也不執(zhí)行的問(wèn)題

    某日開發(fā)同事上報(bào)一sql性能問(wèn)題,一條查詢好似一直跑不出結(jié)果,查詢了n小時(shí),還未返回結(jié)果,這篇文章主要給大家介紹了關(guān)于如何解決PostgreSQL執(zhí)行語(yǔ)句長(zhǎng)時(shí)間卡著不動(dòng)不報(bào)錯(cuò)也不執(zhí)行問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2024-02-02
  • 如何使用Dockerfile創(chuàng)建PostgreSQL數(shù)據(jù)庫(kù)

    如何使用Dockerfile創(chuàng)建PostgreSQL數(shù)據(jù)庫(kù)

    這篇文章主要介紹了如何使用Dockerfile創(chuàng)建PostgreSQL數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-02-02

最新評(píng)論