1.达梦数据库体系结构

前言 :

在当今数据驱动的时代,数据库技术至关重要。达梦数据库作为国产数据库的佼佼者,以其卓越的性能和安全性赢得了广泛关注。为了紧跟技术发展并响应国家技术自立的号召,我决定从达梦数据库入手,并在博客中分享我的学习心得与实践经验。

本篇博客为入门级内容,主要讲述我初次接触达梦数据库体系的个人理解。作为一个纯小白的手作,希望各位大佬轻踩指教。

一、 DM 逻辑结构概述

1 数据库与实例

在达梦数据库中,“数据库”和“实例”这两个概念之间有着很大的差别,特别是 DM7 以及之后版本的数据库。

  • 数据库定义 :指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。

  • 实例定义 :实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成

下图是根据相应的官方解释,结合自身的理解所得,数据库主要为数据存储相关的集合,实例指的是对此集合的管理以及操作
数据库与实例

2 逻辑存储结构区分

官网对于DM 逻辑存储的数据结构图如下 :

逻辑存储结构

根据以上的逻辑,可以判断出:

  • 数据库 > 表空间 > 数据文件 > 簇 :数据库由一个或多个表空间组成,每个表空间由一个或多个数据文件组成,每个数据文件由一个或多个簇组成;

  • 段 > 簇 > 页 :段是簇的上级逻辑单元,但一个段可以跨多个数据文件;簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。

可以看得出来,达梦数据库存储结构跟 MySQL 类似,表空间被进一步划分为段、簇和页(也称块)。并通过这种细分,使数据库能够更加高效地控制磁盘空间的利用率。

2.1 表空间

DM 数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中,在创建 DM 数据库时,会自动创建 4 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间和 TEMP 表空间。

表空间

注 :DM 数据库中的表空间可以分为普通表空间和混合表空间。普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通表和 HUGE 表。

2.2 记录

数据库表中的每一行是一条记录。

  • 除了 HUGE 表,其他的表都是在数据页中按记录存储数据的;
  • 页为最小存储单位,记录不能跨页存储,这样记录的长度就受到数据页大小的限制;
2.3 页

数据页(也称数据块)是 DM 数据库中最小的数据存储单元,即页的大小对应物理存储空间上特定数量的存储字节,一旦创建好了数据库,页大小都不能够改变。

  • 页大小可以为 4KB、8KB、16KB、32KB;
  • 以下为页的格式图
    页

注 : 根据业务是否频繁更新进行 FILLFACTOR 值的设置, 更新较多的最好将改值设置较低,FILLFACTOR 的含义为页的最大可以使用空间百分比

2.4 簇

簇是数据页的上级逻辑单元,由同一个数据文件中 16 个或 32 个或 64 个连续的数据页组成。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。

  • 初始化表或者索引时,会分配一个簇;

  • 分配空间时,在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配;

  • 回收簇空间时,回收方式类似 MySQL 的 delete、drop、truncate 等方式

  • 临时表空间的簇会在 SQL 执行后自动释放;

  • 回滚表空间会定期释放;

2.4 段

段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的数据文件。

  • 数据段 : 段可以被定义成特定对象的数据结构,如表数据段或索引数据段。
  • 临时段 : 所有的临时段都创建在临时表空间中,分流磁盘设备的 I/O,减少由于在 SYSTEM 或其他表空间内频繁创建临时数据段而造成的碎片;临时段的分配和释放完全由系统自动控制,用户不能手工进行干预。
  • 回滚段 :在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。
    • 对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更;

    • 在数据库恢复阶段,回滚记录被用来做任何未提交变更的回滚;

    • 在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询;

    • DM 数据库提供了全自动回滚管理机制来管理回滚信息和回滚空间,自动回滚管理消除了管理回滚段的复杂性。

二、 DM 物理存储结构

基于达梦数据库的逻辑存储特点及其必备功能,DM 的物理存储结构主要围绕表空间和日志进行设计。典型的物理存储结构包括:用于功能设置的配置文件、记录文件分布的控制文件、保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件,以及用于问题跟踪的跟踪日志文件等,如下图所示。
DM 物理存储结构

1 配置文件

配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 INI 为扩展名。

1.1 服务配置
  • dm.ini :配置该文件可以设置 DM 数据库服务器的各种功能和性能选项,主要的配置模块包括:控制文件相关、实例名、内存相关、线程相关等,类似于 MySQL 的 my.ini;
  • dmmal.ini :MAL 系统的配置文件;
  • dmarch.ini :用于配置归档;
  • dm_svc.conf :个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能生效;
  • sqllog.ini :用于SQL日志的配置,当且仅当INI参数SVR_LOG=1时使用;
  • dmthrd.ini :用于为线程类型绑定 CPU 核心,当且仅当 INI 参数 DMTHRD_INI=1 时使用;
