Я имею дело с системой баз данных, которая может иметь тысячи таблиц. Проблема в том, что когда я пытаюсь создать резервную копию, используя pg_dump
, Я иногда получаю следующую ошибку:
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: LOCK TABLE public.foo IN ACCESS SHARE MODE
Конечно, я мог бы увеличить max_locks_per_transaction
настройка. Но проблема в том, что количество таблиц может варьироваться. Я не хочу постоянно пересматривать этот параметр каждый раз, когда происходит сбой (при условии, что мы вообще замечаем сбой, учитывая, что это связано с заданием cron!).
Как лучше всего решить эту проблему? В настоящее время я работаю над сценарием Perl, который перечислит все таблицы, а затем вызовет pg_dump
"кусками", чтобы ограничить количество блокировок таблицы, но держу пари, что смогу добиться большего.
Если вам нужна согласованная резервная копия, вы должны увеличить max_locks_per_transaction.
Выполнение этого по частям из скрипта сделает резервную копию непоследовательный если у вас есть одновременный доступ, что, вероятно, не то, что вам нужно.
Другой вариант - использовать PITR и сделать резервную копию на уровне файловой системы. Это не снимет никаких блокировок в базе данных.