注册
达梦数据库体系架构
技术分享/ 文章详情 /

达梦数据库体系架构

勇往直前 2024/08/02 3058 2 1

参考书籍《达梦数据库运维实战》

数据库一般指数据文件的集合,包括数据文件、日志文件、控制文件等。实例指数据库的后台进程/线程和内存的组合。数据库存储在服务器的磁盘上,而实例则存储于服务器的内存中。通过运行DM实例,可以操作达梦数据库中的数据,实例仅在启动后才存在。
达梦数据库的结构可以分为物理结构和逻辑结构。

1 物理结构

物理结构主要指达梦数据库对应的物理文件,包括配置文件、控制文件、数据文件、REDO日志文件、归档日志文件、备份文件、跟踪日志文件等。

1.1 配置文件

达梦数据库的配置文件都已ini为扩展名,用来存储功能选项的配置值。配置文件存放在数据文件的目录下。例如:
(1)dm.ini:DM实例的配置参数,在创建DM实例时自动生成。
(2)dmmal.ini:MAL系统的配置文件。在配置达梦数据库高可用解决方案时(DMDW,DMDSC)需要用到该配置文件。
(3)dmarch.ini:归档配置文件,启用数据库归档后,在该文件中配置归档的相关属性,如归档类型、归档路径、归档可使用的空间大小等。
(4)dm_svc.conf:该文件中包含达梦数据库各个接口及客户端所需要的配置信息,在安装达梦数据库时自动生成。
(5)……

1.2 控制文件

每个DM实例都有一个二进制的控制文件,默认文件和数据文件存放在同一个目录下,扩展名为ctl。
控制文件中记录了数据库必要的初始信息,主要包含以下内容:
(1)数据库名称
(2)数据库服务器模式
(3)OGUID唯一标识
(4)数据库服务器版本
(5)数据文件版本
(6)数据库的启动次数
(7)数据库最近一次的启动时间
(8)表空间信息
(9)控制文件校验码,于每次修改控制文件后生成,保证控制文件的合法性,防止文件损坏及手工修改

1.3 数据文件

一个表空间至少包含一个数据文件,数据文件扩展名为DBF。表空间中数据文件的总数不得超过256。
数据文件可以配置成是否自增,每次自增的范围为0-2048MB。数据文件的大小范围为4096x页大小-2147483647x页大小。达梦数据库页大小可选值为4KB、8KB(默认)、16KB、32KB。在达梦数据库页大小为8KB时,数据文件大小的范围为32MB~16384GB。

1.4 REDO日志文件

REDO日志文件记录数据库实例的DDL和数据更新操作。这些操作执行的结果按照特定的格式写入当前的REDO日志文件中。REDO日志文件以log为扩展名。每个数据库实例至少有两个REDO日志文件,默认日志名称是数据库名加编号,两个日志文件循环使用。
REDO日志文件主要用于数据库的备份与恢复。在异常情况下,比如服务器异常断电的情况,数据库缓冲区中的数据页未能及时写入数据文件中,在下次启动DM实例时,通过REDO日志文件中的数据,可以将实例恢复到发生意外前的状态。

1.5 归档日志文件

REDO日志是循环使用的,当REDO日志文件被写满后,数据库会根据检查点覆盖之前的内容。为了保证数据库备份恢复操作正常执行,需启动归档模式,并且将REDO日志中的数据复制到归档日志中。归档日志文件以归档时间命名,扩展名也是log。REDO日志文件非常重要,虽然其以“.log”结尾,但是他们在任何时候都不可以被删除。
归档文件除了在备份恢复时会用到,在达梦数据库的数据守护中,备库也是通过REDO日志来完成与主库的数据同步的。
归档文件的保存目录由dmarch.ini中的ARCH_DEST参数控制。

1.6 备份文件

备份文件是数据库备份恢复过程中使用的文件,扩展名为bak。在执行SQL备份或DMRMAN备份时会生成备份文件。
备份文件中记录备份的名称、数据库、备份类型和备份时间等信息。备份文件是数据库备份恢复操作的基础,也可以通过备份恢复的方式进行数据迁移。

1.7 跟踪日志文件

