🌿 第一环:物理造假(CREATE TABLESPACE 到底干了什么?)
- 业务诉求:你的核心订单表太大了,且要求极高的读写速度。于是,你在系统里插了一块极速的 NVMe 固态硬盘,挂载在操作系统的
/mnt/nvme_fast/目录下。 - 物理动作:你敲下了
CREATE TABLESPACE order_space LOCATION '/mnt/nvme_fast';。 - 底层真相(造藤):PostgreSQL 内核极其狡猾。它并没有把整个
$PGDATA搬过去,而是在$PGDATA/pg_tblspc/这个特殊目录下,建了一个操作系统的符号链接(Symlink,类似于 Windows 的快捷方式)。- 这个软链接的名字是一串数字(比如
16385,这是表空间的 OID)。 - 这个软链接的指向是:
-> /mnt/nvme_fast/。
- 这个软链接的名字是一串数字(比如
- 定性:在
$PGDATA目录内部,这个表空间只占用了 几个字节 的软链接空间,它是一根“空心的藤”。而真正几百 GB 的“大瓜”,全都躺在那个外部的 NVMe 硬盘里。
🪤 第二环:致命的盲备份(tar 命令的无知)
- 灾难起点:某天晚上,你接到指令做冷备。你敲下了
pg_ctl stop,然后自信满满地敲下:tar -czvf backup.tar.gz $PGDATA。 - 物理真相(只剪藤,不摘瓜):Linux 底层的
tar或cp命令默认是非常“死板”的。当它扫描到$PGDATA/pg_tblspc/16385这个软链接时,它只会把这个“指向外部路径的快捷方式”打包进去。它绝对不会自动跨过链接,去把/mnt/nvme_fast/目录下那几百 GB 的真实数据拉进来! - 定性:你以为你备份了几百 GB 的全库数据,看着进度条飞快跑完还挺高兴。实际上,你的备份包里只装了一个空壳!核心订单数据被你完美地遗弃在了原地。
💥 第三环:借尸还魂的溃败(恢复时的 PANIC 宕机)
- 灾难降临:主库所在的主机主板烧毁了。你把
backup.tar.gz拿到一台全新的灾备机器上解压。 - 物理动作:你解压出
$PGDATA,设置好权限,敲下pg_ctl start。 - 死亡审判:
- 数据库 Startup 进程启动,读取系统表
pg_class。 - 内核发现:“哎?核心订单表
orders的物理位置是在 OID 为 16385 的表空间里!” - 内核顺着藤摸过去,试图访问
$PGDATA/pg_tblspc/16385/...。 - 操作系统拦截:“报告内核!这个软链接指向本机的
/mnt/nvme_fast/,但是这台新机器根本没有这个目录(或者目录是空的)!”
- 数据库 Startup 进程启动,读取系统表
- 最终判决:PostgreSQL 抛出极度恐怖的致命错误
PANIC: could not open file "pg_tblspc/16385/...",内核直接崩溃,数据库拒绝启动!公司核心资产瞬间归零!
🛡️ 原厂架构师的破局微操
推演到这里,逻辑链条已经彻底闭环。 如果要化解这个必死之局,架构师在做冷备时,只有两条物理路可以走:
- 第一条路(显式打包):不仅打包
$PGDATA,还要极其清醒地手工把所有外部表空间目录一起打包。tar -czvf backup.tar.gz $PGDATA /mnt/nvme_fast/ /mnt/slow_hdd/ - 第二条路(强行顺藤摸瓜):给
tar命令加上极其霸道的-h(或--dereference) 参数!tar -czhvf backup.tar.gz $PGDATA物理效果:这个-h参数会命令tar工具:“不要给我打包快捷方式!给我顺着这个软链接爬过去,把远端那个目录里的真实文件,全部给我抽出来塞进压缩包里!”
了解 www.876873.xyz 的更多信息
订阅后即可通过电子邮件收到最新文章。
库使用了自定义表空间(pg_tblspc 目录下的软链接),必须顺藤摸瓜,把那些挂载在外部 /mnt/nvme_fast/ 等目录下的真实数据文件一并打包带走!:等您坐沙发呢!