当前位置: 首页 > postgresql > 正文

🌿 第一环:物理造假(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 底层的 tarcp 命令默认是非常“死板”的。当它扫描到 $PGDATA/pg_tblspc/16385 这个软链接时,它只会把这个“指向外部路径的快捷方式”打包进去。它绝对不会自动跨过链接,去把 /mnt/nvme_fast/ 目录下那几百 GB 的真实数据拉进来!
  • 定性:你以为你备份了几百 GB 的全库数据,看着进度条飞快跑完还挺高兴。实际上,你的备份包里只装了一个空壳!核心订单数据被你完美地遗弃在了原地。

💥 第三环:借尸还魂的溃败(恢复时的 PANIC 宕机)

  • 灾难降临:主库所在的主机主板烧毁了。你把 backup.tar.gz 拿到一台全新的灾备机器上解压。
  • 物理动作:你解压出 $PGDATA,设置好权限,敲下 pg_ctl start
  • 死亡审判
    1. 数据库 Startup 进程启动,读取系统表 pg_class
    2. 内核发现:“哎?核心订单表 orders 的物理位置是在 OID 为 16385 的表空间里!”
    3. 内核顺着藤摸过去,试图访问 $PGDATA/pg_tblspc/16385/...
    4. 操作系统拦截:“报告内核!这个软链接指向本机的 /mnt/nvme_fast/,但是这台新机器根本没有这个目录(或者目录是空的)!”
  • 最终判决:PostgreSQL 抛出极度恐怖的致命错误 PANIC: could not open file "pg_tblspc/16385/...",内核直接崩溃,数据库拒绝启动!公司核心资产瞬间归零!

🛡️ 原厂架构师的破局微操

推演到这里,逻辑链条已经彻底闭环。 如果要化解这个必死之局,架构师在做冷备时,只有两条物理路可以走:

  1. 第一条路(显式打包):不仅打包 $PGDATA,还要极其清醒地手工把所有外部表空间目录一起打包。 tar -czvf backup.tar.gz $PGDATA /mnt/nvme_fast/ /mnt/slow_hdd/
  2. 第二条路(强行顺藤摸瓜):给 tar 命令加上极其霸道的 -h(或 --dereference 参数! tar -czhvf backup.tar.gz $PGDATA 物理效果:这个 -h 参数会命令 tar 工具:“不要给我打包快捷方式!给我顺着这个软链接爬过去,把远端那个目录里的真实文件,全部给我抽出来塞进压缩包里!”

了解 www.876873.xyz 的更多信息

订阅后即可通过电子邮件收到最新文章。

库使用了自定义表空间(pg_tblspc 目录下的软链接),必须顺藤摸瓜,把那些挂载在外部 /mnt/nvme_fast/ 等目录下的真实数据文件一并打包带走!:等您坐沙发呢!

发表评论