一: 冷备份流程
- 关闭数据库实例:
pg_ctl stop -m fast - 备份数据库目录:
1. tar zcvf databackup-20260311.tar.gz /postgresql/data
或者:
2. mkdir -p /backup/data_bak
cp -rp /postgresql/data/* backup/data_bak - 模拟数据库崩溃 或在第三方机器上恢复数据库:
1. 解压 备份的tar包:
tar zxvf databackup-20260311.tar.gz -C /postgresql/data
或者:
2. cp -rp backup/data_bak/* /postgresql/data - 启动数据库
pg_ctl start
🧊 阶段一:绝对静止的降临(Clean Shutdown)
- 物理动作:你敲下了
pg_ctl stop -m fast(或者smart)。 - 状态机流转:
- 切断前台:系统极其冷酷地拒绝所有新的客户端连接,并强行掐断当前正在执行的所有业务会话。
- 最后的大扫除(终极 Checkpoint):这是最核心的一步!系统强制唤醒 Checkpointer,把共享内存(Shared Buffers)里所有的脏页,一滴不剩地全部刷入底层的
.heap数据文件中。 - 刻录死亡宣告:刷盘完毕后,内核在
pg_control文件里刻下最后一次 REDO LSN,并将状态从in production物理篡改为shut down。
- 定性:在这一刻,内存和硬盘达到了绝对的物理一致。时间停止了,没有任何残留在内存里的幽灵数据。
🩺 阶段二:法医级的验尸(状态校验与防呆)
- 物理痛点:普通 DBA 敲完 stop 命令,看着命令行返回成功,就直接开始
cp拷贝文件了。如果底层因为某些锁导致没完全关干净怎么办? - 原厂级微操:刚才我们学的屠刀派上用场了!原厂 DBA 一定会先敲一次
pg_controldata $PGDATA。 - 逻辑咬合:
- 如果看到
Database cluster state: shut down:完美!说明这是一具极其干净、完整的“尸体”,随时可以搬运。 - 如果看到
in production或in crash recovery:绝对禁止拷贝! 因为一旦在in production状态下使用cp或tar去拷文件,你会拷出无数个“上半身旧、下半身新”的撕裂块(Torn Pages)!在冷备模式下,因为没有backup_label和全页写入(full_page_writes)的保护,这些撕裂块在恢复时绝对无法修复,数据库直接报废!
- 如果看到
📦 阶段三:连根拔起的搬运(Physical Copy)
- 物理动作:宇宙已经绝对静止且一致。你掏出最原始的操作系统命令:
tar -czvf backup.tar.gz $PGDATA,或者cp -a $PGDATA /mnt/backup/。 - 搬运清单:
- 核心宇宙:整个
$PGDATA目录(表文件、索引、控制文件)。 - 外围星系(高危踩坑点):如果库使用了自定义表空间(
pg_tblspc目录下的软链接),必须顺藤摸瓜,把那些挂载在外部/mnt/nvme_fast/等目录下的真实数据文件一并打包带走! - 时空记录仪:
pg_wal目录下的日志。(虽然对于完美的冷备来说,即使没有旧日志数据库也能直接启动,但带上它们可以为你保留未来做 PITR 的可能性)。
- 核心宇宙:整个
⚡ 阶段四:跨越时空的复活(Restore & Boot)
- 物理动作:机器烧毁了。你在新机器上解压刚才的
tar包。 - 权限的物理封锁(防呆机制二):解压后,你必须保证整个
$PGDATA的属主是postgres用户,且目录权限绝对是0700(drwx——)。如果你用root用户或者0777权限去拉起数据库,PG 的内核为了防止安全穿透,会直接抛出 FATAL 拒绝启动! - 复活逻辑:敲下
pg_ctl start。- Startup 进程醒来,第一件事就是去读
pg_control黑匣子。 - 它看到了
Database cluster state: shut down。 - 系统长舒一口气:“原来我是正常寿终正寝的,没有任何丢失的事务需要抢救。”
- 于是,它直接跳过崩溃恢复逻辑,瞬间拉起所有的后台进程,开放端口,迎接新的业务连接。
- Startup 进程醒来,第一件事就是去读
⚖️ 战略定性:为什么现代架构极少用冷备?
指挥官,逻辑推演完毕。但在海量数据的原厂面试中,你必须给出**“战略级”的商业定性**:
- 冷备的绝对优势:它是一份**“开箱即用”**的数据切片。恢复它不需要复杂的
backup_label,不需要重放几十 GB 的 WAL 日志。解压,启动,秒级复活。 - 冷备的致命缺陷:它需要数据库彻底停机! 在如今金融、电商 7×24 小时不间断的修罗场里,谁敢敲下
pg_ctl stop让业务停机 2 个小时去拷数据?这等同于拔掉公司的生命维持系统!
所以,冷备份现在只存在于两种极端战区:
- 极其古老、数据量极小的边缘内部系统。
- 在做跨大版本灾难性升级(如 PG 11 升级到 PG 17 的
pg_upgrade)之前,DBA 为了保住自己的项上人头,在停机窗口里强制做的一次**“最终底线快照”**。
🧬 终极推演一:物理字节序的基因隔离(跨平台的死亡禁区)
- 灾难现场:公司原本的生产库在几台老旧的 x86_64(Intel/AMD)架构服务器上。现在全面信创化,采购了一批全新的鲲鹏/飞腾 ARM64 架构服务器。你为了省事,停了老库,打了个完美的冷备
tar包,传到新机器上解压,满心欢喜地敲下pg_ctl start。 - 物理真相(Endianness 与对齐):还记得我们在上一局拆解
pg_controldata时看到的那些“宇宙物理常数”吗?Maximum data alignment: 8Float8 argument passing: by value
- 逻辑咬合与最终判决:冷备份是纯物理的二进制拷贝!它把硬盘上 0 和 1 的排列顺序原封不动地搬了过去。但是,x86 架构和 ARM 架构在底层的字节序(大小端格式,Big-Endian vs Little-Endian)和内存对齐方式上可能存在根本性的差异!
- 定性:原厂专家在做冷备迁移时,脑子里永远有一道极其森严的铁律:物理冷备份绝对禁止跨越操作系统平台(如 Windows 拷给 Linux)、绝对禁止跨越 CPU 架构(x86 拷给 ARM)、绝对禁止跨越大版本(PG 12 拷给 PG 16)! 一旦跨越,底层的 C 语言结构体解析瞬间错乱,内核直接报 FATAL 拒接接客。跨平台迁移,只能老老实实用逻辑备份(
pg_dump)!
🕳️ 终极推演二:失去时空航标的盲目漂流(冷备与 PITR 的暗坑)
- 灾难现场:你今天做了一个完美的冷备份(脱机拷贝)。然后你拉起数据库,让它继续跑,同时开启了 WAL 归档。一周后,有人删库了,你想用**“今天的冷备 + 这一周的 WAL 归档”**来做 PITR(按时间点恢复)。
- 物理真相(没有
backup_label):- 热备(
pg_basebackup)会在备份开始时,极其贴心地给你生成一个backup_label文件,里面写死了“恢复必须从哪个 LSN 起点开始”。 - 但是!你做冷备份的时候,是直接粗暴地
cp文件的,系统根本没有生成backup_label!
- 热备(
- 逻辑咬合与最终判决:当你把冷备解压,把一周的日志塞进去,试图做恢复时,恢复引擎(Redo)醒来一看
pg_control里写着shut down,它会认为这是一次正常重启,而不是灾难恢复!它会极其傲慢地直接跳过你准备的那些远端归档日志,直接宣告启动完毕!你的 PITR 彻底宣告失败! - 原厂级补救微操:如果你非要用冷备做 PITR 的基线,你必须在冷备重启的那一瞬间,手工执行一个
pg_switch_wal(),并死死记住那个时刻的 LSN,还要在恢复时强行写一个特殊的recovery.signal逼迫内核进入恢复状态。这在生产中极容易玩脱!
💣 暗礁一:WAL 独立挂载的“双重软链接绞肉机”
- 灾难现场:你已经极其聪明地记住了要把
pg_tblspc(表空间)的软链接用tar -h顺藤摸瓜打包。但你忽略了另一个极其致命的系统级软链接——pg_wal(在 PG 10 以前叫pg_xlog)。 - 物理真相:为了防止高并发下 WAL 写入和数据文件(
.heap)刷盘发生 I/O 争抢,原厂架构师在建库时,100% 会把pg_wal目录单独拉出来,挂载到一块极其昂贵的独立 NVMe 固态硬盘上,然后在$PGDATA下建一个指向它的软链接。 - 逻辑咬合:如果你做冷备时忘了把真实的 WAL 挂载路径(比如
/mnt/nvme_wal/)一起打包带走,当你把数据库在新机器上解压拉起时,系统会报出极其绝望的错误:PANIC: could not open file "pg_wal/000000010000000000000001"。没有 WAL 日志,哪怕是正常关闭的冷备尸体,PostgreSQL 的状态机也会因为找不到初始化时空坐标而拒绝诈尸! - 原厂微操:冷备不仅要打包
$PGDATA,还要单独校验并打包pg_wal的真实物理路径。
🛡️ 暗礁二:操作系统维度的“叹息之墙”(SELinux 与扩展属性)
- 灾难现场:你把冷备的
tar包传到了新服务器,极其规范地执行了chown -R postgres:postgres $PGDATA,并且把权限死死卡在0700。然后敲下pg_ctl start。结果系统秒退,报错:Permission denied!你疯狂ls -l,发现权限明明全是postgres,完全见鬼了! - 物理真相:Linux 系统的安全防线不止有 UGO(User, Group, Other)权限,还有极其恐怖的 SELinux(安全增强型 Linux)安全上下文(Security Context)和 ACLs(访问控制列表)!
- 逻辑咬合:你用最普通的
tar -czvf打包时,那些挂在文件系统底层的 SELinux 标签和 ACL 扩展属性(xattr)被无情地剥离丢弃了。当数据来到开启了严格 SELinux 策略的新服务器时,内核的安全模块(LSM)发现这些文件没有合法的“数据库进程标签”,直接在系统调用层面将其物理阻断! - 原厂微操:在金融级极严苛的 OS 环境下做冷备,必须使用极其冗长的命令:
tar --selinux --acls --xattrs -cpzvf backup.tar.gz $PGDATA(加上-p保留原有权限体系)。
🗑️ 暗礁三:幽灵状态的物理寄生(pg_stat_tmp 与 pgsql_tmp)
- 物理痛点:数据库在高速运行时,会在
$PGDATA/pg_stat_tmp目录下疯狂写入内存统计信息的快照,并在$PGDATA/base/pgsql_tmp下生成极其庞大的临时排序文件(当work_mem不够用时)。 - 逻辑咬合:虽然你敲了
pg_ctl stop -m fast,理论上内核会清理这些垃圾。但在极其极端的异常关闭(比如stop -m immediate或直接kill -9后被迫做冷备)场景下,这些几 GB 甚至几十 GB 的“幽灵垃圾”会残留在目录里。 - 最终判决:把这些垃圾打包进冷备,不仅白白浪费宝贵的备份存储空间和网络传输带宽,在灾难恢复拉起时,旧的、错乱的统计信息(
pg_stat_tmp)还可能导致恢复后的最初几分钟内,优化器(Planner)因为读取了过期的统计快照,而疯狂生成极其弱智的慢查询执行计划(导致业务“启动即雪崩”)。 - 原厂微操:原厂 DBA 在写冷备脚本时,必然会加上极其精准的排除参数:
tar --exclude='pg_stat_tmp/*' --exclude='*/pgsql_tmp/*' ...,实现纯粹的无状态肉体搬运。
⚡ 暗礁四:企业级降维打击(LVM 瞬间快照冷备)
- 灾难现场:老板站在你背后,拔出刀指着你的脖子说:“我不管你用什么冷备,核心库的数据量有 5TB,普通的
cp或tar至少要拷 3 个小时!业务绝对不能停机 3 个小时,最多给你 1 分钟停机窗口,你必须给我搞出一份绝对物理一致的冷备份!” - 原厂级架构破局(存储层面的时空冻结):
- 倒计时 00:00:执行
pg_ctl stop -m fast,等待脏页刷盘,数据库干净关闭(耗时约 10 秒)。 - 倒计时 00:10:DBA 转身切入操作系统底层,敲下
lvcreate -s -L 50G -n pg_backup_snap /dev/mapper/vg0-pgdata。利用 Linux LVM(逻辑卷管理)或企业级 SAN 存储的写时复制(COW)快照技术,在 1 秒钟内,将$PGDATA所在的整个文件系统“物理冻结”! - 倒计时 00:11:立刻敲下
pg_ctl start,数据库复活,业务重新接入(总停机时间不到 15 秒)。 - 后场操作:DBA 在后台把刚才那个 LVM 快照卷挂载到另一个目录,然后慢慢悠悠地花 3 个小时去
tar这个快照。
- 倒计时 00:00:执行
- 定性:这叫**“用底层存储的魔法,将 3 小时的物理冷备停机时间,强行坍缩成 10 秒钟”**。不懂这一招,在 TB 级数据库面前,你的冷备理论就是一张废纸。
💣 终极反物质陷阱一:“克隆体”的自爆倒计时(pg_replslot 复制槽幽灵)
- 最真实的作死现场:生产库(主库)太大了,为了给开发团队搭一套测试环境,你极其规范地做了一次完美的冷备份。在测试机上解压、修改端口、成功拉起。开发团队高呼 DBA 万岁。结果三天后,测试机的硬盘毫无征兆地被 100% 撑爆,数据库直接 PANIC 宕机!
- 底层真相(复制槽的物理遗传):生产主库上,通常挂着几个下游系统(比如流复制从库、或者 Flink CDC 的逻辑抽数)。这些下游系统的时空坐标,被死死记录在主库
$PGDATA/pg_replslot/目录下的物理文件中。 - 逻辑咬合的致命一击:
- 你做冷备时,把
pg_replslot目录原封不动地拷给了测试机。 - 测试机(克隆体)拉起后,内核一查这个目录:“哦!原来我还有几个小弟(从库/CDC)需要喂数据!”
- 于是,测试机开始疯狂地把生成的 WAL 日志全部死死扣留在本地,绝对不清理(因为配置了槽位,必须等小弟来取)。
- 但是,那是测试机啊!根本没有任何真实的从库会连上来消费!
- 最终,测试机的
pg_wal目录无限膨胀,直到撑爆整块硬盘,带着克隆体同归于尽。
- 你做冷备时,把
- 原厂级微操(绝育手术):如果冷备是为了做克隆克隆库,在打包时必须加上
--exclude='pg_replslot/*',或者在克隆体启动的第一时间,连进去疯狂敲pg_drop_replication_slot(),给它做物理绝育!
🏴☠️ 终极反物质陷阱二:商业级密码学的铁棺材(TDE 与外置密钥)
- 高阶降维打击现场:你去面试海量数据(Vastdata)、云和恩墨这种做商业发行版的原厂。他们的企业级 PostgreSQL 几乎 100% 开启了 TDE(透明数据加密)。
- 物理真相:在 TDE 开启的情况下,你拷走的那个
$PGDATA目录里,8KB 数据页里的内容不再是明文,而是被 AES-256 算法彻底搅碎的高熵乱码! - 逻辑咬合的终极审判:
- 冷备只拷贝了密文的肉体。
- 而解密这些肉体的“灵魂(Master Key)”,通常根本不在
$PGDATA里!它们被保管在外部的 KMS(密钥管理系统)服务器上,或者 Linux 的某个极度安全的 TPM 芯片/独立硬件加密机里。 - 如果你只懂抱着
$PGDATA跑路,到了灾备中心解压启动时,数据库会向你要主密钥。拿不出来?这几 TB 的冷备数据,就是一堆连量子计算机都算不出来的纯粹物理垃圾!
- 定性:在金融级架构下,冷备份已经不是单纯的“复制文件”,而是**“数据块拷贝 + 密钥库(KMS)离线引出”**的联合双重战术行动!
【PostgreSQL 物理冷备份:六维终极防御阵列】**:
🧊 第一维:时空静止与法医验尸(The Physics of Stoppage)
- 绝对红线:绝不盲目相信
pg_ctl stop的返回码。 - 物理防呆:必须使用
pg_controldata探底,只有当Database cluster state呈现出绝对安详的shut down时,宇宙才算真正静止,物理拷贝才被允许。若带着in production状态拷贝,必将产生无法修复的“撕裂块(Torn Pages)”。
🪤 第二维:文件系统的视觉欺骗(The Symlink & OS Traps)
- 藤与瓜的绞肉机:死死盯住
$PGDATA/pg_tblspc(自定义表空间)和$PGDATA/pg_wal(独立日志盘)下的软链接。必须顺藤摸瓜(如tar -h),否则拷走的永远只是一个几字节的快捷方式空壳。 - 叹息之墙:跨越极严苛的操作系统时,普通打包会剥离 SELinux 标签和 ACL 扩展属性,导致恢复时遭遇内核级
Permission denied。
🧬 第三维:宇宙常数的基因隔离(The Architecture Ban)
- 跨界禁区:冷备是纯二进制的硬盘拓印。底层的 Endianness(字节序:大小端) 和 CPU 内存对齐规则,决定了 x86 架构的冷备包绝对不能直接在 ARM(鲲鹏/飞腾)架构上拉起。跨平台、跨大版本,冷备即废纸。
- 密码学铁棺:若开启了 TDE(透明数据加密),冷备拷走的只是高熵乱码。没有 KMS 服务器或独立硬件导出的 Master Key,数据将遭遇降维打击,永远无法解密。
👻 第四维:幽灵状态的致命寄生(The Residual State Bombs)
- 自爆倒计时(
pg_replslot):带走旧主库的复制槽,会在新机器上唤醒幽灵订阅者,导致新库的 WAL 日志无限膨胀,最终同归于尽(必须在打包时排除或启动后立刻物理绝育)。 - 死前遗言(
pg_serial):带走了前世的SERIALIZABLE可串行化隔离级别锁状态,可能导致新库启动初期的幽灵幻读报错。 - 无日志大清洗(
_init分支):如果停机不干净,UNLOGGED表在复活时,会被其底层的_init空模板强行覆盖,主数据瞬间蒸发。 - 统计垃圾(
pg_stat_tmp):打包前必须排除内存统计快照和临时排序文件,防止新库启动时优化器智商掉线。
⚡ 第五维:企业级降维魔法(Time-Space Compression)
- 停机时间坍缩:面对 TB 级核心库,不允许 3 小时停机冷备。必须利用底层存储的 LVM Snapshot 或 SAN COW(写时复制快照) 技术,将物理冻结时间强行压缩至 10 秒以内,随后在后台慢慢拉走快照卷。
🕳️ 第六维:PITR 的时空盲区(The Navigation Blindspot)
- 缺失的航标:冷备不会像热备那样生成
backup_label。它是一座没有时间锚点的孤岛。用冷备做基线强行衔接归档日志做 PITR,内核会误以为是正常重启而拒绝回放,除非进行极其危险的极客微操(强制设标与写recovery.signal)。
了解 www.876873.xyz 的更多信息
订阅后即可通过电子邮件收到最新文章。
postgresql物理备份之: 冷备份:等您坐沙发呢!