pg_dump on数据库抛出错误'超出共享内存'

pgo*_*ngi 6 postgresql pg-dump postgresql-9.1

在数据库上进行备份时遇到问题包含大约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
Run Code Online (Sandbox Code Playgroud)

更新max_locks_per_transaction到256 in postgresql.conf并没有解决问题.

有没有可能导致这个问题的可能性?

编辑:(2016年5月7日)

Postgresql版本= 9.1

操作系统= Ubuntu 14.04.2 LTS

shared_buffersin postgresql.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
Run Code Online (Sandbox Code Playgroud)

Pet*_*aut 6

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


pgo*_*ngi 5

我通过单独备份所有模式作为数据库的大小(无论是模式还是没有表)来解决这个问题,增加了使用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>