目录
DM数据库体系机构主要包含逻辑存储机构,物理存储结构,内存结构以及线程结构,下面根据自己的所学,简单做个介绍
一、逻辑存储结构
1.数据库与实例
在 DM7 之前版本的 DM 数据库中,“数据库”和“实例”这两个术语经常可以互相替换,意义也很相近。在 DM7 以及之后版本的数据库中,“数据库”和“实例”这两个概念之间有着很大的差别,甚至可以说它们是两个完全不同的实体。
当同时出现 DM 数据库和实例时,DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。
实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。
2.DM逻辑存储结构
DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在 DM 数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。通过这种细分,可以使得 DM 数据库能够更加高效地控制磁盘空间的利用率。
在 DM8中存储的层次结构如下:
- 数据库由一个或多个表空间组成;
- 每个表空间由一个或多个数据文件组成;
- 每个数据文件由一个或多个簇组成;
- 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
- 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
- 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
2.1表空间
在 DM 数据库中,表空间由一个或者多个数据文件组成。
初始化实例时,会自动创建5个表空间:
SYSTEM表空间:系统表空间,存放了有关DM 数据库的字典信息。
ROLL表空间:用来存放事务运行过程中执行 DML 操作之前的值。
MAIN表空间:用户默认的表空间,用于存放业务数据等。
TEMP表空间:当用户的 SQL 语句需要磁盘空间来完成某个操作
- 创建索引
- 无法在内存中完成的排序操作
- SQL语句中间结果集
- 用户创建的临时表
- 不记录redo日志
HMAIN表空间:用户存放HUGE表数据
2.2段
段是数据库的对象,段存在于表空间中,由簇构成,可以包含来自不同文件的簇,段中簇与簇之间可以不连续。
段的分类:
数据段:
- 表段(存储表中的数据)
- 索引段(存储索引中的数据)
回滚段(在回滚表空间中保存的用于恢复数据库操作的信息)
临时段(分配和释放完全由系统自动控制)
2.3簇
簇是进行存储空间分配的基本单位,一个簇是由一系列逻辑上连续的数据页组成的逻辑存储结构。段中第一个区叫初始区,随后分配的区叫后续区。
一个簇的大小,由页大小和组成簇的个数决定
分配簇流程:
2.4页
数据页(也称数据块)是 DM 数据库中最小的数据存储单元,页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。
- 页头控制信息包含了关于页类型、页地址等信息。
- 页的中部存放数据,
- 页的尾部专门留出一部分空间用于存放行偏移数组,行偏移数组用于标识页上的空间占用情况以便管理数据页自身的空间。
FILLFACTOR是DM 数据库提供的一个与性能有关的数据页级存储参数,可以通过调整FILLFACTOR值的大小牺牲空间利用率换取性能的提高。
二、物理存储结构
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等。
1.配置文件
1.1dm.ini
dm.ini 是 DM 数据库启动所必须的配置文件,通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项,主要的配置模块包括:控制文件相关、实例名、内存相关、线程相关等。
1.2dmmal.ini
dmmal.ini 是 MAL 系统的配置文件,需要用到 MAL 环境的实例,所有站点 dmmal.ini 需要保证严格一致。
1.3dmarch.ini
dmarch.ini 用于配置归档。
1.4dm_svc.ini
dm_svc.conf 是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能生效。
1.5sqllog.ini
sqllog.ini 用于 SQL 日志的配置,当且仅当 INI 参数 SVR_LOG=1 时使用。
1.6dmthrd.ini
dmthrd.ini 用于为线程类型绑定 CPU 核心,当且仅当 INI 参数 DMTHRD_INI=1 时使用。
1.7dmrep.ini
dmrep.ini 用于配置复制实例。
1.8dmllog.ini
dmllog.ini 用于配置逻辑日志。
1.9dmtimer.ini
dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。
2.控制文件
每个DM 数据库都有一个名为dm.ctl的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:
- 数据库名称;
- 数据库服务器模式;
- OGUID 唯一标识;
- 数据库服务器版本;
- 数据文件版本;
- 数据库的启动次数;
- 数据库最近一次启动时间;
- 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
- 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。
可以通过dmctlcvt工具,将控制文件与txt文件互相转换。
3.数据文件
数据文件以dbf为扩展名,它是数据库中最重要的文件类型,一个DM数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。
数据文件按数据组织形式,可以分为如下几种:
3.1B树数据
行存储数据,也是应用最广泛的存储形式,其数据是按B树索引组织的。普通表、分区表、B树索引的物理存储格式都是B树。
一个B树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。其B树的逻辑关系由段内页面上的记录,通过文件指针来完成。
当表上没有指定聚集索引时,系统会自动产生一个唯一标识rowid作为B树的key来唯一标识一行。
3.2堆表数据
堆表的数据是以挂链形式存储的,一般情况下,支持最多128个链表,一个链表在物理上就是一个段,堆表采用的是物理rowid,在插入过程中,rowid在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高,且由于rowid是即时生成,无需保存在物理磁盘上,也节省了空间。
3.3列存储数据
数据按列方式组织存储,包含每个列对应的存放列数据的一系列数据文件,以及存放列数据控制信息的辅助表。读取列数据时,只需要顺序扫描列数据文件和辅助表数据。在某些特殊应用场景下,其效率要远远高于行存储。
3.4位图索引
位图索引与B树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。
3.5两类特殊的数据文件:
ROLL文件
ROLL 表空间的 dbf 文件,称为 ROLL 文件,ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息,回滚文件可被分为若干回滚段,每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。
TEMP文件
TEMP.DBF 临时数据文件,临时文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。
当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在 TEMP.DBF 文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。
4.重做日志文件
重做日志(即REDO日志)指在DM数据库中添加、删除、修改对象,或者改变数据,DM都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。
重做日志文件默认以log为扩展名,可在初始化数据库时使用建库参数RLOG_POSTFIX_NAME指定重做日志文件的扩展名。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
每个DM 数据库实例必须至少有2个重做日志文件。
重做日志文件主要用于数据库的备份与恢复。
5.归档日志文件
日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下运行。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。
6.逻辑日志文件
如果在DM数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式,且不在第一章所述的页,簇和段的管理之下。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。
7.物理逻辑日志文件
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于DBMS_LOGMNR包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内容会被存储在重做日志文件中。
8.备份文件
备份文件以bak为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一,但是当数据库不幸出现故障时,备份文件就显得尤为重要了。
9.SQL日志文件
用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志。
SQL 日志文件是一个纯文本文件,包含系统各会话执行的 SQL 语句、参数信息、错误信息等。
10.事件日志文件
事件日志文件记录了 DM 数据库运行时的关键事件,主要用于系统出现严重错误时进行查看并定位问题。
三、内存结构
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
1.内存池
1.1共享内存池
- 启动时按照参数MEMORY_POOL的值,向操作系统申请数据库使用的内存
- 维护数据库系统内部内存分配与释放
- 参数MEMORY_EXTENR_SIZE制定了共享内存池每次扩展的大小,单位为MB
- 参数MEMORY_TARGET则指定了共享内存池扩展到超过该值后,空闲时会收缩到的大小
1.2运行时内存池
- 一些功能模块在运行时还会使用自己的运行时内存池。
- 这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
2.缓冲区
数据缓冲区
数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。
实例启动时,根据ini参数配置,向操作系统内存申请内存。
三条数据链:
- “自由”链:存放目前尚未使用的内存数据页
- “LRU”链:存放已被使用的内存数据页(包括未修改和已修改),根据使用频率,优先淘汰使用频率低的数据页
- “脏”链:存放已修改的内存数据页
类别:
- NORMAL:提供给系统处理的一些数据页,默认缓冲区,由参数BUFFER控制
- KEEP:缓冲区中的数据页很少或经常访问的数据页,由参数KEEP控制
- FAST:根据用户指定的FAST_POOL_PAGES参数大小,由系统自动进行管理。
- RECYCLE:供临时表空间使用,由参数RECYCLE
3.排序区
排序缓冲区提供数据排序所需要的内存空间,由参数 SORT_BUF_SIZE决定大小,在每次排序过程中,都首先申请内存,排序结束后再释放内存。
4.哈希区
DM8 提供了为哈希连接而设定的缓冲区,是个虚拟缓冲区,由参数 HJ_BUF_SIZE 来进行控制,该值的大小可能会限制哈希连接的效率。
四、线程结构
DM进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等。
1.监听线程
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。
2.工作线程
工作线程是DM服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
DM8 的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求
3.IO线程
IO 线程的个数是可配置的,可以通过设置 dm.ini 文件中的 IO_THR_GROUPS 参数来设置,默认情况下,IO 线程的个数是 2 个。
DM Server 需要进行IO操作的时机主要有以下三种:
- 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
- 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
- 检查点到来时,需要将所有脏数据页写入磁盘;
4.调度线程
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
- 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
- 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
- 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
- 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
- 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
- 必要时执行数据更新页刷盘;
- 唤醒等待的工作线程。
5.日志 FLUSH 线程
事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘,DM8的日志FLUSH线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。
6.日志归档线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。
7.定时器线程
在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。
DM Server 需要进行定时操作的事件主要有以下几种:
- 逻辑日志异步归档;
- 异步归档日志发送(只有在 PRIMARY 模式下,且是 OPEN 状态下);
- 作业调度。
定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务.