惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
Vercel News
Vercel News
博客园 - 三生石上(FineUI控件)
IT之家
IT之家
Help Net Security
Help Net Security
月光博客
月光博客
N
News and Events Feed by Topic
Cloudbric
Cloudbric
博客园 - 司徒正美
L
LangChain Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
Tenable Blog
The Register - Security
The Register - Security
The Hacker News
The Hacker News
I
InfoQ
The Last Watchdog
The Last Watchdog
MyScale Blog
MyScale Blog
Schneier on Security
Schneier on Security
WordPress大学
WordPress大学
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
K
Kaspersky official blog
L
LINUX DO - 热门话题
N
News | PayPal Newsroom
F
Fortinet All Blogs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
Recorded Future
Recorded Future
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
Google Online Security Blog
Google Online Security Blog
S
Schneier on Security
C
Cisco Blogs
N
News and Events Feed by Topic
V2EX - 技术
V2EX - 技术
Latest news
Latest news
PCI Perspectives
PCI Perspectives
T
The Blog of Author Tim Ferriss
P
Palo Alto Networks Blog
T
Tor Project blog
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Webroot Blog
Webroot Blog
Attack and Defense Labs
Attack and Defense Labs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

博客园 - I'mAlex

Linux 环境下数据库服务开机自启实战:root.sh 脚本配置与服务管理全解 踩坑实录:NFS挂载环境下脚本执行权限问题(Operation not permitted)的深度排查与解决 单机数据库小版本升级实战:零数据迁移、分钟级完成的高效方案 表空间目录自动创建:告别手工建目录,提升数据库运维效率 深度解析:数据库 OID 与 ROWID 原理、用法与实战避坑 配置数据库日志输出到syslog,运维再也不用挨个找日志了 告别Oracle:深度解析数据库迁移的真实成本、技术路径与落地实战 Oracle替换实战干货:别再被迁移坑了,零改造+低成本落地全攻略 OpenClaw+优云智算Coding Plan:从灵感到成文,再到公众号发布的全流程AI自动化 MySQL迁移不再踩坑:金仓数据库兼容性与工程实力深度解析 信创替代破局:金仓数据库MySQL兼容性与迁移工程实力深度解析 融合为体,一库多能:金仓数据库重构企业数智化数据底座 KingbaseES 用户、会话与连接控制:从权限到连接池的实战运维 KingbaseES PLSQL异常处理深度解析:机制、实践与优化 国产化时序数据库替换实战:金仓全方位替代InfluxDB/TimescaleDB/TDengine指南 文档数据库国产化替代实践:金仓KES打造MongoDB高兼容迁移方案 关系数据库替换用金仓:数据迁移中的完整性与一致性风险深度解析 Oracle平滑迁移到KingbaseES关系数据库的技术实践 金仓数据库赋能北京一卡通:国产数据库在民生核心系统的信创实践标杆 深度解析数据库TOAST技术:超大字段存储的核心实现与实操指南 AI Ping实测:一站式大模型API评测+调用,开发者选型对接效率翻倍 SSH Key多密钥管理实战:不同域名/不同仓库/不同目录自动匹配不同ssh key的配置方案 KingbaseES数据库瓶颈排查实战指南:从实例到语句的全维度解析 金仓数据库平替MongoDB实操解析:多模融合赋能企业文档数据管理国产化升级
一文读懂数据库data目录:原来你的数据都藏在这里
I'mAlex · 2026-04-13 · via 博客园 - I'mAlex

不管是日常刷APP、逛网站,还是公司里的业务数据统计,我们每天都会产生大量数据。这些数据看似“看不见摸不着”,其实都安安稳稳地躺在数据库的某个角落——其中,data目录就是它们的“大本营”。

很多人对数据库的印象,停留在“写SQL查数据”的层面,却不知道背后的数据是如何存储、管理的。今天,我们就用最通俗的语言,科普一下数据库data目录的核心结构,不用复杂的运维操作,不用晦涩的专业术语,哪怕是刚接触数据库的新手,也能轻松看懂数据的“藏身之处”。

我们以一款兼容PostgreSQL生态的企业级数据库(KingbaseES)为例,它的data目录结构具有很强的代表性,大部分关系型数据库的核心逻辑都与之相似,看懂它,就能举一反三。

一、先搞懂:data目录到底是什么?

image

简单来说,data目录就是数据库的“专属仓库”。当你安装并初始化数据库后,系统会自动生成这个目录,它就像一个整理得井井有条的储物间,把数据库运行所需的一切东西都分类存放好。

你可以这样理解:如果把数据库比作一家超市,那么data目录就是超市的“后台仓库”——货架(数据文件)、账本(日志)、规章制度(配置文件)、管理人员信息(权限数据),全都在这个仓库里。只要这个仓库完好无损,哪怕超市前台出了问题,也能快速恢复正常营业。

