为了更好的了解达梦数据库,本文我们就以DM v8(开发版)为基础,对达梦数据库的体系结构进行初步的学习。
总的来说,达梦数据库的体系结构分成4个大的部分,分别是:逻辑结构、物理存储结构、内存结构以及线程结构。接下来,我们就来一起认识一下这4大体系结构。
一、逻辑结构概述
1.1 关于数据库和实例
对Oracle数据库有过了解的同学应该有知道,Oracle有实例和数据库之分,相应的,在达梦数据库里面,也是有数据库和实例之分。常规来讲,DM数据库指的是磁盘上存放在DM数据库中的数据的集合,包括:数据文件、日志文件、控制文件以及临时数据文件等。而在达梦数据库中的 实例,则是由一组正在运行的DM后台进程/线程以及一个大型的共享内存组成。通俗来说,实例就是操作DM数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。
关于数据库与实例的关联关系,咱们在后续的 DM共享存储集群(DMDSC)中会有着重介绍。
1.2 DM逻辑存储结构
DM数据库为数据库所有对象分配逻辑空间是存放在数据文件中的。在DM数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间又进一步划分为段、簇和页(也称块)。页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
上图清楚显示了达梦数据库中的数据结构间关系。可以看出,在DM8中存储的层次结构如下:
1.2.1 表空间
在创建DM数据库时会自动创建以下5个表空间:
(1)SYSTEM表空间存放了数据库的字典信息。
(2)ROLL表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
(3)MAIN表空间在初始化库的时候,会自动创建大小为128M的数据文件MAIN.DBF。在创建用户时没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间。
(4)TEMP表空间,用户的SQL语句需要磁盘空间来完成某个操作时,DM数据库会从TEMP表空间分配临时段。
(5)HMAIN表空间属于HTS表空间,当用户在创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。
1.2.2 记录
数据库表中的每一行是一条记录。在DM中,除了Huge表,其他的表都是在数据页中按记录存储数据的。记录是存储在数据页中的,记录并不是DM数据库的存储单位,页才是。
1.2.3 页
在DM数据库中,页的默认大小为8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。用户在创建数据库时可以指定页大小,如调整为4KB、8KB、16KB或者32KB。
这里需要注意的是, DM数据库提供了一个与性能有关的数据页级存数据页的分裂,该参数的设置与数据页分裂及I/O性能有密切关系,DBA同学要多注意。
1.2.4 簇
簇是数据页的上级逻辑单元,由同一个数据文件中16个或32个或64个连续的数据页组成。在DM数据库中,簇的大小由用户在创建数据库时指定,在达梦中的默认大小为16个。
1.2.5 段
段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的16或者32个数据页。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。有数据段、临时段和回滚段这3种类型。
二、物理存储结构
DM数据库中,物理形式存放的文件,大体分为以下几种类型:
2.1 DM数据库服务配置文件
1) dm.ini
是DM数据库启动所必须的配置文件,通过配置该文件可以设置DM数据库服务器的各种功能和性能选项。
2) dmmal.ini
是MAL系统的配置文件。注意:需要用到MAL环境的实例,所有站点dmmal.ini需要保证严格一致。
3) dmarch.ini
用于本地归档和远程归档。
4) dm_svc.conf
DM安装时生成一个配置文件dm_svc.conf,文件中包含DM各接口及客户端需要配置的一些参数。该文件在不同的平台其所在目录也不同。在Linux平台下,此文件位于/etc目录。
5) sqllog.ini
用于sql日志的配置,当且仅当INI参数SVR_LOG=1时使用。
2.2 控制文件
每个DM数据库都有一个名为dm.ctl的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息。由于该文件有着非常重要的作用,因此,我们可以在dm.ini 中指定对该文件相关的备份策略。
2.3 数据文件
数据文件以dbf为扩展名。数据文件按数据组织形式,可以分为:B树数据,堆表数据,列存储数据,位图索引,ROLL文件(ROLL 表空间的dbf文件),TEMP 文件(TEMP.DBF 临时数据文件)。
2.4 重做日志文件(即REDO日志)
在DM数据库中添加、删除、修改对象,或者改变数据,DM都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。DM数据库实例必须至少有2个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
重做日志文件用于存储数据库的事务日志,以便系统或介质故障时能够进行数据恢复。
2.5 归档日志文件
在归档模式下运行时,DM数据库才会将重做日志写入到归档日志文件中。归档日志文件以归档时间命名,扩展名也是 log。
采用归档模式会对系统性能产生影响,但系统在归档模式下运行会更安全。需要根据实际情况对归档的启用做出权衡。
2.8 备份文件
以 bak 为扩展名,当数据库出现故障时,备份文件就显得尤为重要。
2.9 跟踪日志文件
跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,如,可以挑出系统现在执行速度较慢的SQL语句,进而对其进行优化。
2.10 事件日志文件
事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志文件对DM数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、IO错误等一些致命错误。
2.11 数据重演文件
抓取DM数据库与客户端的通信消息,用于数据重演。使用数据重演文件,为系统调试和性能调优提供一种分析手段。
三、内存结构
DM数据库管理系统的内存结构主要有内存池、缓冲区、排序区、哈希区等。
3.1 内存池
DM Server的内存池包括共享内存池和其他一些运行时内存池。可通过查询动态视图V$MEM_POOL掌握DM Server的内存使用情况。
3.1.1 共享内存池
共享内存池是DM一次向操作系统申请的一片较大内存,当系统在运行过程中需要申请内存时,可在共享内存池内进行申请和释放。在配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为MEMORY_POOL,该配置默认为200M。
3.1.2 运行时内存池
DM Server的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
3.2、缓冲区
大体上分为数据缓冲区、日志缓冲区、字典缓冲区、SQL缓冲区。
其中,数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。至关重要内存区域之一,设置过小,缓冲区命中率低,磁盘IO频繁;设置过大,会导致操作系统内存不够用。这些内容对于DBA来说,是需要值得关注的。
3.3、排序区
排序缓冲区提供数据排序所需要的内存空间。
3.4、哈希区
DM8提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。DM Server在dm.ini中提供了参数HJ_BUF_SIZE来进行控制。
四、DM数据库线程
DM使用单进程,多线程结构。线程分为多种类型,主要有监听线程、 IO 线程、工作线程、调度线程、日志线程等,以下分别对它们进行介绍。服务器在运行时由各种内存结构和多个线程组成,线程通过一定的同步机制对数据结构进行并发访问和处理。
4.1 监听线程 dm_lsnr_thd
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。
4.2 工作线程 dm_tskwrk_thd和dm_wrkgrp_thd
工作线程是DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
4.3 IO线程 dm_io_thd、dm_hio_thd
在数据库活动中,当事务需要的数据页不在缓冲区中时,IO线程的职责就是处理这些IO操作。
4.4 调度线程 dm_sched_thd
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次。
4.5 日志FLUSH线程 dm_redolog_thd
任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知FLUSH线程进行日志刷盘。
4.6 日志归档线程 dm_rsyswrk_thd
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。
4.7 日志APPLY线程
在配置了数据守护的DM数据库系统中,创建日志APPLY线程。当服务器作为备库时,在接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。提供对用户的只读,也可承担报表、查询等任务,承担主库的部分业务负载。
4.8 定时器线程
在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作、逻辑日志异步归档;异步归档日志发送(只有在PRIMARY模式下,且是OPEN状态下);作业调度等。
4.9 逻辑日志归档线程
逻辑日志归档用于DM8的数据复制中,包含本地逻辑日志归档线程和远程逻辑日志归档线程。
4.10 MAL系统相关线程
MAL系统是DM内部高速通信系统,基于TCP/IP协议实现。MAL系统内部包含一系列线程,有MAL监听线程、MAL发送工作线程、MAL接收工作线程等。
4.11 其他线程
事实上,DM数据库系统中还不止以上这些线程,在一些特定的功能中会有不同的线程,例如回滚段清理PURGE线程、审计写文件线程、重演捕获写文件线程等。
以上是这次技术分享的相关内容,欢迎给我留言进行交流指导。
DM 武汉达梦数据库股份有限公司 24小时免费服务热线:400 991 6599
达梦技术社区:https://eco.dameng.com