【发布时间】:2020-12-04 23:13:35
【问题描述】:
我尝试恢复一个大表
pg_restore.exe -U postgres -d db_name --clean --if-exists --single-transaction F:\Backups\PostgreSQL\data.dump.gz
所以我有几分钟的读锁。如何以零停机时间恢复数据以进行读取?我只需要阅读。
【问题讨论】:
-
--clean 表示表被删除并重新创建。读者应该读什么?
-
这也是锁进入的地方。Locks
ACCESS EXCLUSIVE"由 DROP TABLE 获取,..." [...] "只有 ACCESS EXCLUSIVE 锁会阻止 SELECT(没有FOR UPDATE/SHARE) 语句。”所以你将不得不告诉我们什么更重要,摆脱读锁或DROP/CREATE循环? -
恢复数据的过程根据定义承认数据库或至少特定表当前处于无效/不准确状态。然后允许的任何选择都可能返回无效/不准确的结果。这比等待或根本没有结果更糟糕。您最好的方法是通知您的用户(广播消息等),然后使用锁定进行恢复。
-
@jjanes 我也用
--single-transaction,所以我想旧数据应该仍然存在,我想读一下。 -
现在我尝试了一种肮脏的方法:将表恢复到此数据库中的另一个模式,然后
DROP旧表和ALTER TABLE新表SET SCHEMA public。通过这种方式,我的停机时间为零……但我仍在寻找更干净的解决方案。
标签: postgresql backup psql pg-restore