1.2 复制配置
  • dmrep.ini : 用于配置复制实例;
  • dmllog.ini : 用于配置逻辑日志;
  • dmtimer.ini :用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。

2 控制文件

每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,包含数据库名称、数据库服务器模式、OGUID 唯一标识、服务器版本、数据文件版本、启动信息、表空间信息、控制文件校验码等。

3 数据文件

数据文件以 dbf 为扩展名,每个数据库至少有一个与之相关的数据文件, 在实际使用中,一般不建议使用单个巨大的数据文件,一个表空间创建多个较小的数据文件是更好的选择。数据文件存储方式主要有以下四种 :

3.1 B 树数据
  • 行存储数据,普通表、分区表、B 树索引的物理存储格式都是 B 树;
  • 一个 B 树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。其 B 树的逻辑关系由段内页面上的记录,通过文件指针来完成;
  • 当表上没有指定聚集索引时,系统会自动产生一个唯一标识 rowid 作为 B 树的 key 来唯一标识一行,实际使用一般不建议这样做;
3.2 堆表数据

堆表的数据是以挂链形式存储的,一个链表在物理上就是一个段,堆表采用的是即时生成的物理 rowid 进行插入,效率很快;

3.3 列存储数据

数据按列方式组织存储,包含每个列对应的存放列数据的一系列数据文件,以及存放列数据控制信息的辅助表。读取列数据时,只需要顺序扫描列数据文件和辅助表数据。一般都是 AP 场景使用较多。

3.4 位图索引

一对多,每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。

4 重做日志文件

  • 重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件;

  • 每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用;

  • 存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复,主要用于数据库的备份与恢复。

5 归档日志文件

  • 日志文件分为联机日志文件和归档日志文件。
  • DM 数据库可以在归档模式和非归档模式下运行 :

非归档模式:数据库会只将重做日志写入联机日志文件中进行存储;
归档模式 :数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。

6 逻辑日志文件

逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。

7 物理逻辑日志文件

物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 DBMS_LOGMNR包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内容会被存储在重做日志文件中。

8 备份文件

备份文件以 bak 为扩展名,备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息,系统还会自动记录备份信息及该备份文件所处的位置,但这种记录是松散的,用户可根据需要将其拷贝至任何地方,并不会影响系统的运行。

9 SQL 日志文件

SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,例如慢查询分析。

注 : 打开 SQL 日志会影响系统的性能,因此一般在需要查错和调优的时候才会打开。

10 事件日志文件

记录了 DM 数据库运行时的关键事件。例如:系统启动、关闭、内存申请失败、IO 错误等一些致命错误;数据库运行过程中的日志信息;备份还原过程中备份还原操作的阶段性信息等;

  • 事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志简称 ELOG,事件日志文件随着 DM 数据库服务的运行一直存在;
  • 事件日志信息格式为:时间+日志类+进程+进程ID+线程+日志内容;
  • 初始化过程中产生的 ELOG 会保存在 ELOG_PATH 参数指定的目录下,名称为“dminit+日期+时间”,系统启动和运行过程中产生的 ELOG 保存在系统 log 目录下,无法启动时生成的事件日志文件命名为 “dm_unknown_年月 ”

三、 DM 内存结构说明

数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是 DBMS 系统所必须的。通常内存管理系统会带来以下好处:

  • 申请、释放内存效率更高;
  • 能够有效地了解内存的使用情况;
  • 易于发现内存泄露和内存写越界的问题。

DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。

1 内存池

DM Server 的内存池包括共享内存池和其他一些运行时内存池,可通过查询动态视图 V$MEM_POOL 掌握 DM Server 的内存使用情况。

1.1 共享内存池

共享内存池是 DM Server 在启动时从操作系统申请的一大片内存。

  • 目的 :在 DM Server 的运行期间,经常会申请与释放小片内存,而直接向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。于是 DM 采用共享内存池的方式:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
  • 共享池大小的参数为 MEMORY_POOL,缺省大小为 500M;MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小; MEMORY_TARGET 则指定了共享内存池扩展到超过该值后空闲时会收缩到的大小;
1.2 运行时内存池

除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池,如会话内存池、虚拟机内存池等。

2 缓冲区

2.1 数据缓冲区
链条控制数据缓冲区

系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页 :

  • “自由”链 :用于存放目前尚未使用的内存数据页;
  • “LRU”链 :用于存放已被使用的内存数据页(包括未修改和已修改);

    LRU 链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从 LRU 链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少 IO。

  • “脏”链 :用于存放已被修改过的内存数据页;