跟踪日志文件记录了系统各会话执行的SQL语句、参数信息、错误信息等,主要用于分析错误和性能。启用跟踪日志对系统的性能会有较大影响,默认情况下跟踪日志是关闭的,仅在查错和调优时才会打开。
将dm.ini中的SVR_LOG参数修改为1即可打开跟踪日志。跟踪日志文件是一个纯文本文件,以“dm_commit_日期_时间”命名,默认在达梦数据库安装目录的log子目录下生成,可以通过ini参数SVR_LOG_FILE_PATH设置其生成路径。

1.8 事件日志文件(告警日志)

事件日志文件记录了数据库运行期间的关键事件,如启动、关闭、内存申请失败、I/O错误等一些致命错误。当数据库出现异常时,可以查看事件日志文件进行分析。事件日志文件记录的是中间步骤的信息,所以出现部分缺失属于正常现象。
事件日志文件在/dm/dmdbms/log目录下,命名格式是“dm_实例名_日期”。

2 逻辑结构

一般情况下,一个数据库与一个实例对应,但在DMDSC环境下,一个数据库对应多个实例。
在达梦数据库中存储层次结构如下:
(1)数据库由1个或多个表空间组成。
(2)表空间由1个或多个数据文件组成。
(3)数据文件由1个或多个簇组成。
(4)段是簇的上级逻辑单元,1个段可以跨多个数据文件。
(5)簇由磁盘上连续的页组成,1个簇总是在1个数据文件中。
(6)页是数据库中最小的分配单元,也是数据库中使用的最小的I/O单元。

2.1 表空间

数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间对应的数据文件中。
创建数据库时会自动创建5个表空间:SYSTEM表空间、ROLL表空间、MAIN表空间、TEMP表空间和HMAIN表空间。
(1)SYSTEM表空间:即系统表空间,存放了有关数据库的字典信息,用户不能在该表空间中创建表和索引。
(2)ROLL表空间:即回滚表空间,存储事务执行修改操作之前的值,从而保证数据的读一致性。该表空间由数据库自动维护。
(3)MAIN表空间:是默认的用户表空间,创建用户时如果没有指定默认表空间,则使用该表空间为默认的表空间。
(4)TEMP表空间:即临时表空间,当SQL语句需要磁盘空间来完成某个操作时,会从该表空间分配临时段。该表空间由数据库自动维护。
(5)HMAIN表空间:是HTS表空间,创建HUGE表时,如果没有指定HTS表空间,默认使用HTS表空间存储。
SYS\SYSSSO\SYSAUDITOR用户的默认用户表空间是SYSTEM表空间,SYSDBA用户的默认表空间是MAIN表空间,新创建的用户如果没有指定默认表空间,则使用MAIN表空间为用户的默认表空间。
可以通过V$TABLESPACE视图查看表空间相关的信息,SQL语句为

select id,name,type$,total_size from v$tablespace;

如果是HUGE表空间,查看V$HUGE_TABLESPACE视图,SQL语句为

select * from v$huge_tablespace;

2.2 记录

达梦数据库表中的每一行数据就是一条记录。除了HUGE表,数据库中的其他表都是以记录的形式将数据存储在数据页中的。
数据页中除了存储记录的数据,还包括了页头控制信息等空间,而记录又不能跨数据页存储,因此记录的长度受到数据页大小的限制。在达梦数据库中,每条记录的总长度不能超过数据大小的一半(如果超过页面大小的一半,可以在表中设置启用“超长列”)。

2.3 页

数据页(Page)也成为数据块,是达梦数据库中最小的数据存储单元。达梦数据库中页大小可以设置为4KB、8KB(默认)、16KB、32KB。在创建数据库时指定其大小,数据库建好后,页大小不能修改。
数据页包括4各部分:页头控制信息、数据、空闲空间、行偏移数组。
页头控制信息包含页类型、页地址等信息。页中部存储的是记录的数据,页尾部专门留出了部分空闲空间存放行偏移数组,行偏移数组用于标识页上的空间占用情况,以便管理数据页自身的空间。
在正常情况下,用户不用干预数据对页的管理。但在创建表或索引时也可以指定该对象的存储属性,FILLFACTOR。该属性控制存储数据时每个数据页和索引页的充满程度,取值范围为0-100,默认值为0,等于100,表示全满填充。
填充比例决定了页内的可用空间,当填充比例较低时,页内有更多的可用空间,可以避免在增加列或者更新列时因为空间不足导致的页分裂,即一部分保留在当前数据页中,另一部分存入一个新页中。
使用FILLFACTOR要平衡性能和空间,设置较低的FILLFACTOR可以避免频繁的页分裂,降低I/0操作,从而提升性能,但是需要更多的空间来存储数据。

