聊到 PostgreSQL 的备份和还原,这事儿吧,说简单也简单,说复杂能把你绕晕。我见过不少新手,一上来就拍脑袋用 pgdump,结果数据量一大,跑半天卡壳,连个完整备份都捞不着。也见过老司机,嫌麻烦懒得折腾,结果生产库挂了,哭爹喊娘找恢复方案。备份这东西,说白了就是给数据库买份保险,平时看着多余,真出事时才知道值不值。

先说说最常见的 pgdump。这家伙能把数据库导成一个 SQL 文件,适合小规模数据或者日常迁移。比如你有个测试库,想定期把数据倒出来做归档,直接一句 就完事。但别高兴太早,pgdump 有个大坑——它默认是阻塞写入的。如果你在跑业务的库上直接搞,表锁一上,查询就得排队。我见过有人白天高峰期跑备份,结果页面卡了十分钟,用户骂娘。所以,小库可以这么玩,大库或生产环境,最好加 参数,或者干脆用 并行导出,能快不少。
说到并行导出,就不得不提 pgdump 的升级版——pgdumpall。这货能一口气导出整个集群里的所有数据库,包括用户和权限。但别被它“全能”的外表骗了,pgdumpall 本质上还是串行操作,数据量大时慢得跟蜗牛似的。更坑的是,它默认用文本格式输出,恢复时得一条条解析,效率低得令人发指。我建议,除非你只有几个小库,否则别碰它。正经做法是:用 pgdump 逐个库备份,或者直接上物理备份工具,比如 pgbasebackup。
物理备份才是大库的救星。pgbasebackup 能直接拷贝数据文件,不锁表,不阻塞写入,适合几十 GB 甚至 TB 级别的数据库。比如你用 ,就能生成一个压缩的 tar 包,恢复时解压到数据目录就行。但注意,物理备份依赖 WAL 日志,你得确保归档功能是开启的。否则,备份点之后的数据全丢。我见过有人只做了一次全量备份,没开归档,结果系统崩溃后恢复的数据还是昨天的,业务直接停摆三天。这教训够惨重。
备份只是第一步,还原才是真功夫。很多人在测试环境备份得欢,一到生产还原就抓瞎。比如用 pgdump 导出的 SQL 文件,恢复时直接 。但如果是大文件,你得加 参数指定数据库名,不然默认连到 postgres 库,容易搞混。更坑的是,如果原库有触发器或外键约束,恢复时可能因为顺序问题报错。这时候,pgrestore 就派上用场了。它支持自定义格式的备份文件,还能指定恢复哪些表,比如只想恢复某张表,一句 就行,省得全量恢复浪费时间。
说到格式,pgdump 支持四种输出:纯文本、自定义、目录和 tar。纯文本最直观,但恢复慢;自定义格式支持压缩和选择性恢复,适合大库;目录格式能并行恢复,性能翻倍;tar 格式就是个压缩包,兼容性一般。我的建议是:小库用纯文本,方便查看;大库用自定义格式,配合 并行参数,恢复速度能快好几倍。比如 ,用 4 个线程并行恢复,效率拉满。
但备份和还原不只是工具的事,策略才是关键。我见过最典型的错误是:只做全量备份,不做增量。结果数据量一涨,备份时间从半小时变成三小时,恢复时还得全量搞,业务等不起。正确做法是:每周一次全量备份,每天一次增量,或者用 WAL 归档实现连续备份。比如设置 和 ,把 WAL 日志实时传到远程存储。这样,即使系统崩溃,你也能恢复到秒级。当然,WAL 归档也有坑:磁盘空间得够,不然日志写满会卡死数据库。我见过有人忘了监控磁盘,结果归档目录爆了,数据库直接停写,业务全挂。
不同场景下,备份策略也得调整。比如开发环境,数据丢了就丢了,用 pgdump 每天跑一次就行。但生产环境,尤其是金融或电商系统,得用物理备份加 WAL 归档,甚至做异地容灾。我有个朋友在支付公司,他们的备份策略是:本地每天全量,WAL 实时同步到异地,再加个冷备硬盘。结果某次机房断电,他们半小时就恢复了,老板直夸靠谱。但小公司别盲目跟风,成本太高,用云服务自带的备份功能就行,比如 AWS RDS 的自动快照,省心省力。
说个容易被忽略的点:备份验证。很多人备份完就扔一边,结果恢复时发现文件损坏或格式不对。我建议,每次备份完成后,至少做一次恢复测试,哪怕只恢复一张表。比如用 看看备份文件里的内容,或者用 检查数据完整性。别嫌麻烦,我见过有人备份了半年,恢复时发现数据全是乱码,原因是备份过程中磁盘挂了。备份不验证,等于白忙活。
备份和还原这事儿,没有银弹。你得根据数据量、业务重要性、恢复时间目标来选方案。小库用 pgdump,大库上 pg_basebackup,关键业务加 WAL 归档。但不管用什么工具,记住三句话:备份要自动化,还原要演练,日志要监控。否则,哪天数据库崩了,你只能看着屏幕,祈祷老天爷赏饭吃。