热数据保障

对于热数据的处理,数据缓冲区开辟了一个特定的区域用
于存放它们,以保证这些页不参与一般的淘汰机制,可以一直留在数据缓冲区中,但是需要通过控制进行保存,方式如下 :

  • 根据类别控制 : DM Server 中有四种类型的数据缓冲区,分别是 NORMAL、KEEP、FAST 和 RECYCLE。

用户可以在创建表空间或修改表空间时,指定表空间属于 NORMAL 或 KEEP 缓冲区,NORMAL 缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为 NORMAL;KEEP 的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为 KEEP
RECYCLE 缓冲区供临时表空间使用,FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理,用户不能指定使用 RECYCLE 和 FAST 缓冲区的表或表空间;

  • 设置读多页参数 : MULTI_PAGE_GET_NUM 大小(默认值为 1 页),来控制每次读取的页数,可能存在读取的页是不需要的情况,需要根据场景需要制定;
2.2 日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。
注意点如下 :

  • 重做日志的格式同数据页完全不一样,无法进行统一管理;
  • 重做日志具备连续写的特点;
  • 在逻辑上,写重做日志比数据页 IO 优先级更高;
  • 日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,通过 RLOG_BUF_SIZE 控制。
2.3 字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。

2.4 SQL缓冲区

SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。

3 排序区

排序缓冲区提供数据排序所需要的内存空间,通过 SORT_BUF_SIZE 可进行配置。

4 哈希区

DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。

四、 DM 线程管理说明

DM 服务器使用“对称服务器构架”的单进程、多线程结构。DM 进程中主要包括监听线程、IO 线程、工作线程、调度线程、日志线程等,以下分别对它们进行介绍。

1 监听线程

监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。

  • 系统启动完成后才启动,并且在系统关闭时首先被关闭;
  • 为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高;
  • DM 服务器所有配置端口的范围为 1024-65534。

2 工作线程

工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。

注 :初始工作线程个数以及最大阈值由配置文件指定,超过预设的阈值后的任务需要轮询进行排队等待。

3 IO 线程

DM 数据库的 IO 线程数是可配置的,请求 IO 的过程中主要借助操作系统本身的机制,尽可能异步将数据页写入缓存中再发出 IO 完成通知,进行 IO 操作的时机也跟 MySQL 比较类似,主要有以下三种 :

  • 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
  • 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
  • 检查点到来时,需要将所有脏数据页写入磁盘。

注 : 检查点是指数据库系统在特定时间点将所有脏数据页(Dirty Pages)从内存写入磁盘,并更新数据库的日志信息,以确保在发生故障时,数据库可以从最近的检查点开始恢复,而不必从日志的开头重放所有的日志记录。

4 调度线程

调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:

  • 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
  • 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
  • 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
  • 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
  • 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
  • 必要时执行数据更新页刷盘;
  • 唤醒等待的工作线程。

5 日志 FLUSH 线程

基于 WAL 原则,当事务提交或者执行检查点时,会先通知 FLUSH 线程进行缓冲区 REDO 的日志刷盘。

  • 由于日志具备顺序写入的特点,比数据页分散 IO 写入效率更高。DM8 的日志 FLUSH 线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了 IO 次数,进一步提高了性能。
  • 如果系统配置了实时归档,在 FLUSH 线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。

WAL 原则 :在数据页(即数据实际存储的地方)写入磁盘之前,必须先将该数据的变更记录(REDO日志)写入磁盘。这样可以确保在系统崩溃时,日志中包含了所有已提交事务的变更,可以用来恢复数据。

6 日志归档线程

日志归档线程包含异步归档线程,负责远程异步归档任务。

  • 将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线程中一起做会严重影响系统性能。

7 日志 APPLY 线程

用于主备同步 : 在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志就生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致。

8 定时器线程

默认不启动,通常情况下,DM Server 需要进行定时操作的事件主要有以下几种:

  • 逻辑日志异步归档;
  • 异步归档日志发送(只有在 PRIMARY 模式下,且是 OPEN 状态下);
  • 作业调度。

9 逻辑日志归档线程

逻辑日志归档用于 DM8 的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。

9.1 本地逻辑日志归档线程
  • 本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。
  • 如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。
9.2 远程逻辑日志归档线程
  • 远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。
  • 任务的类型包括同步发送和异步发送。

10 MAL 系统相关线程

MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。

11 线程信息的查看

DM 提供了很多动态性能视图,通过它们用户可以直观地了解当前系统中有哪些线程在工作,以及线程的相关信息。如下图 :
线程

至此对达梦数据库体系内容有了初步认识,本篇博客到此结束!

参考内容

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值