2.4 簇

簇由同一个数据文件中16个或32个连续的数据页组成。该大小在创建数据库时指定,默认为16个。比如数据文件大小为32MB,页大小为8KB,则共有32MB/8KB/16=256个簇,每个簇的大小为8KB*16=128KB。簇的大小只能在创建数据库时指定,之后不能修改。

2.4.1 分配簇

在创建表或索引时,对应的数据段至少分配一个簇,同时数据库会根据簇大小,自动生成对应数量的空闲数据页。当初分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,数据库会自动分配新的簇。
初始簇数量和下次分配簇数量由对象的存储属性,INITIAL和NEXT决定。这两个属性的默认值都是1,最大可以设置为256.
在表空间中为新的簇分配空闲空间时,按如下步骤进行:
(1)查找空闲簇:在表空间中按数据文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配。
(2)格式化簇:若表空间中所有的数据文件都没有空闲簇,则首先在各数据文件中查找需要的空闲空间,其次将需要的空间格式化,最后进行分配。
(3)扩展数据文件:若所有数据文件中的空闲空间都不够,则首先选一个数据文件进行扩展,其次进行格式化,最后进行分配。

2.4.2 释放数据簇

在数据表空间中,当删除表中的记录时,数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象是用。若删除了表中所有的记录,数据库仍然会为该表保留1-2个簇供后续使用。若删除(drop)表或索引对象,则该表或索引对应的簇会全部收回,供其他对象使用。
删除表中的记录后,最小的保留簇数目由对象的存储属性MINEXTENTS决定,该选项的默认值为1,最大值为256.
对于临时表空间,达梦数据库会自动释放在执行SQL过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。但临时表空间文件在磁盘中所占大小并不会因此而缩减,可以通过系统函数SF_RESTE_TEMP_TS来进行磁盘空间的清理。
对于回滚表空间,达梦数据库将定期检查回滚段,并确定是否需要从回滚段中释放1个或多个簇。

2.5 段

段(Segment)由表空间中的一组簇组成,这些簇可以来自不同的数据文件,而簇只能由同一个数据文件中连续的16个或32个数据页组成。因为簇的数量根据对象的数据量来分配,所以段中的簇不一定是连续的。

2.5.1 数据段

段时特定对象的数据结构,如表数据段、索引数据段。表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储。达梦数据库以簇为单位给每个数据段分配空间。
在使用CREATE语句创建表或索引时,数据库会创建相应的数据段。簇的分配数量由对象的存储属性决定。
对于分区表和分区索引,每个分区都是独立的数据段。

2.5.2 临时段

数据库在执行事务操作,比如排序操作时,有时会产生一些临时的数据,在这种情况下,数据库会自动在临时表空间中创建临时段。临时段的分配和释放完全由数据库自动控制,不需要DBA干预,而将临时段创建到临时表空间中,可以分散I/0,也可以减少其他数据表空间因频繁创建临时段造成的碎片。

2.5.3回归段

回滚段中存储的是修改数据的前镜像,在回滚表空间中分配。回滚段主要用于事务回滚,以保证读一致性。回滚空间及回滚段由数据库自动管理,不需要DBA干预。但DBA也可以通过修改相关的参数来控制回滚段的分配和保留时间,UNDO_EXTENT_NUM、UNDO_RETENTION、ROLL_ON_ERR。

3 内存结构

数据库实例由内存结构和一系列的线程组成,内存结构主要包括内存池、缓冲区、排序区、哈希区等。

3.1 内存池

达梦数据库的内存池包括共享内存池和运行时内存池。可以通过V$MEME_POOL视图查看所有内存池的状态和使用情况。SQL为:

select distinct name,is_shared from V$MEM_POOL order by2;

内存池分为两种类型:共享内存池和运行时内存池,实际上在该视图里还记录了不同内存池的大小及扩展情况。

3.1.1 共享内存池

在实例运行期间,需要经常申请或释放小片内存,而向操作系统申请或释放内存时要进行系统调用,此时可能会引起线程切换,降低系统运行效率。
因此,实例在启动时会从操作系统中申请一大片内存,即内存池。当实例在运行中需要内存时,可在共享内存池内申请或释放内存。
共享内存池可以在实例的配置文件(dm.ini)中进行配置。
MAX_OS_MEMORY = 95表示操作系统内存的最大百分比
MEMORY_POOL = 73表示兆字节的内存池大小
MEMORY_TARGET = 0表示兆字节的内存共享池目标大小
MEMORY_EXTENT_SIZE = 1表示兆字节的内存扩展大小
MEMORY_LEAK_CHECK = 0表示内存池泄露检查标志
MEMORY_MAGIC_CHECK = 2表示内存池磁盘检查标志
MEMORY_BAK_POOL = 4表示兆字节的内存备份池大小
MEMORY_POOL参数指定的是共享内存池大小,64位系统的取值范围是64-67108862MB。在实例运行时,如果需要的内存大于共享池的配置值,则共享内存池会自动进行扩展,每次扩展的大小由MEMORY_EXTENT_SIZE参数决定。该参数的有效范围是1-10240MB.
MEMORY_TARGET参数控制的是共享内存值可使用的最大值,该值的取值范围在32位平台中是0-2000MB,在64位平台中是0-67108864MB,0表示不限制。此时可使用的最大内存值是由MAX_OS_MEMORY参数指定的,即操作系统内存的最大百分比。

3.1.2 运行时内存池

除了共享内存池,实例的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。

3.2 缓冲区

3.2.1 数据缓冲区

数据缓冲区保存的是数据页,包括用户更改的数据页和查询时从磁盘读取的数据页。该区域大小对实例性能的影响较大,设定过小会导致缓冲页命中率低,磁盘I/O频繁;设定过大会导致内存资源的浪费。
实例在启动时,根据配置文件中参数指定的数据缓冲区大小,向操作系统申请一片连续的内存,并将其按数据页大小进行格式化,最后置入“自由”链中。
数据缓冲区有3条链来管理被缓冲的数据页。
(1)“自由”,用于存放目前尚未使用的内存数据页。
(2)“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改的内存数据页)。
(3)“脏”链,用于存放已被修改过的内存数据页。
“LRU”链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的“自由”链被用完时,从“LRU”链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,从而减少物理I/O操作。
如果某些数据页访问非常频繁,可以将它们存放到缓冲区中的特定区域KEEP缓冲区中,从而保证这些数据页一直留在数据缓冲区中。
可以通过以下视图查看缓冲区的相关信息。
(1)V$BUFFERPOOL:页面缓冲区动态性能表,用来记录页面缓冲区结构的信息。
(2)V$BUFFER_LRU_FIRST:显示所有缓冲区“LRU”链首页信息。
(3)V$BUFFER_LRU_LAST:显示所有缓冲区“LRU”链末页信息。
1)缓冲区类型

通过select distinct name,count(*) from V$BUFFERPOOL group by name order by 2 desc;查询V$BUFFERPOOL视图,可以看出DM实例的内存数据缓冲区有5种类型:NORMAL、KEEP、FAST、RECYCLE和ROLL。

