KingbaseES数据库结构


  1. [kingbase@postgresV8]$ tree -LP2data/
  2. .
  3. ├── data
  4. │ ├── base # 存储用户创建的数据库文件及隶属于用户数据库的所有关系.比如表、索引...
  5. │ ├── current_logfiles. # 记录当前被日志收集器写入的日志文件的文件
  6. │ ├── global # 包含集簇范围的表的子目录,sys_control文件该文件记录着数据集簇标识符及版本、检查点信息、块大小等信息
  7. │ ├── initdb.conf # 数据库初始化参数,安装并初始化
  8. │ ├── kingbase.auto.conf # 存储由ALTER SYSTEM 设置的配置参数的文件
  9. │ ├── kingbase.conf # 存储用户自设置的配置参数的文件
  10. │ ├── kingbase.opts # 记录服务器最后一次启动时使用的命令行参数的文件
  11. │ ├── sys_aud # 存储kingbase审计相关信息
  12. │ ├── sys_bulkload # KingbaseES提供的快速加载数据的默认路径
  13. │ ├── sys_commit_ts # 事务提交时间戳数据目录
  14. │ ├── sys_csnlog # 包含事务提交序列号和子事务状态数据的子目录
  15. │ ├── sys_dynshmem # 动态共享内存子系统所使用的文件的子目录
  16. │ ├── sys_hba.conf # 存储客户端认证方式的配置文件
  17. │ ├── sys_ident.conf # 存储客户端认证所需的用户名映射的配置文件
  18. │ ├── sys_log # 日志文件
  19. │ ├── sys_logical # 用于逻辑复制的状态数据的子目录
  20. │ ├── sys_multixact # 多事务multi-t ransaction状态数据的子目录(用于共享的行锁)
  21. │ ├── sys_notify # 包含LISTEN/NOTIFY状态数据的子目录
  22. │ ├── sys_replslot # 复制槽数据的子目录
  23. │ ├── sys_serial # 已提交的可序列化事务信息的子目录
  24. │ ├── sys_snapshots # 导出的快照的子目录
  25. │ ├── sys_stat # 用于统计子系统的永久文件的子目录
  26. │ ├── sys_stat_tmp # 用于统计信息子系统的临时文件的子目录
  27. │ ├── sys_tblspc # 指向表空间目录的符号链接的子目录,该符号链接所指向的表空间目录中存储了所属该表空间的数据文件。
  28. │ ├── sys_twophase # 用于预备事务状态文件的子目录
  29. │ ├── SYS_VERSION. # 包含KingbaseES主版本号的文件
  30. │ ├── sys_wal # WAL(预写日志)文件的子目录
  31. │ └── sys_xact # 事务提交状态数据的子目录
  32. └── kingbase.pid # 记录当前的kingbase进程ID(PID)集簇数据目录路径、kingbase启动时间戳、端口号、Unix域套接字目 录路径(Windows上为空)、第一个可用的listen_address (IP地址或者*,或者为空表示不在TCP上监听 )以及共享内存段ID(服务器关闭后该文件不存在)
  33. # 通过ipcs命令查看共享内存的地址信息,可以看到shared memory segments中的key值0x033cdf69
  34. # 将十六进制Key值0x033cdf69转换为十进制,正好等于54321001,即为共享内存的key。
  35. # 第二个数字为shmid的值,即为共享内存的id
  36. [kingbase@postgresdata]$cat kingbase.pid
  37. 20903
  38. /home/kingbase/data166809669854321
  39. /tmp
  40. *
  41. 5432100116
  42. ready
  43. [kingbase@postgresdata]$ ipcs
  44. ------ Message Queues --------
  45. key msqid owner perms used-bytes messages
  46. ------ Shared Memory Segments --------
  47. key shmid owner perms bytes nattch status
  48. 0x00000000 2 gdm 777163841 dest
  49. 0x00000000 5 gdm 77721299202 dest
  50. 0x033cdf69 16 kingbase 600566------ Semaphore Arrays --------
  51. key semid owner perms nsems
  52. 0x075b8ee0 3 dmdba 6661

BASE

在KingbaseES数据库中,数据文件被组织成一个个页面Page,页面大小为8k.对数据文件的I/O操作都是以页面为单位。

数据文件包含数据和对象,例如表、索引、存储过程和视图。

对于实例里的每个数据库,在data/base目录里都有一个子目录对应,子目录的名字为该数据库在sys_database里的OID.

这个子目录是该数据库所有数据文件的缺省位置;特别值得一提的是,该数据库的系统目录存储在此。

