如何解决如何使用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
但是,您的架构更改方法对我来说似乎并不那么肮脏。它仍然需要一个瞬时访问排他锁,因此停机时间并不是真正的零,但是如果它能够足够快地获得所述锁,则停机时间可能并不明显。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。