在创建表空间或修改表空间时,可以指定表空间属于NORMAL缓冲区或KEEP缓冲区。
NORMAL缓冲区主要存储实例正在处理的数据页,在没有特别指定缓冲区的情况下,默认缓冲区为NORMAL;KEEP缓冲区用来存储很少淘汰或几乎不淘汰的数据页。
RECYCLE缓冲区供临时表空间使用;ROLL缓冲区供回滚表空间使用;FAST缓冲区根据FAST_POOL_PAGES参数指定的大小由系统自动管理,用户不能指定RECYCLE]ROLL]FAST缓冲区的表或表空间。
在dm.ini配置文件中,有以下对应参数来控制缓冲区的大小。
HUGE_MEMORY_PERCENTAGE=50#在HUGE缓冲区中可以用作常规内存的分配空间百分比
HUGE_BUFFER=80#兆字节的初始HUGE缓冲区的大小
HUGE_BUFFER_POOLS=4#HUGE缓冲池的数量
BUFFER=615#兆字节的初始系统缓冲区的大小
BUFFER_POOLS=19#缓冲池的数量
FAST_POOL_PAGES=3000#快速缓冲区页数的数量
FAST_ROLL_PAGES=1000#快速回滚页的数量
KEEP=8#兆字节的系统KEEP缓冲区大小
RECYCLE=147#兆字节的系统RECYCLE缓冲区大小
RECYCLE_POOLS=19#RECYCLE缓冲池的数量
ROLLSEG=1#兆字节的系统ROLLSEG缓冲区大小
ROLLSEG_POOLS=19#ROLLSEG缓冲池的数量
2)读多页
在实力处理事务时,有时需要读取大量的数据页,DM实例默认I/O操作每次只读取一个数据页。在这种情况下,为了完成事务,就会执行多次I/O操作,效率较低。因此DM实例允许用户修改每次I/O操作读取的数据页的数量,对应的参数是MULTI_PAGE_GET_NUM,有效值范围为1-128,该参数也是静态参数,修改需要重启实例。可以根据实际情况,在dm.ini文件中进行修改,使一次性I/O能读取多个数据页,从而减少I/O次数,提高数据的处理效率。
注意MULTI_PAGE_GET_NUM的值并不是越大越好,如果设置过大,每次读取的页可能大多都不是需要的数据页,这样不仅会增加I/O的读取次数,而且每次都会做一些无用的I/P,降低了效率。
同时还要住,在使用数据库加密或者启用SSD缓冲区(SSD_BUF_SIZE>0)的情况下,不支持多页读取,此时即使在dm.ini中做了修改也无效。

3.2.2 日志缓冲区

日志缓冲区用于存放REDO日志的内存缓冲区。为了避免直接的磁盘I/O对实例性能造成影响,实例在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。
将日志缓冲区与数据缓冲区分开主要基于以下原因。
(1)REDO日志的格式与数据页不同,无法进行统一管理。
(2)REDO日志具备连续写的特点。
(3)在逻辑上,写REDO日志比写数据页的I/O优先级更高。
在dm.ini配置文件中相关的参数如下。
RLOG_BUF_SIZE=1024#单个日志缓冲区的日志页数量
RLOG_POOL_SIZE=256#兆字节的REDO日志缓冲池的大小
可以通过RLOG_BUF_SIZE参数对单个日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为日志页数量,且大小必须为2的n次方,最小值为1,最大值为20480.
RLOG_POOL_SIZE参数控制的是最大日志缓冲区大小,有效值范围为1-1024MB.

3.2.3 字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每个事务操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如执行查询时需要获取表的信息、列的信息等,从字典缓冲区中读取这些信息的效率要高于磁盘I/O读取。
DM实例在启动时会将部分数据字典信息加载到字典缓冲区中,并采用LRU算法进行字典信息的控制。可以修改配置文件中的DICT_BUF_SIZE参数来控制字典缓冲区的大小,该参数是静态参数,默认值是5MB。该缓冲区从内存池中申请。
可以通过以下两个视图查看字典缓冲区的情况。
(1)V$DICT_CACHE_ITEM:显示字典缓存中的字典对象信息。
(2)V$DICT_CACHE:显示字典缓存信息。

3.2.4 SQL缓冲区

