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参数的数量,增加最大连接数实际也可以。

相关推荐
两千次11 小时前
写csv测试
服务器·数据库·windows
todoitbo11 小时前
从MongoDB到金仓:电子证照系统国产化改造的实践与经验
数据库·mongodb
谱写秋天12 小时前
软考-系统架构设计师*数据库基本概念详细讲解
数据库·系统架构·软考架构师
Java永无止境13 小时前
延时任务之Redis 过期事件监听原理与缺陷
数据库·redis·缓存·延时任务
Albert Edison13 小时前
【MySQL】表的操作
数据库·mysql·oracle
欢喜躲在眉梢里13 小时前
mysql中的日志
android·运维·数据库·mysql·adb·日志·mysql日志
java1234_小锋13 小时前
Redis线上操作最佳实践有哪些?
数据库·redis·缓存
合作小小程序员小小店13 小时前
web开发,在线%校园,论坛,社交管理%系统,基于html,css,python,django,mysql
数据库·后端·mysql·django·web app
清风66666614 小时前
基于51单片机的空气质量检测PM2.5粉尘检测设计
数据库·单片机·嵌入式硬件·毕业设计·51单片机·课程设计
倔强的石头_15 小时前
【金仓数据库】ksql 指南(一) 连接本地 KingbaseES 数据库与基础交互
数据库