如何使用PostgreSQL的“ pg_restore”和零停机时间恢复数据?

问题描述

我尝试还原一张大桌子

pg_restore.exe -U postgres -d db_name --clean --if-exists --single-transaction F:\Backups\Postgresql\data.dump.gz

所以我有几分钟的读锁。如何以零停机时间恢复数据以进行读取?我只需要阅读。

解决方法

您将不需要执行--clean而是仅执行--data-only,而是在COPY前在同一事务内执行DELETE from tablename。我认为没有办法让pg_restore为您做到这一点,但是您可以将pg_restore的输出转储到文件中并进行编辑,或者使用sed或perl之类的东西来注入DELETE。

这应该适用于不需要用引号引起来的表名,并且假定没有要复制的数据都具有以'COPY'开头的第一列:

pg_restore --data-only --single-transaction dmp.dmp -f -| perl -pe 's/^COPY ([\w.]+)/delete from $1; copy $1/' | psql -U postgres -d db_name

但是,您的架构更改方法对我来说似乎并不那么肮脏。它仍然需要一个瞬时访问排他锁,因此停机时间并不是真正的零,但是如果它能够足够快地获得所述锁,则停机时间可能并不明显。