1. 为什么你的数据库需要一个“后悔药”?
我见过太多因为数据丢失而焦头烂额的团队了。有一次,一个朋友半夜给我打电话,声音都在抖,说他们一个核心数据库的表被误操作清空了,问我有没有办法。幸运的是,他们之前听了我的建议,做了基础的 pg_dump 备份,虽然丢了几小时的数据,但至少把业务救了回来。从那以后,他们团队对备份的态度,从“可有可无”变成了“头等大事”。
对于 PostgreSQL 来说,备份就是你的“后悔药”。但很多新手朋友一上来就懵了:逻辑备份、物理备份、连续归档……这些词听起来就头大。别急,咱们今天不聊枯燥的理论,就聊实战。我会把我这些年踩过的坑、总结出来的最佳实践,用最直白的话告诉你。不管你是在自己的笔记本上跑着玩的小项目,还是管理着公司核心业务的生产库,这篇文章都能帮你建立起一套从“能用”到“好用”再到“放心”的备份体系。
简单来说,PostgreSQL 的备份主要分两大流派:逻辑备份和物理备份。逻辑备份,比如用 pg_dump,就像是给你的数据库拍一张“照片”,记录下某个瞬间它长什么样(表结构、数据)。这个照片是 SQL 语句,你可以拿到任何支持 SQL 的地方去“冲洗”出来。而物理备份,特别是我们今天要重点讲的连续归档,更像是给数据库拍“视频”。它先拍一个完整的全量快照(基础备份),然后持续记录下之后发生的每一个变化(WAL 日志)。这样,你不仅能恢复到拍照的那个时间点,还能快进或倒退到“视频”记录中的任何一个瞬间,实现时间点恢复(PITR)。
这篇文章,我们就从最简单的“拍照”开始,一步步教你如何设置一套可靠的“录像”系统,让你高枕无忧。
2. 逻辑备份:给你的数据库拍张“快照”
逻辑备份是最容易上手的方式,它的核心思想就是把数据库里的对象(表、数据、函数等)转换成一系列 SQL 命令。恢复的时候,就是重新执行这些 SQL 命令,重建出一个一模一样的数据库。pg_dump 和 pg_dumpall 是完成这个任务的两位主力。
2.1 单兵利器:pg_dump 详解与实战
pg_dump 是备份单个数据库的瑞士军刀,功能极其灵活。很多新手只知道最简单的命令,其实它的参数玩好了,能解决很多特定场景的问题。
首先,连接数据库的基本参数你得熟悉:
-h:数据库主机地址,本地可以省略。-U:连接的用户名。-d:指定要备份的数据库名。-p:端口号,默认是 5432。-W:强制提示输入密码。我建议在脚本里用~/.pgpass文件管理密码更安全。
接下来是决定备份命运的 -F 格式参数,这是关键:
-Fp或 不指定(纯文本格式):默认选项,生成一个.sql文件。好处是肉眼可读,可以用文本编辑器打开检查,恢复时用psql命令。缺点是对于大数据库,文件体积大,恢复速度慢。适合小数据库或者需要人工审阅备份内容的场景。-Fc(自定义格式):这是我最推荐的格式。它生成一个二进制的.dump文件。优点太多了:默认压缩,节省空间;支持并行备份和恢复(-j参数);最重要的是,恢复时可以用pg_restore灵活选择恢复哪些对象(比如只恢复某个表,或者只恢复结构不恢复数据)。实测下来,对于生产环境,-Fc格式在速度和灵活性上是最稳的选择。-Fd(目录格式):创建一个目录,里面每个大表可能对应多个文件。它也支持压缩和并行,并且可以直接用文件系统工具操作部分备份文件。适合超级大的数据库,或者需要将备份内容拆分存储的场景。-Ft(tar 格式):将目录格式打包成一个.tar文件。不支持额外压缩,也不能在恢复时重排序对象。个人觉得用处不大,不如直接用-Fc。
控制备份内容的参数也非常实用:
-s:只备份表结构(模式),不要数据。做数据迁移前的结构比对,或者搭建测试环境时常用。-a:只备份数据,不要结构。适用于向已有结构的表里灌入数据。-t table_name:只备份指定的表。可以接多个-t来备份多个表。-n schema_name:只备份指定的模式(schema)。-C:在备份文件中加入CREATE DATABASE语句。这样恢复时可以不先创建数据库。-c和--if-exists:搭配使用,会在备份文件中加入DROP ... IF EXISTS语句。在恢复时先清理原有对象,非常适合在测试环境做全量覆盖式恢复。在生产环境恢复时要极度小心这个组合!--inserts或--column-inserts:用INSERT语句代替默认的COPY命令来导出数据。COPY更快,但INSERT语句的备份文件兼容性更好,比如你想把数据导入到非 PostgreSQL 数据库时。
下面是我常用的几个实战命令示例,你可以直接抄作业:
# 1. 全库备份,使用最推荐的自定义压缩格式
pg_dump -h 192.168.1.100 -U postgres -d myapp -Fc -f /backup/myapp_$(date +%Y%m%d).dump
# 2. 只备份表结构,用于文档或审计
pg_dump -h 192.168.1.100 -U postgres -d myapp -s -f /backup/myapp_schema_only.sql
# 3. 只备份‘public’模式下的‘users’和‘orders’两个表的数据
pg_dump -h 192.168.1.100 -U postgres -d myapp -n public -t users -t orders -a -Fc -f /backup/two_tables_data.dump
# 4. 超大数据库备份组合拳:并行备份+自定义格式+压缩
pg_dump -h 192.168.1.100 -U postgres -d very_large_db -Fc -j 4 -f /backup/large_db_parallel.dump
# -j 4 表示用4个并行作业,能大幅提升备份速度,尤其对多表、大表数据库。
# 5. 生成带DROP语句的备份,用于搭建纯净测试环境
pg_dump -h 192.168.1.100 -U postgres -d myapp -C -c --if-exists -f /backup/myapp_clean_create.sql
对于巨型数据库,直接备份成一个文件可能不好管理。我们可以用管道配合系统工具:<

961

被折叠的 条评论
为什么被折叠?