SQL缓冲区提供SQL语句执行过程中需要的内存(在内存池中申请),包括执行计划、SQL语句和结果缓存。当重复执行相同的SQL语句时,可以直接使用缓冲区保存的这些语句和对应的执行计划,从而提升了SQL语句的执行效率。
重用执行计划由US_PLN_POOL参数控制,该参数是静态参数,参数有以下值。
(1)0:禁止执行计划的重用。
(2)1:启用执行计划的重用功能。
(3)2:对不包含显式参数的语句进行常量参数化优化。
(4)3:即对包含显式参数的语句,也进行常量参数化优化。
可通过设置CACHE_POOL_SIZE参数来控制SQL缓冲区大小,该参数也是静态参数,64位平台下的有效值范围1-67108864MB。
结果集缓存配置由静态参数RS_CAN_CACHE控制,该参数有以下值。
(1)0:禁止重用结果集。
(2)1:强制模式,此时默认缓存所有结果集,但可通过RS_CACHE_TABLES参数和HINT语句进行手动设置。
(3)2:手动模式此时默认不缓存结果集,但可通过HINT语句对必要的结果集进行缓存。
结果集缓存包括SQL查询结果集缓存和DMSQL程序函数结果集缓存,仅档参数RS_CAN_CACHE=1且USE_PLN_POOL!=0时,DM实例才会缓存结果集。
可以设置CTL_CACHE_TABLES参数来控制单独对哪些表的结果集进行缓存,当RS_CAN_CACHE=1时,只有查询涉及的所有基表全部在此参数指定范围内,该查询才会缓存结果集。当参数值为空串时,此参数失效。
可以通过V$SQLTEXT视图查看缓冲区中的SQL语句信息。在启用执行计划重用的情况下(即USE_PLN_POOL!=0),还可以通过以下试图查询。
(1)V$SQL_PLAN:显示缓冲区中的执行计划信息。
(2)V$CACHEITEM:显示缓冲区中缓冲项的相关信息。
(3)V$CACHERS:显示结果集缓冲区的相关信息。
(4)V$CACHESQL:显示SQL缓冲区中SQL语句的信息。

3.3 排序区

排序区提供数据排序所需要的内存空间。在SQL语句需要进行排序时,所使用的内存就是排序区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
在dm.ini中有如下参数与排序区有关。
SORT_BUF_SIZE=36#兆字节的最大排序缓冲区大小。
SORT_BLK_SIZE=1#兆字节的最大排序分片空间大小。
SORT_BUF_GLOBAL_SIZE#兆字节的最大全局排序缓冲区大小。
SORT_FLAG=0#选择排序的方法。

3.4 哈希区

达梦数据库为哈希连接设定的缓冲区,该缓冲区是虚拟缓冲区,在系统中没有真正创建特定哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。若计算出的数据量大小超过了哈希缓冲区的大小,则使用外存哈希方式;若没有超过哈希缓冲区的大小,则还是使用内存池来进行哈希操作。
配置文件dm.ini中与哈希区有关的参数如下。
HJ_BUF_GLOBAL_SIZE=500#所有哈希连接操作符的兆字节的最大哈希缓存大小
HJ_BUF_SIZE=50#单个哈希连接操作符的兆字节的最大缓存大小
HJ_BLK_SIZE=1#哈希连接操作符每次分配的兆字节的哈希缓存大小

3.5 SSD缓存区

固态硬盘(SSD)采用闪存作为存储介质,因没有机械磁头的寻道时间,在读写效率上比机械磁盘更具有优势。达梦数据库可以将SSD文件作为内存缓存与普通磁盘之间的缓冲层,称为SSD缓冲区。
默认情况下SSD缓冲区是关闭的,如果要启用该功能,需要在dm.ini中设置如下参数。
(1)SSD_BUF_SIZE:静态参数,SSD缓冲区大小,取值范围0-4294967294MB,0表示关闭。
(2)SSD_FILE_PATH:静态参数,SSD缓冲文件所在的文件夹路径,要保证其在SSD分区上。
(3)SSD_REF_BUF_SIZE:静态参数,SSD缓冲区专用BUF大小,SSD_BUF_SIZE不为0时有效,有效值范围为20-4096MB。
(4)SSD_FLUSH_INTERVAL:静态参数,SSD缓存刷盘向前页数,有效值范围为10-100000个。
启用SSD缓冲区,SSD_BUF_SIZE设置为大于0的值,并指定SSD_FILT_PATH即可。

4 线程说明

达梦数据库使用的是单进程、多线程结构。DM实例由内存结构和一系列的线程组成,这些线程分别处理不同的任务。
达梦数据库的数据库线程主要包括监听线程、I/O线程、工作线程、调度线程、日志线程,可以通过动态性能视图查看线程的相关信息。主要有以下4个视图。
(1)V$LATCHES:查看正在等待的线程信息。
(2)V$THREADS:查看当前系统中所有活动线程的信息。
(3)V$WTHRD_HISTORY:记录自数据库启动以来,所有活动线程的相关历史信息。
(4)V$PROCESS:查看当前数据库进程信息。

4.1 监听线程

监听线程(dm_lsnr_thd)循环监听服务器端口,当发现有客户端的连接请求时,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务序列,等待工作线程进行处理。监听线程的优先级要比普通线程高,从而保障了大量连接时实例的响应时间。

4.2 工作线程

工作线程(dm_wrkgrp_thd)是实例的核心线程,他从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
初始工作线程数量由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保证每个会话都有专门的工作线程处理请求。为了保证所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。
当会话连接超过预设的阈值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列;等待工作线程一旦空闲,便从任务队列依次摘取请求任务处理。
在dm.ini文件中,与工作线程有关的参数如下。
WORKEER_THREADS=16#工作线程的数量
TASK_THREADS=16#任务线程的数量
UTHR_FLAG=0#用户线程标志
SPIN_TIME=4000#线程的工作时间(以微秒为单位)
WORK_THRD_STACK_SIZE=1024#工作线程的堆大小(以千字节为单位)
WORKER_CPU_PERCENT=0#工作线程专用CPU的百分比

4.3 I/O线程

I/O线程(dm_io_thd)主要处理数据页的读写操作,主要有以下3种情况。
(1)需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区。
(2)缓冲区满或系统关闭时,需要将部分脏数据页写入磁盘。
(3)检查点到来时,需要将所有脏数据页写入磁盘。
I/O线程在启动后,通常都处于睡眠状态,当实例需要进行I/O操作时,会发出一个I/O请求,此时I/O线程被唤醒并处理该请求,在完成该I/O操作后继续进入睡眠状态。
I/O线程处理I/O的策略根据操作系统的不同而不同。一般情况下,I/O线程使用异步I/O将数据页写入磁盘,此时,实例将所有的I/O请求直接递交给操作系统,操作系统在完成这些请求后再通知I/O线程。如果操作系统不支持异步I/O,那么I/O线程就需要完成实际的I/O操作。
在dm.ini中,与I/O线程有关的参数如下。
DIRECT_IO=0#I/O模式的标志(仅非Windows系统),0:使用文件系统缓存;1:不使用文件系统缓存
IO_THR_GROUPS=2#I/O线程组的数量(仅非Windows系统)
HIO_THR_GROUPS=2#HUGE缓冲区中线程组的数量(仅非Windows系统)
FAST_EXTEND_WITH_DS=1#如何扩展文件的大小(仅非Windows系统),0:Extend File使用孔扩展文件,1:使用磁盘空间扩展文件

4.4 调度线程

调度线程(dm_sched_thd)接管实例中所有需要定时调度的任务。调度线程每秒钟轮询一次,主要负责如下任务。
(1)检查系统级的时间触发器,如果满足触发条件则生成任务,将其加到工作线程的任务队列由工作线程执行。
(2)清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项。
(3)检查数据重演的捕获持续时间是否到期,到期则自动停止捕获。
(4)执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池。
(5)自动执行检查点。为了保证日志的及时刷盘、减少系统故障的恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作。
(6)会话超时检测。当对客户连接设置了连接超时时,定期检测连接是否超时,若超时则自动断开连接。
(7)必要时执行数据更新页刷盘。
(8)唤醒等待的工作线程。

4.5 日志FLUSH线程

数据库事务在运行时会往日志缓冲区中写入REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷必须在数据页刷盘之前进行。因此在事务提交或者执行检查点时,实例会通知FLUSH线程(dm_redolog_thd)进行日志刷盘。
为了保障恢复的一致性,REDO日志必须顺序写入,因此REDO日志的写入效率比数据页分散I/O写入效率高。日志FLUSH线程和I/O现成分开,能获得更快地响应速度,保证整体的性能。
如果实例配置了实时归档,那么在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果实例配置了本地归档,那么生成归档任务,通过日志归档线程完成。

https://eco.dameng.com

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服