目录
1. 物理存储结构
1.1. 物理存储结构简介
1.2. 数据文件
1.3. 控制文件
1.4. 日志文件
1.5. 配置文件
2. 逻辑存储结构
2.1. 逻辑存储结构简介
2.2. 表空间
2.3. 段
2.4. 数据块
本部分描写KingbaseES数据库的基本结构架构,包括物理存储结构和逻辑存储结构。
KingbaseES数据库初始化过程会创建一个数据库实例。KingbaseES创建数据库实例时会自动创建数据库:security、template0、template1和test。每个数据库中可以包含多个数据库对象,如表、索引、序列等。
KingbaseES数据库实例管理的所有数据在物理上都以操作系统文件的方式存放在磁盘上。
物理数据库结构可以在操作系统级别上查看。
一般而言,数据库集簇所使用的配置和数据文件都被一起存储在集簇的数据目录里,常用的目录名为data。由不同数据库实例所管理的多个集簇可以在同一台机器上共存。
data目录包含几个子目录以及一些控制文件,如表"data目录下的必要内容"所示。除此之外,kingbase.conf、sys_hba.conf和sys_ident.conf等通常都存储在data中,但也可以将其存放在其他地方,如表"data目录下的可选内容"所示。
项 |
类型 |
描述 |
---|---|---|
SYS_VERSION |
其他 |
一个包含KingbaseES主版本号的文件 |
base |
数据文件 |
包含每个数据库对应的子目录,记录每个数据库内对象的 持久化数据或临时数据。 |
current_logfiles |
控制文件 |
记录当前被日志收集器写入的日志文件的文件 |
global |
数据文件 及控制文件 |
包含集簇范围的表的子目录,比如sys_database。 此外,sys_control文件也存储在此目录下,该文件记录着 数据集簇标识符及版本、检查点信息、块大小等信息 |
sys_commit_ts |
日志文件 |
包含事务提交时间戳数据的子目录 |
sys_csnlog |
日志文件 |
包含事务提交序列号和子事务状态数据的子目录 |
sys_dynshmem |
其他 |
包含被动态共享内存子系统所使用的文件的子目录 |
sys_logical |
控制文件 |
包含用于逻辑复制的状态数据的子目录 |
sys_multixact |
日志文件 |
包含多事务(multi-t ransaction)状态数据的子目录(用于共享的行锁) |
sys_notify |
日志文件 |
包含LISTEN/NOTIFY状态数据的子目录 |
sys_replslot |
其他 |
包含复制槽数据的子目录 |
sys_serial |
日志文件 |
包含已提交的可序列化事务信息的子目录 |
sys_snapshots |
其他 |
包含导出的快照的子目录 |
sys_stat |
其他 |
包含用于统计子系统的永久文件的子目录 |
sys_stat_tmp |
其他 |
包含用于统计信息子系统的临时文件的子目录 |
sys_tblspc |
其他 |
包含指向表空间目录的符号链接的子目录,该符号链接所 指向的表空间目录中存储了所属该表空间的数据文件。 |
sys_twophase |
日志文件 |
包含用于预备事务状态文件的子目录 |
sys_wal |
日志文件 |
包含 WAL(预写日志)文件的子目录 |
sys_xact |
日志文件 |
包含事务提交状态数据的子目录 |
kingbase.auto.conf |
配置文件 |
一个用于存储由ALTER SYSTEM 设置的配置参数的文件 |
kingbase.opts |
控制文件 |
一个 记录服务器最后一次启动时使用的命令行参数的文件 |
kingbase.pid |
控制文件 |
一个锁文件,记录着当前的 kingbase 进程ID(PID)、集簇数据目录路 径、kingbase启动时间戳、端口号、Unix域套接字目 录路径(Windows上为空)、第一个可用的listen_address (IP地址或者*,或者为空表示不在TCP上监听 )以及共享内存段ID(服务器关闭后该文件不存在) |
项 |
类型 |
描述 |
---|---|---|
kingbase.conf |
配置文件 |
一个用于存储用户自设置的配置参数的文件 |
sys_hba.conf |
配置文件 |
一个用于配置客户端认证方式的文件 |
sys_ident.conf |
配置文件 |
一个用于配置客户端认证所需的用户名映射的文件 |
sys_log |
日志文件 |
包含数据库在线日志文件的子目录 |
在KingbaseES数据库中,数据文件被组织成一个个页面(Page),页面大小为8k。对数据文件的I/O操作都是以页面为单位。
数据文件包含数据和对象,例如表、索引、存储过程和视图。
对于实例里的每个数据库,在data/base目录里都有一个子目录对应,子目录的名字为该数据库在sys_database里的OID。这个子目录是该数据库所有数据文件的缺省位置;特别值得一提的是,该数据库的系统目录存储在此。
在该目录下,每个表和索引都存储在独立的文件里。对于普通关系,这些文件以表或索引的filenode号命名,它可以在sys_class.relfilenode中找到。但是对于临时关系,文件名的形式为tBBB_FFF,其中BBB是创建该文件的后台会话的后台ID,FFF是文件节点号。对于所有情况下,每个表和索引,在其主文件(或者说主分支)之外,都有一个空闲空间映射分支,它存储关系中可用空闲空间的信息。空闲空间映射存储在一个文件中,该文件以节点号加上后缀_fsm命名。此外,每个表还有一个可见性映射分支,存储在一个后缀为_vm的文件中,它用于跟踪哪些页面已知含有非死亡元组。不被日志记录的表和索引还有第三个分支,即初始化分支,它存储在后缀为_init的分支中。
注意
请注意,虽然一个表的文件节点通常和它的OID相匹配,但实际上并不必须如此; 有些操作,比如 TRUNCATE、REINDEX、CLUSTER以及某些形式的ALTER TABLE,都可以改变文件节点而同时保留 OID。我们不应该假设文件节点和表 OID 相同。此外,对于包含sys_class本身在内的特定系统目录,其sys_class.relfilenode包含0。这些目录的实际文件节点号被存储在一个低层数据结构中,并且可以使用sys_relation_filenode()函数获取。
在表或者索引超过1GB之后,它就被划分成1G大小的段。 第一个段的文件名和文件节点相同;随后的段被命名为filenode.1、filenode.2等等。这样的安排避免了在某些有文件大小限制的平台上的问题(实际上,1GB只是默认的段尺寸。段尺寸可以在编译KingbaseES时使用配置选项--with-segsize进行调整)。原则上,空闲空间映射和可见性映射分支也可以要求多个段,但实际上这很少发生。
KingbaseES服务器使用的控制信息记录在data目录及子目录下的控制文件中。控制文件和对应内容见以上data目录下的文件列表中类型为控制文件的行。
日志文件记录数据库的历史操作信息, 包含恢复数据库中的所有事务所需的信息。在KingbaseES中,日志文件主要有WAL日志、事务日志和在线日志三类。
1.4.1. WAL日志
预写式日志(Write-Ahead Logging(WAL))是保证数据完整性、实现事务日志的一种标准方法。WAL的中心思想是对数据文件的修改(它们是表和索引的载体)当且仅当只能发生在这些修改已经被记录在日志中之后,即在描述这些变化的日志被刷到持久存储以后。如果遵循这种过程,将不需要在每个事务提交时刷写数据页面到磁盘,因为知道在发生崩溃时可以使用日志来恢复数据库:任何还没有被应用到数据页面的改变可以根据其日志记录重做。 预写式日志记录在sys_wal中。
1.4.1.1. WAL的优点
使用WAL显著减少了磁盘写的次数。因为只有日志文件需要被刷出到磁盘以保证事务被提交。而被事务改变的每一个数据文件不必被刷出。日志文件被按照顺序写入,因此同步日志的代价要远小于刷写数据页面的代价。在处理很多影响数据存储不同部分的小事务的服务器上这一点尤其明显。
使用WAL能够保证数据页的完整性。
提供数据库在线备份和恢复的可能。通过归档的WAL文件,可以支持恢复到手头的WAL文件包含的任意时刻:只需要简单地安装以前的数据库的物理备份,然后重放WAl到自己希望的时间。另外,物理备份还不必是数据库状态的一个即时快照--如果它是花了一段时间制作的话,因为WAL日志的重放将修复任何内部的不一致。
1.4.1.2. WAL配置
在KingbaseES中,主要通过设置kingbase.conf文件中相关参数来配置WAL。部分WAL相关的参数还会影响数据库的性能,参考服务器配置可获取有关服务器配置的一般信息。
1.4.2. 事务日志
在KingbaseES中,事务的状态及可见性等信息记录在事务日志文件中,只有通过事务日志信息才能从数据文件中得到有效的数据。因此事务日志对数据一致性是十分重要的。 主要的事务日志文件有sys_xact、sys_csnlog、sys_multixact等
1.4.3. 在线日志
在KingbaseES中,用户的SQL操作以及数据库的运行中的事件会以文本的形式记录在在线日志中,用于使用户可以了解和分析数据库当前状态,并分析可能产生的异常。 在线日志文件默认记录在sys_log中,并可以存放在用户指定的其他地方。
KingbaseES主服务器的配置主要通过修改配置文件kingbase.conf完成。 由ALTER SYSTEM修改的配置参数会被数据库服务器自动记录在kingbase.auto.conf中。
配置文件sys_hba.conf和sys_ident.conf主要用于控制客户端认证。
KingbaseES数据库管理和组织数据库中的所有对象的逻辑空间,并将其映射到对应的物理文件中。
KingbaseES数据库中管理和组织数据的逻辑结构单元有数据块、段和表空间。在每一个数据库内部存在着若干个表空间,所有的数据库内部对象分别存放在这些表空间中。每个表空间中的关系又被划分为若干个段,每个段中有若干个数据块存储实际的数据。
下图展示了物理存储结构和逻辑存储结构的对应关系。
表空间允许在文件系统里定义那些代表数据库对象的文件存放的位置。 一旦创建了表空间,那么就可以在创建数据库对象的时候引用它。一个数据库可以有一个或多个表空间,创建数据库时自动创建系统表空间,并为缺省的默认表空间。一个表空间只隶属于一个数据库,只有在创建了数据库之后才能创建属于它的表空间。
隶属于一个数据库的表空间用于存储该数据库的数据库对象。在创建数据库对象时可以使用TABLESPACE子句指明该对象所使用的表空间;没有给出 TABLESPACE 子句,则这些对象使用缺省表空间。
用户可以通过“CREATE TABLESPACE”语句来创建自己的表空间。对已经存在的表空间,用户可以通过“DROP TABLESPACE”语句来将其删除。
KingbaseES中的表空间允许数据库管理员在文件系统中定义用来存放表示数据库对象的文件的位置。一旦被创建,表空间就可以在创建数据库对象时通过名称引用。
通过使用表空间,管理员可以控制一个KingbaseES安装的磁盘布局。这么做至少有两个用处。首先,如果初始化集簇所在的分区或者卷用光了空间,而又不能在逻辑上扩展或者做别的什么操作,那么表空间可以被创建在一个不同的分区上,直到系统可以被重新配置。
其次,表空间允许管理员根据数据库对象的使用模式来优化性能。例如,一个很频繁使用的索引可以被放在非常快并且非常可靠的磁盘上,如一种非常贵的固态设备。同时,一个很少使用的或者对性能要求不高的存储归档数据的表可以存储在一个便宜但比较慢的磁盘系统上。
注意
即便是位于主要的KingbaseES数据目录之外,表空间也是数据库集簇的一部分。 并且不能被视作数据文件的一个自治集合。它们依赖于包含在主数据目录中的元数据,并且因此不能被附加到一个不同的数据库集簇或者单独备份。类似地,如果丢失一个表空间(文件删除、磁盘失效等),数据库集簇可能会变成不可读或者无法启动。把一个表空间放在一个临时文件系统(如一个内存虚拟盘)上会带来整个集簇的可靠性风险。
KingbaseES中表或索引等对象都被记录在表空间中,并被拆分成若干个段存储。
一个段对应了一个物理文件,并只存储一个关系的部分数据。 段内部会被划分为若干个数据块进行数据的管理和组织。
KingbaseES中管理数据的最小单元叫做数据块,或者也可以称为页面。一个数据块是最小的IO单元,即每次读入或写出数据只能以数据块做为单位。 数据库中一个数据块的大小通常是8KB,并可以在初始化数据库实例时被指定。该大小需要是操作系统数据块大小的整数倍。