DM达梦数据库体系结构

1 DM逻辑结构概述

1.1 数据库和实例

在DM7之前版本的DM数据库中,“数据库”和“实例”这两个术语经常可以互相替换,意义也很相近。在DM7以及之后版本的数据库中,“数据库”和“实例”这两个概念之间有着很大的差别,甚至可以说它们是两个完全不同的实体。

1.1.1 数据库

在单独提到DM数据库时,可能指的是DM数据库产品,也有可能是正在运行的DM数据库实例,还可能是DM数据库运行中所需的一系列物理文件的集合等。但是,当同时出现DM数据库和实例时,DM数据库指的是磁盘上存放在DM数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。

1.1.2 实例

实例一般是由一组正在运行的DM后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作DM数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。

在任何时候,一个实例只能与一个数据库进行关联(装载、打开或者挂起数据库)。在大多数情况下,一个数据库也只有一个实例对其进行操作,即数据库与实例是一对一的关系。但是在DM共享存储集群(DMDSC)中,多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。此时,数据库与实例则是一个一对多的关系,我们可以同时从多台不同的计算机访问这个数据库。

1.2 DM逻辑存储结构

DM数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在DM数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。通过这种细分,可以使得DM数据库能够更加高效地控制磁盘空间的利用率。图1.1显示了这些数据结构之间的关系。

图1.1 显示表空间、数据文件、段、簇、页的关系

可以看出,在DM8中存储的层次结构如下:

  1. 数据库由一个或多个表空间组成;

  2. 每个表空间由一个或多个数据文件组成;

  3. 每个数据文件由一个或多个簇组成;

  4. 段是簇的上级逻辑单元,一个段可以跨多个数据文件;

  5. 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;

  6. 页是数据库中最小的分配单元,也是数据库中使用的最小的IO单元。

1.2.1 表空间

在DM数据库中,表空间由一个或者多个数据文件组成。DM数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。

在创建DM数据库时,会自动创建5个表空间:SYSTEM表空间、ROLL表空间、MAIN表空间、TEMP表空间和HMAIN表空间。

  1. SYSTEM表空间存放了有关DM数据库的字典信息,用户不能在SYSTEM表空间创建表和索引。

  2. ROLL表空间完全由DM数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。

  3. MAIN表空间在初始化库的时候,就会自动创建一个大小为128M的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间。

  4. TEMP表空间完全由DM数据库自动维护。当用户的SQL语句需要磁盘空间来完成某个操作时,DM数据库会从TEMP表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL语句中间结果集以及用户创建的临时表等都会使用到TEMP表空间。

  5. HMAIN表空间属于HTS表空间,完全由DM数据库自动维护,用户无需干涉。当用户在创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。

1.2.2 记录

数据库表中的每一行是一条记录。在DM中,除了Huge表,其他的表都是在数据页中按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是DM数据库的存储单位,页才是。由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此DM规定每条记录的总长度不能超过页面大小的一半。

1.2.3 页

数据页(也称数据块)是DM数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在DM数据库中,页大小可以为4KB、8KB、16KB或者32KB,用户在创建数据库时可以指定,默认大小为8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。

1.2.4 簇

簇是数据页的上级逻辑单元,由同一个数据文件中16个或32个或64个连续的数据页组成。在DM数据库中,簇的大小由用户在创建数据库时指定,默认大小为16。假定某个数据文件大小为32MB,页大小为8KB,则共有32MB/8KB/16=256个簇,每个簇的大小为8K*16=128K。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。

1.2.5 段

段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的16或者32个数据页。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。

2 DM 物理存储结构

DM数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等,如图2.1所示。

图2.1 DM物理存储结构示意图

2.1 配置文件

配置文件是DM数据库用来设置功能选项的一些文本文件的集合,配置文件以ini为扩展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的目标:

  1. 启用/禁用特定功能项;

  2. 针对当前系统运行环境设置更优的参数值以提升系统性能。

1) dm.ini

每创建一个DM数据库,就会自动生成dm.ini文件。dm.ini是DM数据库启动所必须的配置文件,通过配置该文件可以设置DM数据库服务器的各种功能和性能选项。

当dm.ini中的某参数值设置为非法值时,若设置值与参数类型不兼容,则参数实际取值为默认值;若设置值小于参数取值范围的最小值,则实际取值为最小值;若设置值大于参数取值范围的最大值,则实际取值为最大值。

参数属性分为三种:静态、动态和手动。静态,可以被动态修改,修改后重启服务器才能生效。

动态,可以被动态修改,修改后即时生效。动态参数又分为会话级和系统级两种。会话级参数被修改后,新参数值只会影响新创建的会话,之前创建的会话不受影响;系统级参数的修改则会影响所有的会话。

手动,不能被动态修改,必须手动修改dm.ini参数文件,然后重启才能生效。

动态修改是指DBA用户可以在数据库服务器运行期间,通过调用系统过程SP_SET_PARA_VALUE()、SP_SET_PARA_DOUBLE_VALUE()和SP_SET_PARA_STRING_VALUE()对参数值进行修改。

2) dmmal.ini

