我的步骤:
pg_dumpall
在服务器上运行决赛prod-server-old
- 永远关闭
prod-server-old
。 - 将输出复制到不同的服务器 (
prod-server-new
) - 在那里恢复数据库。
- 所有流量都到
prod-server-new
现在
如何避免在pg_dumpall
(step1 和 step2 之间)对数据库进行修改,使这段时间的修改不会丢失?
在我的情况下,有一小段停机时间是 100% 可以的。
“集群”中有几个数据库(顺便说一句,我不喜欢“集群”这个词。我想大多数人认为“集群”是一组多台计算机,但在这种情况下它意味着一个 Postgres 服务器,它拥有几个数据库)。
我的问题被标记为可能与“使 Postgres 数据库暂时只读(用于执行卷快照)”重复。我不认为它是重复的,因为在我的情况下是不同的,因为我不要求临时只读状态。
有两种方法可以做到这一点:
撤销对该组的
connect
特权public
。这将阻止除超级用户之外的所有人进行连接。然后重新启动服务器或终止所有连接,然后使用超级用户帐户继续备份。将您的数据库置于只读模式:
继续
pg_dumpall
。无需重新启动,也无需停机。当然,您必须在要“锁定”的每个数据库上重复此操作。如果您有大量数据库,您可以将整个集群设为只读:
default_transaction_read_only = on;
在您的 postgresql.conf 中设置,然后重新加载 postgres 服务。请注意,我没有测试任何这些命令,风险自负。
一种解决方法:
更改 PostgreSQL 的端口
prod-server-old
。这样,客户端不太可能在pg_dumpall --port=OTHER_PORT
.我是 SQL Server 管理员(不是 Postgres),所以我不能 100% 确定,但如果停机时间不是问题,您可以:
?
使用触发器:
然后使数据库只读:
并使其再次可编辑: