PostgreSQL ERROR: out of shared memory处理

使用pg_dump命令导出一个库的时候,报

pg_dump: error: query failed: ERROR: out of shared memory

HINT: You might need to increase "max_locks_per_transaction".

从错误字面上看是超出内存大小了,建议增加max_locks_per_transaction参数

本环境中:

cpp 复制代码
[postgres174@geoscene ~]$ psql
psql (17.4)
Type "help" for help.

postgres=# show max_locks_per_transaction ;
 max_locks_per_transaction
---------------------------
 64
(1 row)

原因:

pg_dump -d dbname的时候会对库中所有的表执行lock table in shared mode 操作。

该操作会将表锁记录到表锁所在的共享结构中。

cpp 复制代码
lock.c: SetupLockInTable

lock = (LOCK *) hash_search_with_hash_value(LockMethodLockHash,
												locktag,
												hashcode,
												HASH_ENTER_NULL,
												&found);

LockMethodLockHash 结构在InitLocks初始化

cpp 复制代码
lock.c
InitLocks(void)
{
        HASHCTL         info;
        long            init_table_size,
                                max_table_size;
        bool            found;

        /*
         * Compute init/max size to request for lock hashtables.  Note these
         * calculations must agree with LockShmemSize!
         */

        //最大表大小
        max_table_size = NLOCKENTS();
        init_table_size = max_table_size / 2;

        /*
         * Allocate hash table for LOCK structs.  This stores per-locked-object
         * information.
         */
        info.keysize = sizeof(LOCKTAG);
        info.entrysize = sizeof(LOCK);
        info.num_partitions = NUM_LOCK_PARTITIONS;

        LockMethodLockHash = ShmemInitHash("LOCK hash",
                                                                           init_table_size,
                                                                           max_table_size,
                                                                           &info,
                                                                           HASH_ELEM | HASH_BLOBS | HASH_PARTITION);
...

查看

cpp 复制代码
#define NLOCKENTS() \
	mul_size(max_locks_per_xact, add_size(MaxBackends, max_prepared_xacts))


Size
mul_size(Size s1, Size s2)
{
	Size		result;

	if (s1 == 0 || s2 == 0)
		return 0;
	result = s1 * s2;
	/* We are assuming Size is an unsigned type here... */
	if (result / s2 != s1)
		ereport(ERROR,
				(errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
				 errmsg("requested shared memory size overflows size_t")));
	return result;
}

可以看出来,跟最大连接数和max_prepared_xacts相关

所以解决这个问题除了增加max_locks_per_xact参数的数量,增加最大连接数实际也可以。

相关推荐
IndulgeCui10 分钟前
KES集群部署安装问题记录
数据库
Yilena15 分钟前
通过mysqldump进行数据迁移时权限不足的解决方案
数据库·学习
韩立学长22 分钟前
基于Springboot酒店管理系统的设计与实现c12044zy(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
han_hanker23 分钟前
统一拦截异常 @RestControllerAdvice
java·开发语言·数据库
herinspace1 小时前
管家婆软件年结存后快马商城操作注意事项
服务器·数据库·windows
qq_348231851 小时前
MySQL 与 PostgreSQL PL/pgSQL 的对比详解
数据库·mysql·postgresql
玩转数据库管理工具FOR DBLENS1 小时前
DBLens:开启数据库管理新纪元——永久免费,智能高效的国产化开发利器
数据结构·数据库·测试工具·数据库开发
芝麻馅汤圆儿2 小时前
sockperf 工具
linux·服务器·数据库
IndulgeCui2 小时前
金仓数据库征文_使用KDTS迁移mysql至金仓数据库问题处理记录分享
数据库
wsx_iot2 小时前
mysql的快照读和当前读
数据库·mysql