我试图恢复一个大表
pg_restore.exe -U postgres -d db_name --clean --if-exists --single-transaction F:BackupsPostgreSQLdata.dump.gz
所以我有一个读锁几分钟。如何在读取时零停机的情况下恢复数据?我只需要阅读。
您不需要执行--clean,而是只执行--data,而是在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
然而,在我看来,你的模式更改方法并没有那么脏。它仍然需要一个瞬时访问独占锁,所以它并不是真正的零停机时间,但如果它能足够快地获得所述锁,它可能是不明显的停机时间。