dmmal.ini是MAL系统的配置文件。需要用到MAL环境的实例,所有站点dmmal.ini需要保证严格一致。

3) dmarch.ini

dmarch.ini用于本地归档和远程归档。

4) dm_svc.conf

DM安装时生成一个配置文件dm_svc.conf,不同的平台所在目录有所不同。dm_svc.conf文件中包含DM各接口及客户端需要配置的一些参数,

5) sqllog.ini

sqllog.ini用于sql日志的配置,当且仅当INI参数SVR_LOG=1时使用。

如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过程SP_REFRESH_SVR_LOG_CONFIG() 就会生效。

2.1.2 复制配置

1) dmrep.ini

dmrep.ini用于配置复制实例。

2) dmllog.ini

dmllog.ini用于配置逻辑日志。

3) dmtimer.ini

dmtimer.ini用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。

2.2 控制文件

每个DM数据库都有一个名为dm.ctl的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:

  1. 数据库名称;

  2. 数据库服务器模式;

  3. OGUID 唯一标识;

  4. 数据库服务器版本;

  5. 数据文件版本;

  6. 数据库的启动次数;

  7. 数据库最近一次启动时间;

  8. 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;

  9. 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。

2.3 数据文件

数据文件以dbf为扩展名,它是数据库中最重要的文件类型,一个DM数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。

当DM的数据文件空间用完时,它可以自动扩展。可以在创建数据文件时通过MAXSIZE参数限制其扩展量,当然,也可以不限制。但是,数据文件的大小最终会受物理磁盘大小的限制。在实际使用中,一般不建议使用单个巨大的数据文件,为一个表空间创建多个较小的数据文件是更好的选择。

数据文件中还有两类特殊的数据文件:ROLL和TEMP文件。

1)ROLL文件

ROLL 表空间的dbf文件,称为ROLL文件。ROLL文件用于保存系统的回滚记录,提供事务回滚时的信息。回滚文件可被分为若干回滚段,每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。

2)TEMP 文件

TEMP.DBF 临时数据文件,临时文件可以在dm.ini中通过TEMP_SIZE配置大小。

当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在TEMP.DBF文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。

2.4 重做日志文件

重做日志(即REDO日志)指在DM数据库中添加、删除、修改对象,或者改变数据,DM都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以log为扩展名。每个DM数据库实例必须至少有2个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。

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

重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启DM实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。

2.5 归档日志文件

日志文件分为联机日志文件和归档日志文件。DM数据库可以在归档模式和非归档模式下运行。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。

2.6 逻辑日志文件

如果在DM数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式,且不在第一章所述的页,簇和段的管理之下。

2.7 物理逻辑日志文件

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

要开启物理逻辑日志的功能,需要满足下面两个条件:

首先,要设置RLOG_APPEND_LOGIC为1、2或者3;

其次,通过设置参数RLOG_IGNORE_TABLE_SET=1或者建表(或修改表)时指定ADD LOGIC LOG开启。如果需要记录所有表的物理逻辑日志,设置INI参数RLOG_IGNORE_TABLE_SET为1即可;如果只需要记录某些表的物理逻辑日志,设置INI参数RLOG_IGNORE_TABLE_SET为0,并在建表或者修改表的语法中使用ADD LOGIC LOG。

2.8 备份文件

备份文件以bak为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。然而,从来没有哪个数据库系统能够保证永远正确无误地运行,当数据库不幸出现故障时,备份文件就显得尤为重要了。

当客户利用管理工具或直接发出备份的 SQL命令时,DM Server会自动进行备份,并产生一个或多个备份文件,备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。同时,系统还会自动记录备份信息及该备份文件所处的位置,但这种记录是松散的,用户可根据需要将其拷贝至任何地方,并不会影响系统的运行。

2.9 跟踪日志文件

用户在dm.ini中配置SVR_LOG和SVR_LOG_SWITCH_COUNT参数后就会打开跟踪日志。跟踪日志文件是一个纯文本文件,以“dmsql_实例名_日期_时间”命名,默认生成在DM安装目录的log子目录下面,管理员可通过ini参数SVR_LOG_FILE_PATH设置其生成路径。

跟踪日志内容包含系统各会话执行的SQL语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的SQL语句,进而对其进行优化。

2.10 事件日志文件

DM数据库系统在运行过程中,会在log子目录下产生一个“dm_实例名_日期”命名的事件日志文件。事件日志文件对DM数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、IO错误等一些致命错误。事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志文件随着DM数据库服务的运行一直存在。

事件日志文件打印的是中间步骤的信息,所以出现部分缺失属于正常现象。

2.11 数据重演文件

调用系统存储过程SP_START_CAPTURE和SP_STOP_CAPTURE,可以获得数据重演文件。重演文件用于数据重演,存储了从抓取开始到抓取结束时,DM数据库与客户端的通信消息。使用数据重演文件,可以多次重复抓取这段时间内的数据库操作,为系统调试和性能调优提供了另一种分析手段。

3 DM 内存结构

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

  1. 申请、释放内存效率更高;

  2. 能够有效地了解内存的使用情况;

  3. 易于发现内存泄露和内存写越界的问题。

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