在Linux系统中,我们用一条简单的命令,就能看到这个“仓库”的整体布局:

tree -LP 2 data/

执行后,会看到类似这样的结构(只保留核心部分,复杂的次要文件已省略):

data/
├── base           # 你的业务数据、表格都存在这
├── global         # 数据库的“全局配置中枢”
├── sys_wal        # 数据的“安全备份日志”
├── sys_xact       # 事务的“状态记录册”
├── kingbase.conf  # 数据库的“运行规则手册”
└── kingbase.pid   # 数据库的“运行身份证”

接下来,我们逐个走进这个“仓库”的各个区域,看看每个地方都放了什么。

二、data目录核心区域科普:每个文件夹都有大作用

2.1 base目录:业务数据的“专属储物柜”

base目录是整个data目录中最核心、最“值钱”的地方——你在数据库里创建的所有表格、索引、视图,甚至是存储过程,最终都会存放在这里。

它的存放逻辑很简单,就像超市里的储物柜,每个数据库对应一个“专属柜子”,这个柜子的名字很特别,是一串数字(叫做OID,数据库对象的唯一标识)。比如,你创建了一个名为“user_db”的数据库,系统会自动给它分配一个OID(比如16268),然后在base目录下创建一个名为“16268”的文件夹,这个文件夹里就装着“user_db”数据库里的所有数据。

再往深了说,每个表格和索引,在这个“柜子”里又会变成一个独立的“文件”,文件名也是一串数字(叫做filenode,物理文件标识)。比如你创建了一张“user_info”表,系统会给它分配一个filenode,然后在对应的OID文件夹里,生成一个以这个filenode命名的文件,这就是“user_info”表的真实数据文件。

还有两个小细节很有意思:

  1. 如果一张表的数据量很大,超过1GB,系统会自动把它分成多个“分文件”,比如filenode.1、filenode.2,这样可以避免单个文件太大,导致读取和管理不便(这个大小可以通过配置调整)。
  2. 每个数据文件旁边,都会有两个“辅助文件”:一个后缀是“_fsm”,用来记录文件里的空闲空间,方便系统快速找到可以插入数据的位置;另一个后缀是“_vm”,用来标记哪些数据是“可用的”,避免读取到无效数据,提升查询速度。

2.2 global目录:数据库的“全局中枢”

如果说base目录是“分储物柜”,存放各个数据库的专属数据,那么global目录就是整个数据库的“全局中枢”,管的是所有数据库都需要用到的“公共信息”。

这里面最关键的东西有两个:

一是“全局系统表”,比如记录所有数据库信息的表、记录用户权限的表、记录表空间信息的表。这些表就像超市的“员工手册”“会员档案”,不管哪个“储物柜”(数据库),都需要用到这些信息。

二是“sys_control文件”,这是数据库的“核心配置文件”,记录着数据库的版本、块大小、检查点信息等关键参数。如果这个文件损坏,整个数据库都无法启动,就像超市的“总电闸”坏了,所有区域都无法正常运行。

除此之外,global目录里还有两个“辅助文件”:sys_filenode.map用来建立系统表OID和物理文件名的映射,方便系统快速找到对应的文件;sys_internal.init是系统表的“缓存文件”,可以加快系统表的读取速度,就像超市里的“常用商品备货区”,不用每次都去仓库深处找。

2.3 sys_wal目录:数据的“安全备份日志”

sys_wal目录,全称是“预写日志目录”,它的作用就像超市的“监控录像”,记录着数据库里的每一次操作——不管是插入一条数据、修改一条记录,还是删除一条信息,都会被详细记录在这里。

它的核心逻辑很简单:数据库在修改数据之前,会先把修改操作记录到sys_wal的日志文件里,然后再去修改真正的数据文件。这样做的好处是,一旦数据库突然崩溃(比如断电、宕机),重启后可以通过这些日志,恢复到崩溃前的状态,避免数据丢失。

举个例子:你在数据库里插入了一条用户数据,系统会先把“插入这条数据”的操作记录到sys_wal的日志里,然后再把这条数据写入base目录的数据文件中。如果写入数据的过程中突然断电,重启后,系统会读取sys_wal的日志,发现有一条“未完成的插入操作”,就会重新执行这个操作,确保数据不会丢失。

sys_wal目录里的日志文件,名字是一串24位的数字(比如000000010000000000000051),分为时间线、logid、logseg三个部分,方便系统区分和查找。还有一个“archive_status”文件夹,用来记录日志的归档状态:.ready表示日志等待备份,.done表示日志已经备份完成。

2.4 sys_xact目录:事务的“状态记录册”

我们在操作数据库时,经常会用到“事务”——比如转账,从A账户扣钱,再给B账户加钱,这两个操作必须同时成功或同时失败,这就是一个事务。sys_xact目录的作用,就是记录每个事务的“状态”:是正在执行中、已经成功完成,还是已经取消(回滚)。

