新聞中心
在使用PostgreSQL進(jìn)行數(shù)據(jù)復(fù)制時(shí),備機(jī)(從服務(wù)器)查詢時(shí)可能會(huì)遇到報(bào)錯(cuò),其中一個(gè)常見的錯(cuò)誤是"conflict with recovery",本文將詳細(xì)解釋該錯(cuò)誤產(chǎn)生的原因及解決辦法。

目前累計(jì)服務(wù)客戶上千家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)、網(wǎng)絡(luò)營銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。成都創(chuàng)新互聯(lián)公司始終以務(wù)實(shí)、誠信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過對領(lǐng)先技術(shù)的掌握、對創(chuàng)意設(shè)計(jì)的研究、對客戶形象的視覺傳遞、對應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
我們需要了解PostgreSQL的數(shù)據(jù)復(fù)制原理,在PostgreSQL中,數(shù)據(jù)復(fù)制是通過WAL(WriteAhead Logging)日志實(shí)現(xiàn)的,主服務(wù)器在處理寫操作時(shí),會(huì)將這些操作記錄到WAL日志中,備機(jī)通過讀取WAL日志,并將這些操作應(yīng)用到自己的數(shù)據(jù)庫中,從而實(shí)現(xiàn)數(shù)據(jù)同步。
當(dāng)備機(jī)嘗試讀取正在被主服務(wù)器修改的數(shù)據(jù)時(shí),就可能產(chǎn)生"conflict with recovery"錯(cuò)誤,這是因?yàn)樵跓醾淠J较?,PostgreSQL默認(rèn)行為是:來自主服務(wù)器的任何新更改都會(huì)在等待一段較短的時(shí)間(默認(rèn)為30秒)后終止使用相同數(shù)據(jù)的所有其他查詢。
以下為詳細(xì)解釋和解決辦法:
錯(cuò)誤原因:
1、在熱備模式下,備機(jī)上的查詢可能會(huì)訪問到已經(jīng)被主服務(wù)器更改的數(shù)據(jù)版本。
2、PostgreSQL默認(rèn)配置會(huì)在一定時(shí)間后終止與主服務(wù)器發(fā)生沖突的查詢。
解決辦法:
1、升級PostgreSQL版本: 在較新版本的PostgreSQL中,可以啟用參數(shù)hot_standby_feedback,該參數(shù)允許備機(jī)通知主服務(wù)器關(guān)于備機(jī)當(dāng)前查詢的信息,從而減少?zèng)_突發(fā)生的可能性。
“`sql
ALTER SYSTEM SET hot_standby_feedback = on;
“`
2、調(diào)整WAL日志相關(guān)參數(shù): 在舊版本的PostgreSQL中,可以嘗試增加以下兩個(gè)參數(shù)的值:
max_standby_archive_delay:設(shè)置備機(jī)在歸檔WAL日志時(shí),可以延遲的最大時(shí)間。
max_standby_streaming_delay:設(shè)置備機(jī)在流式復(fù)制WAL日志時(shí),可以延遲的最大時(shí)間。
在postgresql.conf文件中設(shè)置這兩個(gè)參數(shù)的值:
“`sql
max_standby_archive_delay = 30s
max_standby_streaming_delay = 30s
“`
3、調(diào)整查詢重試策略: 如果無法更改PostgreSQL配置,可以在應(yīng)用層實(shí)現(xiàn)查詢重試機(jī)制,將復(fù)制作業(yè)的重試計(jì)數(shù)設(shè)置為大于1,并設(shè)置適當(dāng)?shù)难舆t,這樣,在發(fā)生沖突時(shí),作業(yè)會(huì)自動(dòng)重試,可能在某次重試時(shí)成功。
“`sql
設(shè)置重試次數(shù)和延遲時(shí)間
SET max_retries = 5;
SET retry_delay = 5s;
“`
4、避免在備機(jī)上執(zhí)行可能導(dǎo)致沖突的查詢: 如果業(yè)務(wù)場景允許,盡量避免在備機(jī)上執(zhí)行與主服務(wù)器發(fā)生沖突的查詢,可以限制備機(jī)上的查詢只讀取不涉及主服務(wù)器寫操作的表。
5、檢查磁盤空間: 如果備機(jī)因?yàn)榇疟P空間不足導(dǎo)致無法正常讀取WAL日志,也會(huì)出現(xiàn)查詢報(bào)錯(cuò),請確保備機(jī)的磁盤空間足夠。
“`bash
df h
“`
6、檢查備機(jī)數(shù)據(jù)目錄權(quán)限: 確保備機(jī)的數(shù)據(jù)目錄權(quán)限正確,如果啟動(dòng)PostgreSQL的用戶不是數(shù)據(jù)目錄的擁有者,可能導(dǎo)致查詢失敗。
“`bash
chown R postgres:postgres /path/to/data_directory
“`
在處理PostgreSQL備機(jī)查詢報(bào)錯(cuò)時(shí),我們需要從多個(gè)方面進(jìn)行分析和解決,通過調(diào)整配置參數(shù)、查詢重試機(jī)制和磁盤空間檢查等方法,可以有效地解決"conflict with recovery"錯(cuò)誤,在實(shí)際生產(chǎn)環(huán)境中,我們需要根據(jù)具體場景和業(yè)務(wù)需求,選擇合適的解決方案。
新聞名稱:postgresql備機(jī)查詢報(bào)錯(cuò)
標(biāo)題路徑:http://m.fisionsoft.com.cn/article/djgsoic.html


咨詢
建站咨詢