3.1 内存池

DM Server的内存池包括共享内存池和其他一些运行时内存池。

动态视图V$MEM_POOL详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握DM Server的内存使用情况。

3.1.1 共享内存池

共享内存池是DM Server在启动时从操作系统申请的一大片内存。在DM Server的运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。

3.1.2 运行时内存池

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

3.2 缓冲区

3.2.1 数据缓冲区

数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。这是DM Server至关重要的内存区域之一,将其设定得太小,会导致缓冲页命中率低,磁盘IO频繁;将其设定得太大,又会导致操作系统内存本身不够用。

系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。

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

3.2.2 日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?主要是基于以下原因:

  1. 重做日志的格式同数据页完全不一样,无法进行统一管理;

  2. 重做日志具备连续写的特点;

  3. 在逻辑上,写重做日志比数据页IO优先级更高。

DM Server提供了参数RLOG_BUF_SIZE对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为2的N次方,否则采用系统默认大小512页。

3.2.3 字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率,如进行查询语句,就需要相应的表信息、列信息等,这些字典信息如果都在缓冲区里,则直接从缓冲区中获取即可,否则需要I/O才能读取到这些信息。

DM8采用的是将部分数据字典信息加载到缓冲区中,并采用LRU算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为DICT_BUF_SIZE,默认的配置大小为5M。

3.2.4 SQL缓冲区

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

很多应用当中都存在反复执行相同SQL语句的情况,此时可以使用缓冲区保存这些语句和它们的执行计划,这就是计划重用。这样带来的好处是加快了SQL语句执行效率,但同时给内存也增加了压力。

DM Server在配置文件dm.ini提供了参数来支持是否需要计划重用,参数为USE_PLN_POOL,当指定为非0时,则启动计划重用;为0时禁止计划重用。DM同时还提供了参数CACHE_POOL_SIZE(单位为MB),来改变SQL缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为20M。

3.3 排序区

排序缓冲区提供数据排序所需要的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。

DM Server提供了参数来指定排序缓冲区的大小,参数SORT_BUF_SIZE在DM配置文件dm.ini中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值2M。

3.4 哈希区

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

DM Server在dm.ini中提供了参数HJ_BUF_SIZE来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。

除了提供HJ_BUF_SIZE参数外,DM Server还提供了创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE表示处理聚集函数时创建哈希表的个数,建议保持默认值100000。

4 管理 DM 线程

DM服务器使用“对称服务器构架”的单进程、多线程结构。这种对称服务器构架在有效地利用了系统资源的同时又提供了较高的可伸缩性能,这里所指的线程即为操作系统的线程。服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。

DM进程中主要包括监听线程、IO线程、工作线程、调度线程、日志线程等,以下分别对它们进行介绍。

4.1 监听线程

 监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。

4.2 工作线程

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

DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。

4.3 IO线程

在数据库活动中,IO操作历来都是最为耗时的操作之一。当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把IO操作从工作线程中分离出来则是明智的做法。IO线程的职责就是处理这些IO操作。

通常情况下,DM Server需要进行IO操作的时机主要有以下三种:

  1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;

  2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;

  3. 检查点到来时,需要将所有脏数据页写入磁盘。

IO线程在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。

4.4 调度线程

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

  1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;

  2. 清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;

  3. 检查数据重演捕获持续时间是否到期,到期则自动停止捕获;

  4. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;

  5. 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作;

  6. 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;

  7. 必要时执行数据更新页刷盘;

  8. 唤醒等待的工作线程。

4.5 日志FLUSH线程

任何数据库的修改,都会产生重做REDO日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知FLUSH线程进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散IO写入效率更高。日志FLUSH线程和IO线程分开,能获得更快的响应速度,保证整体的性能。DM8的日志FLUSH线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。

如果系统配置了实时归档,在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。

4.6 日志归档线程

日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。

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

4.7 日志APPLY线程

在配置了数据守护的系统中,创建了一个日志APPLY线程。当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。

4.8 定时器线程

在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。

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

  1. 逻辑日志异步归档;

  2. 异步归档日志发送(只有在PRIMARY模式下,且是OPEN状态下);

  3. 作业调度。

定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务,如逻辑日志异步归档等。

默认情况下,达梦服务器启动的时候,定时器线程是不启动的。用户可以设置dm.ini中的TIMER_INI参数为1来设置定时器线程在系统启动时启动。

4.9 逻辑日志归档线程

逻辑日志归档用于DM8的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。

4.10 MAL系统相关线程

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

4.11 其他线程

事实上,DM数据库系统中还不止以上这些线程,在一些特定的功能中会有不同的线程,例如回滚段清理PURGE线程、审计写文件线程、重演捕获写文件线程等,这里不一一列出。

4.12 线程信息的查看

为了增加用户对DM数据库内部信息的了解,以及方便数据库管理员对数据库的维护,DM提供了很多动态性能视图,通过它们用户可以直观地了解当前系统中有哪些线程在工作,以及线程的相关信息。

更多达梦资讯请上达梦社区了解 https://eco.dameng.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值