在该目录下,每个表和索引都存储在独立的文件里.这些文件以表或索引的filenode号命名.

它可以在sys_class.relfilenode中找到.

对于临时关系.文件名的形式为tBBB_FFF,其中BBB是创建该文件的后台会话的后台ID,FFF是文件节点号。

所有情况下,每个表和索引,在其主文件(或者说主分支)之外,都有一个空闲空间映射分支,存储可用空闲空间的信息。

空闲空间映射存储在一个文件中,该文件以节点号加上后缀_fsm命名.

此外每个表还有一个可见性映射分支,存储在一个后缀为_vm的文件中.

用于跟踪哪些页面已知含有非死亡元组。不被日志记录的表和索引还有第三个分支,即初始化分支,它存储在后缀为_init的分支中。

在表或者索引超过1GB后,它会被划分成1G大小的段。

第一个段的文件名和文件节点相同;之后的段被命名为filenode.1、filenode.2等等。

这样的处理避免了在有文件大小限制平台上的问题.(实际1GB只是默认的段尺寸。段尺寸可以在编译KingbaseES时使用配置选项--with-segsize进行调整).

原则上,空闲空间映射和可见性映射分支也可以要求多个段,但实际上很少发生。

纯数字的是主表数据文件或索引数据文件

以_fsm后缀的就是Free Space Mapping文件

以vm后缀的就是visibility map

├── base # SELECT OID, DATNAME FROM SYS_DATABASE;

│ ├── 1

│ ├── 16268

│ ├── 16269

│ └── 16270

├── sys_filenode.map

└── sys_internal.init

└── SYS_VERSION

sys_filenode.map 是sys_class里relfilenode为0的系统表,OID与文件的硬编码映射。

sys_internal.init 是系统表的cache文件,用于加快读取.默认不存在,查询系统表后自动产生。

SYS_VERSION 是当前数据库数据格式对应的版本号

其它文件是需要到sys_class里根据OID查到对应的relfilenode来与文件名匹配

注意:

虽然一个表的文件节点通常和它的OID相匹配,但实际上并不是必须如此.

比如 TRUNCATE、REINDEX、CLUSTER以及某些形式的ALTERTABLE,都可以改变文件节点而同时保留 OID。

我们不应该假设文件节点和表 OID 相同。

此外对于包含sys_class本身在内的特定系统目录,其sys_class.relfilenode包含0。

这些目录的实际文件节点号被存储在一个低层数据结构中,可以用sys_relation_filenode()函数获取。

GLOBAL

存储全局的系统表信息和全局控制信息

数字命名的文件用于存储系统表的内容。它们在sys_class里的relfilenode都为0,是靠sys_filenode.map将OID与文件硬编码映射注意:不是所有的系统表的relfilenode都为0以下语句可以查询OID对应的表名/物理文件名


  1. select oid, relname from sys_class where relfilenode=0 order by oid;
  2. select sys_relation_filenode(:oid);

纯数字的是主表数据文件或索引数据文件以_fsm后缀的就是FreeSpaceMapping文件以vm后缀的就是visibilitymap

注意:系统表分为全局系统表和库级系统表。

全局系统表位于global下,如:sys_database,sys_tablespace,sys_auth_members这种存储系统级对象的表。

库级系统表位于数据库目录下,如:sys_type,sys_proc,sys_attribute这种存储库级对象的表。

