1. 从“仓库”到“货架”:理解PostgreSQL的数据目录结构
如果你刚开始接触PostgreSQL,可能会觉得它很神秘,尤其是那些藏在服务器深处的数据文件。别担心,这其实和你整理自家仓库的逻辑很像。想象一下,你有一个大仓库(服务器),里面分成了好几个区域(数据库),每个区域里又摆着很多货架(Schema),货架上则放着一个个具体的箱子(表)。PostgreSQL的数据目录,就是这个“大仓库”的物理蓝图和实际存放地。
当你初始化一个PostgreSQL集群(使用 initdb 命令)时,必须指定一个目录,通常叫做 PGDATA。这个目录就是一切数据的“根目录”。在Linux系统上,常见的位置是 /var/lib/postgresql/data/ 或 /home/postgres/data/。这个目录下有一堆子目录和文件,乍一看可能让人眼花缭乱,但核心的几个我们得搞清楚。
base/ 目录:这是整个数据目录的“心脏”,你数据库里所有的用户数据,最终都存放在这里。它里面是一堆以数字命名的子目录,比如 1, 12345 等等。这个数字可不是随便起的,它对应的是每个数据库在PostgreSQL内部的唯一标识符——OID。你可以通过查询 pg_database 系统表来看到这个对应关系。所以,base/ 目录下的一个数字子目录,就对应着你用 \l 命令看到的一个数据库。
global/ 目录:存放集群范围内共享的系统表数据,比如数据库用户(角色)信息、系统表本身的部分数据等。你可以把它理解为仓库的“管理员办公室”,存放着整个仓库的架构图和人员名单。
pg_wal/ 目录(在旧版本中是 pg_xlog/):这里存放着“预写日志”(Write-Ahead Logging, WAL)。这是PostgreSQL实现数据持久化和高可用的关键。你可以把它想象成仓库的“操作流水账本”,任何对货物的搬入、搬出、调整,都会先详细记录在这个账本上,然后再实际去动货架上的箱子。万一系统突然断电(崩溃),重启后靠着这个“账本”就能恢复到最后一次正确记录的状态,保证数据不丢。
pg_stat_tmp/ 目录:存放统计信息的临时文件。PostgreSQL会持续收集数据库的运行状态,比如哪些表被频繁扫描,哪些索引好用等。这些信息有助于优化器做出更好的执行计划决策。
理解这个物理结构有什么用呢?最直接的一点是备份和恢复。当你进行物理备份(比如使用 pg_basebackup)时,实际上就是在拷贝整个 PGDATA 目录(当然,pg_wal 可能需要特殊处理)。当你需要排查一些极端问题时,比如怀疑磁盘上的数据块损坏,也可能需要直接定位到 base/ 目录下的具体文件。不过,对于日常运维和开发,我们更多是通过SQL这个“管理员界面”来操作,而不是直接去翻文件系统。
2. 庖丁解牛:如何查询特定Schema下的表大小
知道了数据存在哪儿,我们自然会关心:我的数据到底占了多大空间?哪个表是“空间吞噬者”?特别是在多Schema的数据库设计中,我们常常需要关注某个特定业务模块(Schema)下的存储情况。下面我就分享几个我用了很多年的查询技巧,从简单到深入,帮你把表大小看得明明白白。
2.1 基础入门:几个必知的系统函数
在动手写复杂查询前,得先认识PostgreSQL提供的几个关于大小的“尺子”函数。它们就像工具箱里的不同型号的卷尺。
-
<


1万+

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