这个目录里的文件,大小都是固定的256KB,文件名从0000开始,依次递增到FFFF,就像一本本装订好的“账本”,每一本都记录着一部分事务的状态。当事务完成后,系统会在对应的“账本”里标记它的状态,后续可以通过这些记录,判断数据的有效性。

另外,这些“账本”也会定期“清理”——系统会通过VACUUM操作,删除那些已经过期、不再需要的事务记录,避免占用过多的磁盘空间,就像超市定期清理过期的商品一样。

2.5 其他常用目录:辅助数据库正常运行

除了上面四个核心目录,data目录里还有一些“辅助区域”,虽然不直接存放业务数据,但却是数据库正常运行不可或缺的部分,我们用一张简单的表格,快速了解它们的作用:

目录名称

核心作用

通俗理解

sys_multixact

记录多事务共享行锁的状态

超市里的“商品锁定记录”,避免多人同时修改同一件商品

sys_replslot

记录主从复制的状态

超市的“分店数据同步记录”,确保主店和分店的数据一致

sys_stat

存储数据库的统计信息

超市的“销售报表”,记录商品的销售情况,帮助优化库存

sys_tblspc

指向表空间的软链接

超市的“临时仓库指引”,告诉系统额外的商品存放在哪里

sys_aud

存储审计日志

超市的“安全日志”,记录谁在什么时候操作了什么数据

三、data目录里的“关键文件”:少了它们数据库就“罢工”

除了各种文件夹,data目录的根目录下,还有几个“关键文件”,它们就像数据库的“身份证”和“运行手册”,少了任何一个,数据库都无法正常启动。

3.1 kingbase.conf:数据库的“运行规则手册”

这个文件是数据库的“核心配置文件”,里面记录着数据库的运行规则:比如数据库能同时接受多少个连接、分配多少内存、日志的存储级别、 WAL日志的相关配置等等。

如果你觉得数据库运行太慢,可以修改这个文件里的内存配置;如果想调整日志的详细程度,也可以在这里修改。不过要注意,修改后需要重启数据库才能生效,就像修改了超市的规章制度,需要通知所有员工才能执行一样。

3.2 kingbase.auto.conf:自动生成的“补充规则”

这个文件是系统自动生成的,当你用SQL命令(比如ALTER SYSTEM SET)修改数据库配置时,系统会把修改后的配置存放在这里,它的优先级比kingbase.conf高。

简单来说,kingbase.conf是“手动配置”,kingbase.auto.conf是“自动配置”,如果两者有冲突,系统会优先使用kingbase.auto.conf里的配置,这样可以避免手动修改配置文件时出现错误。

3.3 sys_hba.conf:数据库的“门禁规则”

这个文件用来控制“谁能访问数据库”,就像超市的“门禁系统”,规定了哪些IP地址、哪些用户、可以通过什么方式访问数据库。

比如,你可以在这个文件里设置,只有公司内部的IP地址才能访问数据库,外部IP无法访问;也可以设置,某个用户只能通过密码登录,不能无密码访问。这样可以保证数据库的安全,防止非法访问。

3.4 kingbase.pid:数据库的“运行身份证”

这个文件是数据库启动后自动生成的,里面记录着数据库的运行信息:比如数据库的进程ID(PID)、data目录的路径、启动时间、监听端口、共享内存信息等等。

如果数据库启动失败,或者出现“无法启动,提示已在运行”的错误,就可以查看这个文件,确认数据库是否真的在运行,或者是否有残留的进程,删除这个文件后再重新启动(注意:删除前要确认数据库确实没有在运行,否则会导致数据损坏)。

四、简单总结:记住这几点,轻松理解data目录

看到这里,相信你已经对data目录有了一个清晰的认识。其实不用记住所有细节,只要抓住这几个核心点,就能轻松理解它的作用:

  1. data目录是数据库的“专属仓库”,所有数据、配置、日志都在这里;
  2. base存业务数据,global管全局配置,sys_wal保数据安全,sys_xact记事务状态;
  3. 根目录的几个关键文件,决定了数据库能不能启动、能不能安全运行;
  4. 不管是哪种关系型数据库,data目录的核心逻辑都大同小异,看懂一个,就能举一反三。

其实,数据库并没有我们想象中那么晦涩难懂,它的本质就是“一套精心设计的文件管理系统”——把数据分类存放,把操作记录下来,把规则制定好,就能保证数据的安全、稳定、高效运行。

下次再操作数据库的时候,不妨想一想:你写的SQL语句,最终会作用于data目录里的哪个文件?你查询的数据,是从base目录的哪个“储物柜”里取出来的?理解了这些,你对数据库的认知,会更上一层楼。