值得注意的是sys_class位于库级目录的里,但也包含全局系统表信息,因此在改动全局系统表信息时需要注意。


  1. [kingbase@postgres data]$ tree global
  2. global
  3. ├── 1136 # sys_pltemplate
  4. ├── 1137 # sys_pltemplate_name_index
  5. ├── 1213 # sys_tablespace
  6. ├── 1214 # sys_shdepend
  7. ├── 1232 # sys_shdepend_depender_index
  8. ├── 1233 # sys_shdepend_reference_index
  9. ├── 1260 # sys_authid
  10. ├── 1261 # sys_auth_members
  11. ├── 1262 # sys_database
  12. ├── 2396 # sys_shdescription
  13. ├── 2397 # sys_shdescription_o_c_index
  14. ├── 2671 # sys_database_datname_index
  15. ├── 2672 # sys_database_oid_index
  16. ├── 2676 # sys_authid_rolname_index
  17. ├── 2677 # sys_authid_oid_index
  18. ├── 2694 # sys_auth_members_role_member_index
  19. ├── 2695 # sys_auth_members_member_role_index
  20. ├── 2697 # sys_tablespace_oid_index
  21. ├── 2698 # sys_tablespace_spcname_index
  22. ├── 2846 # sys_toast_2396
  23. ├── 2847 # sys_toast_2396_index
  24. ├── 2964 # sys_db_role_setting
  25. ├── 2965 # sys_db_role_setting_databaseid_rol_index
  26. ├── 2966 # sys_toast_2964
  27. ├── 2967 # sys_toast_2964_index
  28. ├── 3592 # sys_shseclabel
  29. ├── 3593 # sys_shseclabel_object_index
  30. ├── 4060 # sys_toast_3592x
  31. ├── 4061 # sys_toast_3592_index
  32. ├── 4175
  33. ├── 4176
  34. ├── 4177
  35. ├── 4178
  36. ├── 4179
  37. ├── 4180
  38. ├── 4181
  39. ├── 4182
  40. ├── 4183
  41. ├── 4184
  42. ├── 4185
  43. ├── 4186
  44. ├── 6000 # sys_replication_origin
  45. ├── 6001 # sys_replication_origin_roiident_index
  46. ├── 6002 # sys_replication_origin_roname_index
  47. ├── 6100
  48. ├── 6114
  49. ├── 6115
  50. ├── 7968
  51. ├── 7969
  52. ├── 8042
  53. ├── 8046
  54. ├── 8048
  55. ├── 8059
  56. ├── 8074
  57. ├── 8076
  58. ├── sys_control # 存储全局控制信息,对应的是ControlFileData结构体
  59. ├── sys_filenode.map # 将当前目录下系统表的OID与具体文件名进行硬编码映射(每个用户创建的数据库目录下也有同名文件).
  60. # 对应RelMapFile结构体, 结构体大小为:62*8+4*4=496+16=512。
  61. # 也就是说这个文件最多存放62条系统catalog表的记录
  62. └── sys_internal.init # 缓存系统表,加快系统表读取速度(每个用户创建的数据库目录下也有同名文件)

SYS_WAL

预写式日志(Write-Ahead Logging(WAL))是保证数据完整性、实现事务日志的一种标准方法。

WAL的中心思想是对数据文件的修改(它们是表和索引的载体)当修改已经被记录在日志中之后,即在描述这些变化的日志被刷到持久存储后。

如果遵循这种过程,将不需要在每个事务提交时写数据到磁盘。

当数据库系统崩溃后,会从上一次成功的checkpoint点开始依次重放wal记录,假如lsn>wal_lsn则重放wal记录,反之跳过,确保数据记录恢复到崩溃前的状态。

预写式日志记录在sys_wal中。

WAL日志的优点

使用WAL可以减少磁盘读写的频率次数。

保证事务被提交时才会将日志文件内容写入到磁盘。

在没有触发checkpoint检查点时不用将数据持久化,减少读写磁盘频率次数。

日志文件按照顺序写入,同步日志的代价要远小于刷写数据页面的代价。

在OLTP系统性能影响尤其明显。

使用WAL能够保证数据的完整性。

提供数据库在线备份和恢复。

通过归档的WAL文件,支持恢复到被任意时刻。

通过数据库的物理备份,WAL日志恢复数据到自己希望的时间。

另外物理备份不必是数据库状态的一个即时快照。

通过WAL日志的恢复可以修复内部的不一致。

WAL日志SEGMENT

wal segment文件存储着数据库每一条数据变化明细。

每一条记录数据变化明细都是服务于数据库恢复操作,确保前后数据一致。

针对数据的任意一次修改操作均被记录在wal segment文件中,包括insert、update和delete。

包括系统的一些管理行为也会被记录在wal segment文件中,例如事务提交和vacuum等行。

wal segment文件命名形如0000000100000001 0000001A,文件名共24位,前8位是timeline,中间8位是logid,后8位是logseg,logseg的前6位始终是0,后2位是lsn的前2位。根据wal segment文件名的最后2位,

wal segment根据对应的LSN分别记录在不同的wal segment文件中


  1. [kingbase@postgres data]$ tree sys_wal/
  2. sys_wal/
  3. ├── 000000010000000000000051
  4. └── archive_status

ARCHIVE_STATUS

archive_status是wal segment文件的备份目录。

.ready 是等待被归档的wal日志。

.done 是已经被归档完成的wal日志。

.backup 主备环境

超出wal_keep_segments数目限制的wal日志会在archive_status目录内被打标,归档操作完成后被进一步移除。

.HISTORY

.history文件内容包括原.history文件,当前时间线切换记录和切换原因,作用于数据库的时间点恢复行为。

当数据库从多个时间线的备份中恢复时,数据库从.history文件中找到从sys_control的start_timeline到指定的recovery_target_timeline间的所有wal段文件进行恢复。

