pg_dump 关于数据库抛出错误 'out of shared memory'

pg_dump on Database throwing error 'out of shared memory'

在包含大约 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

postgresql.conf 中将 max_locks_per_transaction 更新为 256 没有解决问题。

是否有任何可能导致此问题的原因?

编辑:(2016 年 5 月 7 日)

PostgreSQL 版本 = 9.1

操作系统 = Ubuntu 14.04.2 LTS

shared_bufferspostgresql.conf = 2GB

编辑:(2016 年 5 月 9 日)

我的postgres.conf

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

您可能需要进一步增加 max_locks_per_transaction。检查 documentation 以了解有关此参数含义的详细信息。如果有疑问,请检查您有多少张桌子并将 max_locks_per_transaction 设置为至少那么多,那么您应该没问题。

我通过单独备份所有模式解决了这个问题,因为数据库的大小(无论是 no.of 模式还是 no.of 表)增加了使用 pg_dump 进行备份的难度。

我对脚本进行了以下修改以进行模式备份:

  1. 在运行pg_dump之前,将所有数据库模式列出到一个文件中。这样我们就可以迭代所有模式并为模式备份。

    这是将所有架构列出到文件的命令

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

    此处sql_to_list_schema包含

    SELECT n.nspname 来自 pg_catalog.pg_namespace n 其中 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>

试试这个

shared_buffers = 512GB
max_locks_per_transaction=10000

请注意每个环境都不一样

我尝试在不调整任何缓冲区大小的情况下使用下面的方法并且它起作用了。

psql -U <db_user_name> -d <db_name> -f <file_name>.sql