postgresql從庫(kù)查詢被終止怎么辦

這篇文章主要介紹了postgresql從庫(kù)查詢被終止怎么辦,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

成都創(chuàng)新互聯(lián)公司:成立與2013年為各行業(yè)開(kāi)拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為近1000家公司企業(yè)提供了專業(yè)的做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)和網(wǎng)站推廣服務(wù), 按需制作由設(shè)計(jì)師親自精心設(shè)計(jì),設(shè)計(jì)的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺(jué)效果,策劃師分析客戶的同行競(jìng)爭(zhēng)對(duì)手,根據(jù)客戶的實(shí)際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。

PG流復(fù)制場(chǎng)景下,默認(rèn)配置下, 如果在PG從庫(kù)執(zhí)行長(zhǎng)時(shí)間的查詢,會(huì)出現(xiàn)查詢的報(bào)錯(cuò)。提示

ERROR: canceling statement due to conflict with recovery

DETAIL: User query might have needed to see row versions that must be removed.

根據(jù)報(bào)錯(cuò)信息,在主庫(kù)上執(zhí)行長(zhǎng)時(shí)間查詢過(guò)程中,由于此查詢涉及的記錄有可能在主庫(kù)上被更新或刪除,根據(jù) PostgreSQL的mvcc機(jī)制,更新或刪除的數(shù)據(jù)不是立即從物理塊上刪除,而是之后autovacuum進(jìn)程對(duì)老版本數(shù)據(jù)進(jìn)行 VACUUM,主庫(kù)上對(duì)更新或刪除數(shù)據(jù)的老版本進(jìn)行 VACUUM后,從庫(kù)上也會(huì)執(zhí)行這個(gè)操作,從而與從庫(kù)當(dāng)前查詢產(chǎn)生沖突,導(dǎo)致查詢被中斷并拋出以上錯(cuò)誤。

實(shí)際上 PostgreSQL提供了配置參數(shù)來(lái)減少或避免這種情況出現(xiàn)的概率,主要包括以下兩個(gè)參數(shù):

maxstandby_ streaming_delay:

此參數(shù)默認(rèn)為30秒,當(dāng)備庫(kù)執(zhí)行SQL時(shí),有可能與正在應(yīng)用的WAL發(fā)生沖突,此查詢?nèi)绻?0秒沒(méi)有執(zhí)行完成則被中止,注意30秒不是備庫(kù)上單個(gè)查詢?cè)试S的最大執(zhí)行時(shí)間,是指當(dāng)備庫(kù)上應(yīng)用WAL時(shí)允許的最大WAL延遲應(yīng)用時(shí)間,因此備庫(kù)上查詢的執(zhí)行時(shí)間有可能不到這個(gè)參數(shù)設(shè)置的值就被中止了,此參數(shù)可以設(shè)置成-1,表示當(dāng)從庫(kù)上的WAL應(yīng)用進(jìn)程與從庫(kù)上執(zhí)行的查詢沖突時(shí),WAL應(yīng)用進(jìn)程一直等待直到從庫(kù)查詢執(zhí)行完成。

hotstandby_feedback:

默認(rèn)情況下從庫(kù)執(zhí)行查詢時(shí)并不會(huì)通知主庫(kù),設(shè)置此參數(shù)為on后從庫(kù)執(zhí)行查詢時(shí)會(huì)通知主庫(kù),當(dāng)從庫(kù)執(zhí)行查詢過(guò)程中,主庫(kù)不會(huì)清理從庫(kù)需要的數(shù)據(jù)行老版本,因此,從庫(kù)上的查詢不會(huì)被中止,然而,這種方法也會(huì)帶來(lái)一定的弊端,主庫(kù)上的表可能出現(xiàn)膨脹,主庫(kù)表的膨脹程度與表上的寫事務(wù)和從庫(kù)執(zhí)行時(shí)間有關(guān),此參數(shù)默認(rèn)為off

案例:

CentOS7.5+PG版本11.5

pgMaster 為主庫(kù)

pgSlave 為備庫(kù)

調(diào)整備庫(kù)的參數(shù),設(shè)置

max_standby_streaming_delay = 10s    # (測(cè)試便于看出效果這個(gè)參數(shù)調(diào)的比較低)

