【问题标题】:pg_dump on Database throwing error 'out of shared memory'数据库中的 pg_dump 抛出错误“共享内存不足”
【发布时间】:2016-09-01 13:45:54
【问题描述】:

在数据库上进行备份时遇到问题包含大约 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_buffers in 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

【问题讨论】:

    标签: postgresql postgresql-9.1 pg-dump


    【解决方案1】:

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

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

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

      这里是列出所有模式到文件的命令

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

      这里sql_to_list_schema包含

      选择 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>

    【讨论】:

    • 您为脚本提供的link 不再起作用...
    • 您可能希望在psql 命令中使用一些额外的参数。这将更容易将名称读取到变量中,例如:--no-align --tuples-only --record-separator=" "
    【解决方案2】:

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

    【讨论】:

    • 详情?你有多少张桌子,你的配置设置是什么?
    • @PeterEisentraut,感谢您的提示。最初不确定该属性必须在哪个文件中修改。后来得到朋友的帮助在哪里修改。 ../data/postgresql.conf
    • @Rao:然后呢?有帮助吗?
    【解决方案3】:

    试试这个

    shared_buffers = 512GB
    max_locks_per_transaction=10000
    

    请注意,每个环境都是不同的

    【讨论】:

    • 我收到这个错误:提示:这个错误通常意味着 PostgreSQL 对共享内存段的请求超出了可用内存、交换空间或大页面。要减少请求大小(当前为 563431931904 字节),请减少 PostgreSQL 的共享内存使用量,可能通过减少 shared_buffers 或 max_connections。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-05
      • 1970-01-01
      • 2014-10-13
      • 2015-06-15
      • 2018-05-05
      • 2011-08-18
      • 1970-01-01
      • 2013-07-13
      • 2011-03-09
      相关资源
      最近更新 更多