postgresql 超大表上的pg_dump无法锁定表

rm5edbpk  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(219)

我已经定义了一个LOG表。然后我创建了很多子表,每分钟一个,格式如下:

create LOG_20231209_1500 .. inherits LOG;
create LOG_20231209_1501 .. inherits LOG;
create LOG_20231209_1502 .. inherits LOG;
...

字符串
多年后,count(*)在x2上返回数十亿。子表的数量为:357299
但是现在是备份的时候了,我想把每个表都备份到自己的文件中
不幸的是,使用以下命令:

pg_dump logdb -t LOG_20231209_1501 > LOG_20231209_1501.sql


引发以下错误:

pg_dump: error: query failed: ERROR:  out of shared memory
HINT:  You might need to increase max_locks_per_transaction.
pg_dump: error: query was: LOCK TABLE public.LOG_20231209_1501 IN ACCESS SHARE MODE


即使对于一个有3000条记录的小表也是如此。请注意,直接select * from LOG_20231209_1501会立即产生结果。还要注意,我已经在postgres.conf中配置了max_locks_per_transaction=1024,但没有成功。
当我转储时没有人在使用数据库:我能让pg_dump避免锁定表并不进行任何修改吗?
PostgreSQL版本:14.8

xzabzqsa

xzabzqsa1#

正如注解中所建议的,对这个问题的partial回答是将max_locks_per_transaction增加到(至少)查询中涉及的对象数量。在我的例子中,由于父表有359299个子表,我不得不设置max_locks_per_transaction=360000pg_dump工作。
这仍然是一个部分答案,因为pg_dump仍然试图锁定所有表以转储一个表的结构或数据;由于这一点,即使一个简单的COPY tab INTO 'file' CSV是立即的,也需要长达1分钟的执行时间;这使得使用pg_dump转储所有表变得不切实际。
我仍然相信正确的方法-如果可行的话-是让pg_dump完全避免锁定。

相关问题