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

时间:2016-05-06 13:03:15

标签: postgresql postgresql-9.1 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_transactionpostgresql.conf更新为256并未解决问题。

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

已编辑:(2016年5月7日)

Postgresql版本= 9.1

操作系统= Ubuntu 14.04.2 LTS

shared_buffers = 2GB

中的

postgresql.conf

已编辑:(2016年5月9日)

我的postgres.conf

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

4 个答案:

答案 0 :(得分:5)

我通过单独备份所有模式作为数据库的大小(无论是模式还是没有表)来解决这个问题,增加了使用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!〜&#39; ^ pg _&#39; AND n.nspname&lt;&gt; &#39; INFORMATION_SCHEMA&#39 ;;

  2. 现在阅读output_file的所有行并备份该架构

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

尝试一下

shared_buffers = 512GB
max_locks_per_transaction=10000

请注意,每个环境都不同

答案 3 :(得分:-1)

我尝试在不调整任何缓冲区大小的情况下使用以下内容,并且成功了。

for(int i=1;i<=50;i++)

    {
        s+=to_string(i)+s; 
    }