每发生一次主备切换此文件ID+1.可以判断主备切换次数。

SYS_XACT

sys_xact是事务提交日志(Commit Log)的存储目录.

事务提交日志默认256KB,文件名形如XXXX,

系统初始化后从0000开始递增至FFFF。

PG 10及之后的高版本改目录名为pg_xact,10之前目录名称是pg_clog.

事务已被冻结的文件可以被vacuum清理。

在sys_class . relfrozenxid之前的所有事务 ID在表中已经被替换为一个永久的(“冻结的”) 事务ID 。

用于跟踪表是否需要被清理,以便阻止事务 ID回卷或者允许 sys_xact 被收缩。

如果该关系不是一个表则为0( InvalidTransactionId )

通过指定 VACUUM 操作强制执行来防止表中事务ID回卷之前,表的 sys_class . relfrozenxid 保持最大事务年龄。

注意即便自动清理被禁用,系统也将发起自动清理进程来阻止回卷。

清理允许从 sys_xact 子目录中移除旧文件,默认值为2亿事务。

COMMIT LOG

事务提交日志存储数据库的单个事务运行状态。

Commit Log由共享内存中一组8KB的page组成。

每个page包含一列数组,每个数组元素包含XID和该事物的实时状态。

当page不足时,创建新的page来存储新的事务

事物ID的分类

0-2都是保留的txid,它们比任何普通txid都要旧。

0:invalidtransactionid,表示无效的事务id1:bootstraptransactionid,表示系统表初始化时的事务id,比任何普通的事务id都旧。

2:frozentransactionid,冻结的事务id,比任何普通的事务id都旧。

大于2的事务id都是普通的事务id,即从3开始就是普通的事务id。

postgresql中事务号有两个概念,一个就是通常意义上的事务id,即transaction id,如tuple中的xmin,xmax等。

另外一个是虚拟事务id,即virtual transaction id。

像类似于select这些只读语句,并不会改变数据库;而dml语句会对数据库状态产生影响。transaction id属于永久id。

它的意义是指对数据库的更改序列,使得数据库从一种状态变成另外一种状态,而且状态的改变是持久、可恢复的,是一致性的。

而查询,实际上并不需要这种永久事务id,只需要处理好mvcc,锁的获取和释放即可因此virtual transaction id也就足够了。

不需要去获取xidgenlock锁而产生transaction id,从而提高数据库性能。

另外数据库也不会因为查询而导致transaction id快速wrap around(回卷),关于transaction id和virtual transaction id可以从sys_locks系统表中查看到相关信息。

OID

数据库对象是数据库存储或引用的数据结构体,数据库本身也是数据库对象,同时包括表、索引、视图、序列和函数等。Object ID是数据库对象的唯一标识符,保存在无符号四字节的整形变量中,所有数据库对象各自对应一个OID。PostgreSQL有两个视图各司其职,分别保存着不同类别的OID,其中pg_database保存数据库本身对象的OID,pg_class保存表、索引和序列等对象的OID。

Relation

关系代表非数据库本身的数据库对象,包括表、视图、索引和toast等,不包括数据库本身。

MVCC

Multi-Version-Concurrency-Control是一种并发控制机制。

数据库引擎根据不同的事务隔离级别,通过查询事务快照和事务提交日志来完成元组的可见性检查。

Page

数据库文件在Linux平台被划分为默认8K固定长度的page进行管理。

通过数据库初始化指定block_size参数page的大小。

如果page设低了,相同数据量的文件需要分裂成更多的page,IO次数和索引分裂次数都会增加,性能会降低较多;

如果page设高了,page内部的数据检索效率会降低,性能一样会降低不少,一般来说8K和16K对于数据库系统来说是最优解。

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树数据库组成59638 人正在系统学习中

