良好的数据库备份是一致的,因此整个转储代表了开始转储时的状态。MySQL 上的典型策略是锁定表,因此在备份期间无法写入其他数据。但锁定数据库会带来糟糕的用户体验(如果转储花费大量时间,响应会很慢甚至超时)。所以我想知道 Postgres 是否有一种方法可以在不锁定表的情况下进行一致的备份。
(我目前使用 MySQL 的备份策略是只为备份设置一个从服务器,这样主服务器就可以继续满足用户请求,而我可以进行一致的转储。但这会引入其他故障点,例如复制可能会中断)
答案1
锁定和锁定是两码事。有些锁定根本不会造成任何问题,您可以照常使用数据库(访问共享锁定),而其他锁定则会产生重大影响并停止您的业务。
备份 PostgreSQL 数据库最简单的方法是pg_dump。我们每天备份多 TB 数据库,在工作时间内处理速度约为 2500 tps。
不要将 PostgreSQL 与 MySQL 进行比较,这是两个非常不同的数据库。MySQL 中许多难以修复的问题在 PostgreSQL 中都非常简单。进行一致的备份就是其中之一。
您不需要从属服务器来进行备份。这很方便,但不是必需的。
答案2
通过 ZFS 运行 PostgreSQL 并拍摄实时快照应该可以解决这个问题。
当然,该快照将包含脏事务日志,因此您必须将快照提升为克隆(可写快照),然后运行单独的 PostgreSQL 实例以清除/重播日志,然后从第二个实例进行转储。最后,您应该关闭第二个数据库服务器实例并删除克隆。
如果您没有足够的 RAM 在生产服务器上运行两个 PostgreSQL 实例,那么您可以将数据库快照传输到辅助服务器(使用 zfs send、zfs accept)并在那里进行转储。