pg_dump при ошибке выдачи базы данных «из общей памяти»

Возникновение проблемы при резервном копировании базы данных содержит около 50 схем, каждая из которых содержит около 100 таблиц.

pg_dump выдает ошибку ниже, предлагая увеличить max_locks_per_transaction.

pg_dump: WARNING:  out of shared memory
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.
pg_dump: The command was: SELECT tableoid, oid, prsname, prsnamespace, prsstart::oid, prstoken::oid, prsend::oid, prsheadline::oid, prslextype::oid FROM pg_ts_parser

Обновление max_locks_per_transaction до 256 в postgresql.conf не решило проблему.

Есть ли какие-либо возможности, которые могут вызвать эту проблему?

Отредактировано: (7 мая 2016 г.)

Версия PostgreSQL = 9.1

Операционная система = Ubuntu 14.04.2 LTS

shared_buffers in postgresql.conf = 2GB

Отредактировано: (9 мая 2016 г.)

Мой postgres.conf

maintenance_work_mem = 640MB
wal_buffers = 64MB
shared_buffers = 2GB
max_connections = 100
max_locks_per_transaction=10000

person pgollangi    schedule 06.05.2016    source источник


Ответы (4)


Я решил эту проблему, создав резервную копию для каждой схемы по отдельности, так как размер базы данных (будь то количество схем или количество таблиц) увеличивается, и сделать резервную копию с помощью pg_dump сложно.

Я сделал следующую модификацию сценария, чтобы сделать резервную копию по схеме:

  1. Перед запуском pg_dump перечислите все схемы базы данных в файл. Чтобы мы могли перебрать все схемы и сделать резервную копию схемы.

    Вот команда для вывода всей схемы в файл

    psql <db_name> -o <output_file> < <sql_to_list_schema>

    Здесь sql_to_list_schema содержит

    SELECT n.nspname FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname ‹> 'information_schema';

  2. Теперь прочитайте все строки output_file и сделайте резервную копию этой схемы.

    pg_dump <db_name> -f <backup_file> -i -x -O -R -n <schema_name_read_from_file>

person pgollangi    schedule 07.05.2016
comment
ссылка, предоставленная вами для скрипта, больше не работает... - person Roshana Pitigala; 28.03.2018
comment
Возможно, вы захотите использовать дополнительные параметры для команды psql. Это упростит чтение имен в переменную, например: --no-align --tuples-only --record-separator=" ". - person Nux; 10.10.2018

Возможно, вам придется увеличить max_locks_per_transaction еще больше. Подробную информацию о что означает этот параметр. Если вы сомневаетесь, проверьте, сколько у вас столов, и установите max_locks_per_transaction как минимум на это количество, тогда все будет в порядке.

person Peter Eisentraut    schedule 06.05.2016
comment
Подробности? Сколько у вас таблиц, каковы ваши настройки конфигурации? - person Peter Eisentraut; 07.05.2016
comment
@PeterEisentraut, спасибо за совет. Изначально не уверен, в каком файле нужно изменить это свойство. Позже получил помощь от друзей, где изменить. ../data/postgresql.conf - person Rao; 03.03.2017
comment
@ Рао: И? Это помогло? - person Xatoo; 09.12.2019

Попробуй это

shared_buffers = 512GB
max_locks_per_transaction=10000

Обратите внимание, что каждый env отличается

person zdarova    schedule 15.06.2020

Я попытался использовать приведенное ниже без настройки размера буфера, и это сработало.

psql -U <db_user_name> -d <db_name> -f <file_name>.sql
person Raj Rajeshwar Singh Rathore    schedule 13.07.2021