内容提要
Postgres备份主要有三种方式:逻辑备份(pg_dump)、文件系统备份和连续归档。pg_dump简单但大库耗时且可能引发事务回卷;文件系统备份需停机;连续归档结合WAL,支持在线备份和PITR,通过全页写入修复不一致数据,是生产环境首选,但恢复时需重放WAL,备份频率影响恢复速度。
延伸解读
pg_dump 的隐藏风险:事务回卷
pg_dump 在备份期间会固定一个事务快照,阻止事务地平线推进。在大型数据库和高写入吞吐下,这可能导致超过约 20 亿个新事务后触发事务回卷,使集群进入只读模式以保护数据。因此,对于 30TB 以上的集群,pg_dump 可能不适合作为定期备份工具,而更适合用于迁移等场景。
文件系统备份的局限
文件系统备份虽然比 pg_dump 快,但通常需要完全关闭数据库,否则可能产生不一致状态。除非底层文件系统支持原子快照,否则在线备份不可行。此外,文件系统备份和逻辑备份一样,无法包含备份之后的数据变更,因此对于生产环境,离线备份通常不可接受,需要结合 WAL 进行连续归档。
连续归档如何修复不一致数据
连续归档结合了文件系统备份和 WAL,利用全页写入(FPW)机制。即使备份过程中数据页被修改或损坏,WAL 中的完整页镜像也能在恢复时重建页面。恢复时需重放从 start_lsn 到 end_lsn 的所有 WAL,确保数据库达到一致状态,因此备份频率直接影响恢复速度。
Q&A
Postgres有哪些备份方式?
Postgres有三种备份方式:逻辑备份(pg_dump)、文件系统备份和连续归档。
pg_dump备份的优缺点是什么?
pg_dump是逻辑备份,简单易用,适合迁移,但大库备份耗时且消耗资源,可能影响性能,且不支持时间点恢复(PITR)。
为什么pg_dump可能导致事务回卷?
pg_dump在备份期间会持有事务快照,阻止事务horizon推进。如果数据库写入量大,超过约20亿个新事务后,可能导致事务回卷,使Postgres进入只读模式以防数据丢失。
文件系统备份有什么限制?
文件系统备份需要数据库完全关闭,否则可能产生不一致状态。它不包含备份后的数据变更,且停机时间长,不适合生产环境。
连续归档备份是如何工作的?
连续归档结合文件系统备份和WAL日志。先进行在线文件系统备份(可能不一致),然后通过重放WAL从start_lsn到end_lsn修复不一致,实现一致恢复。WAL持续归档支持时间点恢复。
什么是全页写入(FPW)?为什么它对于连续归档很重要?
全页写入是Postgres的一个设置,在检查点后首次更新页面时,将整个页面写入WAL。它确保即使文件系统备份中的页面损坏或不一致,也能通过WAL中的全页镜像恢复,是连续归档的关键。
Postgres如何实现时间点恢复(PITR)?
通过连续归档,保存WAL到外部存储,可以恢复任意备份并重放WAL到任意时间点。但重放WAL成本高,因此需要定期备份以限制重放范围。
为什么备份频率很重要?
备份频率影响恢复速度,因为恢复时需要重放WAL,重放比复制文件系统慢。频繁备份可减少WAL重放量,加快恢复。PlanetScale默认每12小时备份一次。