[转帖]金仓数据库KingbaseES数据目录结构的更多相关文章

  1. 通过ODBC接口访问人大金仓数据库

      国产化软件和国产化芯片的窘境一样,一方面市场已经存在性能优越的同类软件,成本很低,但小众的国产化软件不仅需要高价买入版权,并且软件开发维护成本高:另一方面,国产软件目前普遍难用,性能不稳定,Bug ...

  2. QT 之 ODBC连接人大金仓数据库

    QT 之 使用 ODBC 驱动连接人大金仓数据库 获取数据库驱动和依赖动态库 此操作可在人大金仓官网下载与系统匹配的接口动态库,或者从架构数据库的源码中获取驱动和依赖动态库 分别为: 驱动动态库:kd ...

  3. 通过jmeter连接人大金仓数据库

    某项目用的人大金仓数据库,做性能测试,需要用jmeter来连接数据库处理一批数据.jmeter连接人大金仓,做个记录. 1. 概要 在"配置元件"中添加"JDBC Con ...

  4. 1、mysql数据库的数据目录结构

    查看mysql的主要目录结构 通过命名查看mysql的目录结构:find / -name mysql 1.1数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ 1.2 ...

  5. linux安装国产数据库(金仓数据库,达梦数据库,南大通用数据库)

    今天在公司做的任务是,在Linux的环境下安装三种数据库,结果一种数据库也没有安装好,首先遇到的问题是安装南大通用数据库遇到安装的第五步,就出现问题了,问题是Gbase SDK没有安装成功,以及Gba ...

  6. Rocky4.2下安装金仓v7数据库(KingbaseES)

    1.准备操作系统 1.1 系统登录界面 1.2 操作系统版本信息 jdbh:~ # uname -ra Linux jdbh -x86_64 # SMP Fri Dec :: CST x86_64 G ...

  7. 润乾配置连接kingbase(金仓)数据库

     问题背景 客户根据项目的不同,使用润乾连接的数据库类型各种各样,此文针对前几日使用润乾设计器连接kingbase金仓数据库做一个说明. kingbase金仓数据库是一款国产数据库,操作方式和配置 ...

  8. 金仓Kingbase数据库网页数据维护分析工具

    金仓Kingbase是优秀的国产数据库产品,在能源,政务,国防等领域广泛使用, 现在TreeSoft数据库管理系统已支持Kingbase了,直接在浏览器中就可以操作查看Kingbase数据了,十分方便 ...

  9. DBeaver连接达梦|虚谷|人大金仓等国产数据库

    前言 工作中有些项目可能会接触到「达梦.虚谷.人大金仓」等国产数据库,但通常这些数据库自带的连接工具使用并不方便,所以这篇文章记录一下 DBeaver 连接国产数据库的通用模版,下文以达梦为例(其他国 ...

  10. 教你10分钟对接人大金仓EF Core 6.x

    前言 目前.NET Core中据我了解到除了官方的EF Core外,还用的比较多的ORM框架(恕我孤陋寡闻哈,可能还有别的)有FreeSql.SqlSugar(排名不分先后).FreeSql和SqlS ...

随机推荐

  1. LeetCode 递归篇(70、22、98、104)

    70. 爬楼梯 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 输出: ...

  2. 华为云GaussDB(for openGauss)推出重磅内核新特性

    摘要:华为云新一代金融级分布式数据库GaussDB(for openGauss)正式推出了Ustore存储引擎.基于Paxos协议的DCF高可用组件等多个重大内核新特性. 数字化时代,技术迭代更新比以 ...

  3. 解密GaussDB(for Influx)时序洞察

    摘要:GaussDB(for Influx)是一款基于华为自研的计算存储分离架构,兼容InfluxDB生态的云原生NoSQL时序数据库,提供一站式时序数据存储.分析.展示功能.其中时序洞察提供了针对时 ...

  4. WebKit三件套(3):WebKit之Port篇

    了解其有关Port方面的设计,从而了解究竟如何能移植WebKit到自己的应用中. WebKitPort方面的内容是可以很广的,例如可将不同的图形库.网络库与WebCore集成,提供不同的Port接口供 ...

  5. 使用appuploader工具发布证书和描述性文件教程

    使用APPuploader工具发布证书和描述性文件教程 之前用AppCan平台开发了一个应用,平台可以同时生成安卓版和苹果版,想着也把这应用上架到App Store试试,于是找同学借了个苹果开发者账号 ...

  6. TreeMap - 红黑树

    TreeMap是Map家族中的一员,也是用来存放key-value键值对的.平时在工作中使用的可能并不多,它最大的特点是遍历时是有顺序的,根据key的排序规则来 TreeMap是一个双列集合,是Map ...

  7. Windows 2016 安装 Docker

    打开 PowerShell Windows PowerShell 版权所有 (C) 2016 Microsoft Corporation.保留所有权利. PS C:\Users\Administrat ...

  8. C# 写日志文件

    常用方法: public class FileHelper { private static void Write(string fileName, byte[] bytes) { FileStrea ...

  9. explain分析

    explain分析字段:id.select_type.type.partitions.type.possible_keys.key.key_len.ref.rows.rows.filtered.ext ...

  10. Qt 的Cmake方式如何创建资源文件和添加类

    CLion(误,QT Creator) 添加资源文件时 选择Qt 然后选择Qt Resource File 单击choose,然后给你的资源文件输入一个名字比如res单击下一步,然后完成,保存 这时候 ...