hot_standby_feedback = off

然后reload下PG的配置使其生效

在主庫(kù)pgMaster 上創(chuàng)建測(cè)試表:

\c postgres

create table test_per2 ( id int , flag int);

insert into test_per2 (id) select * from generate_series(1,1000000) ;

編寫pgbench壓測(cè)腳本 update_per2.sql 內(nèi)容如下:

\set v_id random(1,1000000)

update test_per2 set flag='1' where id=:v_id;

開(kāi)始?jí)簻y(cè):

pgbench -c 8 -T 120 -d postgres -Upostgres -n N -M prepared -f update_per2.sql

然后,到pgSlave備庫(kù)去執(zhí)行下查詢操作:

postgres=# select pg_sleep(12),* from test_per2 limit 10 ;

ERROR:  canceling statement due to conflict with recovery

DETAIL:  User query might have needed to see row versions that must be removed.

Time: 729.120 ms

這里,可以很容易就復(fù)現(xiàn)了這個(gè)報(bào)錯(cuò)場(chǎng)景。

解決方法有2種:

方案1、 調(diào)大 max_standby_streaming_delay參數(shù)值

我們可以將max_standby_streaming_delay 調(diào)整為-1 繞開(kāi)這個(gè)錯(cuò)誤,或者將這個(gè)值調(diào)大些。

例如將備庫(kù)的參數(shù)max_standby_streaming_delay調(diào)整為120s:

max_standby_streaming_delay = 120s

hot_standby_feedback = off

然后 使用 pg_ctl reload 使其生效

然后,再次到pgSlave備庫(kù)去執(zhí)行下查詢操作,可以看到查詢可以正常執(zhí)行了:

postgres=# select pg_sleep(12), id ,flag  from test_per2  limit 2 ;

 pg_sleep | id | flag

----------+----+------

          |  1 | NULL

          |  2 | NULL

(2 rows) 

方案2、 開(kāi)啟 hot_standby_feedback參數(shù)

hot_standby_feedback 參數(shù)設(shè)置為on后,從庫(kù)執(zhí)行查詢時(shí)會(huì)通知主庫(kù),從庫(kù)執(zhí)行大查詢過(guò)程中,主庫(kù)不會(huì)清理從庫(kù)需要用到的數(shù)據(jù)行老版本。

備庫(kù)上需要開(kāi)啟的參數(shù):

max_standby_streaming_delay = 10s

hot_standby_feedback = on  # 主要是這個(gè)參數(shù)設(shè)置為on即可

然后 使用 pg_ctl reload 使其生效

這時(shí)候,到備庫(kù)去查詢,可以發(fā)現(xiàn)能查詢成功:

postgres=# select pg_sleep(2), id ,flag  from test_per2  limit 2 ;

 pg_sleep | id | flag

----------+----+------

          |  1 | NULL

          |  2 | NULL

(2 rows)

postgres=# select pg_sleep(12), id ,flag  from test_per2  limit 2 ;

 pg_sleep | id | flag

----------+----+------

          |  1 | NULL

          |  2 | NULL

(2 rows)

上面的2種方式中,都是有不太好的地方:

1、  設(shè)置 max_standby_streaming_delay 參數(shù)為-1,這種方式有可能備庫(kù)上慢查詢由于長(zhǎng)時(shí)間執(zhí)行而消耗大量主機(jī)資源,建議根據(jù)應(yīng)用情況設(shè)置一個(gè)較合理的值

2、  設(shè)置 hot_standby_feedback=on,這種方式可能會(huì)使主庫(kù)某些表產(chǎn)生膨脹。

這兩種方式無(wú)論選擇哪一個(gè)都應(yīng)該加強(qiáng)對(duì)流復(fù)制主庫(kù)、備庫(kù)慢查詢的監(jiān)控,并分析是否需要人工介入維護(hù)。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“postgresql從庫(kù)查詢被終止怎么辦”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

新聞名稱:postgresql從庫(kù)查詢被終止怎么辦
當(dāng)前鏈接:http://muchs.cn/article20/ghoojo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、定制開(kāi)發(fā)服務(wù)器托管、軟件開(kāi)發(fā)、App設(shè)計(jì)全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)