pg_dump: [archiver (db)] query failed: ERROR: out of shared memory HINT: You might need to increase max_locks_per_transaction. IN ACCESS SHARE MODE


問題描述

在使用postgres執行一個存儲過程,存儲過程的操作是對全庫上百張表添加字段,執行到一半的時候拋出了錯誤:You might need to increase max_locks_per_transaction。

原因

因為一個過程中操作的表過多,超過了最大對象鎖的限制數量,導致了異常。

大意是開啟事務后,每次操作一張表,會進行一次表級的lock操作,並增加lock的大小,當lock的大小超過了默認的限定值,就會拋出異常。

postgres中默認max_locks_per_transaction大小是64

官方對此的解釋

共享鎖表跟蹤在max_locks_per_transaction * (max_connections + max_prepared_transactions) 個對象(如表)上的鎖。
因此,在任何一個時刻,只有不超過這么多個可區分對象能夠被鎖住。這個參數控制為每個事務分配的對象鎖的平均數量。
個體事務可以鎖住更多對象,數量可以和鎖表中能容納的所有事務的鎖一樣多。這不是能被鎖住的行數,那個值是沒有限制的。
默認值 64 已經被歷史證明是足夠的,但是如果你有需要在一個事務中使用很多不同表的查詢(例如查詢一個有很多子表的父表),你可能需要提高這個值。這個參數只能在服務器啟動時設置。

當運行一個后備服務器時,你必須設置這個參數為大於等於主服務器上的值。否則,后備服務器上將不允許查詢。

解決方案

1、修改配置文件,../data/postgresql.conf,將參數重新配置:max_locks_per_transaction = 1024,然后重啟數據庫即可

2、減少過程中操作表的數量,即將一個大的存儲過程拆分成若干小過程,再進行執行,最終我們采用的是這個方法,因為根據官方的描述,默認配置是經過驗證最合理的配置,將配置調大可能會產生未知的風險
————————————————

參考鏈接:https://blog.csdn.net/wtopps/article/details/78554796

     http://www.postgres.cn/docs/9.5/runtime-config-locks.html


免責聲明!

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



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