首页 纸飞机账号批发内容详情

【赵渝强老师】金仓数据库的数据文件

2026-03-07 2 飞机号购买网站

金仓数据库的数据文件存储机制,对数据库的运维效率有着直接影响,还关乎磁盘空间管理,知晓其物理结构,乃是排查数据库故障的基础,也是进行性能调优的根基。

环境变量KINGBASEDATA的核心作用

于金仓数据库实例进行初始化之际,系统会坚决强制要求去配置环境变量$KINGBASEDATA。此变量所指向的是一个特定的目录,比如说/kingbase/data。该目录不单单是数据库实例的根目录,并且还集中放置了所有的核心配置文件、数据文件以及日志文件。初始化进程会自动在该目录之下生成base、global等必需的子目录。

设定的环境变量,为数据库软件去定位实例文件,提供了唯一的入口处。当系统有待读取配置文件kingbase.conf,或者要访问数据文件之际,都会依据这个变量,来开展路径拼接工作。这样的设计,让于同一台服务器之上,部署多个独立的数据库实例,变成了可能之事,每个实例都有着自身独立的$KINGBASEDATA路径,彼此之间互不干扰。

数据文件的命名与存储规则

于数据库内部之中,数据文件并非以直观可感的表名予以命名,而是运用对象标识符(OID)当作文件名。当进入$KINGBASEDATA/base目录之后,你会见到一系列以数字进行命名的文件夹,这些数字所代表的乃是数据库的OID。接着再进入具体某一数据库的文件夹,便能够看到以数字命名的文件,它们即为实际存储表或索引数据的物理文件。

一旦单个数据文件的大小抵达1GB,金仓数据库便会自行启动分段存储机制。新产生的文件名会于原本OID的基础之上追加数字后缀,像是16384.1、16384.2。这个基础数字16384源自系统表sys_class里的relfilenode字段 ,一般而言它跟表的OID维持一致 ,不过在施行TRUNCATE或VACUUM FULL这般的操作之后有可能出现变化。

通过系统表定位数据文件

要对一张特定的和数据文件相对应的表加以定位,首先得获取当下数据库的OID。能够借助执行SELECT oid, datname FROM sys_database;这个命令,从返回所得到的结果集中找寻到目标数据库所对应的OID数字。这一步明确了需要进入哪一个数据库目录去进行查找。

紧接着要去查询目标表的OID以及relfilenode,运用SELECT relname, oid, relfilenode FROM sys_class WHERE relname = '你的表名';这样的语句。倘若表从来都没有进行过会致使relfilenode发生变更的操作,那么oid和relfilenode的值一般是一样的。所获取到的数字乃是$KINGBASEDATA/base/数据库OID/目录下与之对应的文件名。

表空间与自定义存储路径

具有允许管理员把数据文件分散放置到不同物理磁盘上功能的表空间,被用于平衡I/O负载,在创建像mydemotbs这类表空间时,要指定一个操作系统目录,在此目录下,会生成一个以数据库OID来命名的子目录,并在这个子目录里面存放着归属于该表空间的数据文件。

kingbase=# select oid,datname from sys_database;
# 输出的信息如下:  
  oid  |  datname  
-------+-----------
 14791 | test
 14792 | kingbase
     1 | template1
 14790 | template0
 14793 | security
 16384 | scott
(6 行记录)
# 14792 是数据库kingbase的OID。

当进行关于属于特定表空间的表的查询操作时,能够先借助sys_tablespace来获取表空间的OID以及目录路径。对于那些运用mydemotbs表空间的表而言,其数据文件会处在表空间目录下的数据库OID子文件夹里,文件名依旧是表的relfilenode值,还要遵循1GB分片规则。

大对象与TOAST文件的处理

针对于那些存储大字段的表,且这种大字段比如是TEXT、BLOB类型的,金仓数据库会采用TOAST这一技术来做行外存储,也就是The Oversized - Attribute Storage Technique技术。这就表明或许会存在一个额外的TOAST表用来放置这些大字段数据,并且TOAST表自己本身是拥有独立的数据文件的。

TOAST表名字能借由查询sys_class获取,其reltoastrelid字段朝向关联着的TOAST表OID。TOAST表数据文件同样存放于数据库OID对应的目录里,命名规则跟普通表全然相同。明白这一点对精确计算表实际占据磁盘空间极为关键。

kingbase=# select oid,relname,relkind,relfilenode from sys_class 
           where relname ='testtable1';
# 输出的信息如下:  
  oid  |  relname   | relkind | relfilenode 
-------+------------+---------+-------------
 16428 | testtable1 | r       |       16428
(1 行记录)
# 16428 是表testtable1的OID。

日常运维中的文件管理技巧

在日常进行巡检这个操作的时候,借助查看处于$KINGBASEDATA所在 的那个文件系统的使用率状况,能够迅速地判断出来是不是需要实施空间扩容这一行为。当察觉到存在某一个算得上大的表这个情况的时候,可以先运用SELECT pg_relation_filepath('表名');这个函数直接去获取该表的数据文件的完整路径,并不需要依靠手动去拼接OID信息。

在开展物理备份期间,要保证将整个$KINGBASEDATA目录完整备份下来。与此同时,于实施移动或者复制数据文件行动之前,务必要停下数据库服务,以此避免因文件处于打开状态而致使的数据损坏情况发生。对于文件系统层面的快照备份而言,领会文件的命名以及增长规则能够助力对备份完整性进行验证。

在日常所进行的工作里面,你可曾因为寻不到由数据文件所构成的内容的具体所在位置,从而陷入苦恼的状态呢?十分欢迎于评论区域分享出你所拥有的排查经验,通过点赞的行为,使得更多数据库管理员能够看见这些具备实用性质的技巧。

【赵渝强老师】金仓数据库的数据文件

相关标签: # 金仓数据库 # 数据文件 # OID # 表空间 # 拆分