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