1 DM8逻辑结构
DM8层次结构主要由数据库、表空间、文件、段、簇、页组成。如下图所示。
1、数据库由一个或多个表空间组成;
2、每个表空间由一个或多个数据文件组成;
3、每个数据文件由一个或多个簇组成;
4、段是簇的上级逻辑单元,一个段可以跨多个数据文件;
5、簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
6、页是数据库中最小的分配单元,也是数据库中使用的最小的IO单元。
1.1 表空间
DM数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
数据库创建时,自动生成5个表空间:SYSTEM表空间、ROLL表空间、MAIN表空间、TEMP表空间和HMAIN表空间。
1、SYSTEM表空间存放了有关DM数据库的字典信息,用户不能在SYSTEM表空间创建表和索引。
2、ROLL表空间完全由DM数据库自动维护,用户无需干预。
3、MAIN表空间在初始化库的时候,就会自动创建一个大小为128M的数据文件MAIN.DBF。
4、TEMP表空间完全由DM数据库自动维护。
5、HMAIN表空间属于HTS表空间,完全由DM数据库自动维护,用户无需干涉。
SYATEM、ROLL、MAIN、TEMP查询表空间SQL:
SELECT * FROM V$TABLESPACE;
HMAIN查询SQL:
SELECT * FROM V$HUGE_TABLESPACE;
1.2 记录
数据库表中的每一行代表一条记录。记录不能够跨页存储,这使得记录的长度受数据页的限制。在DM数据库中,记录的总长度不能超过页面的一半。
1.3 页
数据页的格式如下图所示。
数据页(数据块)是DM数据库中最小的数据存储单元。
页大小:可选4KB、8KB(默认)、16KB、32KB
数据库创建好后,页大小不可被改变。
DM数据库为页提供了一个性能相关的存储参数FILLFACTOR。指的是初始化页后插入数据最大可以使用的空间百分比。
可用空间百分比(FILLFACTOR):用来执行更多的INSERT操作,过高频繁I/O操作,导致数据页分裂;较低避免数据页分裂,提升I/O性能,牺牲空间换性能
可扩展空间百分比(100-FILLFACTOR):用来保存一定的数据页空间,防止更新操作增加列和列长度改变导致数据页频繁分裂。
1.4 簇
簇是数据页的上级逻辑单元,由同一个数据文件中16个或32个或64个连续的数据页组成。数据库创建时,默认簇大小16。
数据库创建好后,簇大小不可被改变。DM数据库的簇主要分为分配数据簇、释放数据簇。
1)分配数据簇
当创建表和索引时,DM数据库为表和索引分配至少一个簇。当初始分配簇用完,DM数据库自动扩展。
分配数据簇时,在表空间中,按从小到大顺序数据查找数据文件中空闲簇,然后分配;若没有空闲簇,在个数据文件中查找空闲空间,格式化,再分配簇;若文件没有空闲空间,选一个数据文件进行扩充。
2)释放数据簇
对于用户数据表空间,在用户将一个数据段对应的表/索引对象DROP之前,该表对应的数据段会保留至少1个簇不被回收到表空间中。在删除表/索引对象中的记录的时候,DM数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用。当用户删除了表中所有记录时,DM数据库仍然会为该表保留1-2个簇供后续使用。若用户使用DROP语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。
对于临时表空间,DM数据库会自动释放在执行SQL过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。
对于回滚表空间,DM数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇。
1.5 段
在同一表空间,段可以包含不同文件的簇,即段可以跨越不同的文件。数据段中的簇在磁盘上不一定连续。主要有数据段、临时段、回滚段。
1)数据段
定义表和索引时,创建对应数据段。以簇为数据单位给段分配空间。
2)临时段
临时段用户存储执行语句的中间结果,可以有效的分流I/O,也可以建设SYSTEM或其他表空间内频繁创建临时数据而造成的碎片。
临时段的分配和释放完全由系统自动控制,用户不能手工进行干预。
3)回滚段
回滚段中存储恢复数据库操作的信息,在数据库恢复时,通过回滚记录来对为提交的操作进行回滚。同时,在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询。
DM数据库提供了全自动回滚管理机制来管理回滚信息和回滚空间,自动回滚管理消除了管理回滚段的复杂性。
DM数据库会收集回滚信息的使用情况,并根据统计结果对回滚信息保存周期进行调整,数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长。
2 DM8物理结构
典型的DM8物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等.如下图所示。
2.1 配置文件
配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的目标:
启用/禁用特定功能项;
针对当前系统运行环境设置更优的参数值以提升系统性能。
1)dm.ini
通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项。部分参数如下图所示。
2)dmmal.ini
dmmal.ini 是 MAL 系统的配置文件。需要用到 MAL 环境的实例,所有站点 dmmal.ini 需要保证严格一致。
3)dmarch.ini
dmarch.ini 用于本地归档和远程归档。
4) dm_svc.conf
DM 安装时生成一个配置文件 dm_svc.conf,不同的平台所在目录有所不同。
32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
在 Linux 平台下,此文件位于/etc 目录。
dm_svc.conf 文件中包含 DM 各接口及客户端需要配置的一些参数。查看当前已经配置参数。
dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,可配置表 2.5 中所有的配置项,服务配置区在后,以“[服务名]”开头,可配置除了服务名外的所有配置项。服务配置区中的配置优先级高于全局配置区。
需要说明的是,如果对 dm_svc.conf 的配置项进行了修改,需要重启客户端程序,修改的配置才能生效。
5)sqllog.ini
sqllog.ini 用于 sql 日志的配置,当且仅当 INI 参数 SVR_LOG=1 时使用。
如果在服务器启动过程中,修改了 sqllog.ini 文件。修改之后的文件,只要调用过程 SP_REFRESH_SVR_LOG_CONFIG() 就会生效。
sqllog.ini 中配置块的使用方法:
sqllog.ini 中配置块在 INI 参数 SVR_LOG=1 时使用。且 INI 参数 SVR_LOG_NAME 必须和 sqllog.ini 中的 SVR_LOG_NAME 名称一样,sqllog.ini 配置块才会生效。若 SVR_LOG 为 1,但不存在 sqllog.ini 或 sqllog.ini 配置错误,则配置无效,此时,使用 DM.INI 中的系统默认值。
查看配置信息。
6)dmrep.ini
dmrep.ini 用于配置复制实例。
7)dmllog.ini
dmllog.ini 用于配置逻辑日志。
8)dmtimer.ini
dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。
2.2 控制文件
控制文件以ctl命名,是一个二进制文件,记录数据库必要的初始信息。主要有:
数据库名称;
数据库服务器模式;
OGUID 唯一标识;
数据库服务器版本;
数据文件版本;
数据库的启动次数;
数据库最近一次启动时间;
表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。
2.3 数据文件
数据文件以dbf为后缀,是数据真实存储的地方。DM数据空间用完时,自动扩展。数据文件在物理上按照页、簇和段的方式进行管理。
主要有B树数据、堆表数据、列存储数据、位图索引(包含特殊数据文件ROLL、TEMP)。
2.4 重做日志文件
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件以 log 为扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件主要用于数据库的备份和恢复。存储数据库的事务,以便系统在出现故障和介质故障时能够进行故障恢复。
2.5 归档日志文件
日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下运行。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。
联机文件指的是系统当前正在使用的日志文件。
归档日志文件指的是在归档模式下重做日志被写入日志生成的日志文件。
2.6 逻辑日志文件
若数据库配置复制功能,复制源会产生逻辑日志文件。逻辑日志文件是一个流氏文件,拥有自己的文件格式,段页管理不在逻辑结构中的段页。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。
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 内存结构
数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是DBMS系统所必须的。通常内存管理系统会带来以下好处:
申请、释放内存效率更高;
能够有效地了解内存的使用情况;
易于发现内存泄露和内存写越界的问题。
DM数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
3.1 内存池
DM Server的内存池包括共享内存池和其他一些运行时内存池。
通过动态视图V$MEM_POOL查看内存池状态。
3.1.1 共享内存池
共享内存池是DM Server在启动时从操作系统申请的一大片内存。在DM Server的运行期间,经常会申请与释放小片内存,而向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。采用共享内存池则可一次向操作系统申请一片较大内存,即为内存池,当系统在运行过程中需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
DM系统管理员可以通过DM Server的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为MEMORY_POOL,该配置默认为200M。
3.1.2 运行时内存池
DM Server的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
3.2 缓冲区
3.2.1 数据缓冲区
数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。
系统启动时,首先根据配置的数据缓冲区大小向操作系统申请一片连续内存并将其按数据页大小进行格式化,并置入“自由”链中。数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。
LRU链对系统当前使用的页按其最近是否被使用的顺序进行了排序。这样当数据缓冲区中的自由链被用完时,从LRU链中淘汰部分最近未使用的数据页,能够较大程度地保证被淘汰的数据页在最近不会被用到,减少IO。
1.类别
DM server中有四种数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。
NORMAL:主要提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为NORMAL。
KEEP:是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为KEEP
2. 读多页
DM Server提供了可以读取多页的参数,用户可以指定这些参数来调整数据库运行效率的最佳状态。在DM配置文件dm.ini中,可以指定参数MULTI_PAGE_GET_NUM大小(默认值为1页),来控制每次读取的页数。
如果用户没有设置较适合的参数MULTI_PAGE_GET_NUM值大小,有时可能会给用户带来更差的效果。如果MULTI_PAGE_GET_NUM太大,每次读取的页可能大多都不是以后所用到的数据页,这样不仅会增加I/O的读取,而且每次都会做一些无用的I/O,所以系统管理员需要衡量好自己应用需求,给出最佳方案。
3.2.2 日志缓冲区
日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。那么为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区呢?主要是基于以下原因:
重做日志的格式同数据页完全不一样,无法进行统一管理;
重做日志具备连续写的特点;
在逻辑上,写重做日志比数据页IO优先级更高。
DM Server提供了参数RLOG_BUF_SIZE对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为2的N次方,否则采用系统默认大小512页。
3.2.3 字典缓冲区
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。
DM8采用的是将部分数据字典信息加载到缓冲区中,并采用LRU算法进行字典信息的控制。缓冲区大小设置问题,如果太大,会浪费宝贵的内存空间,如果太小,可能会频繁的进行淘汰,该缓冲区配置参数为DICT_BUF_SIZE,默认的配置大小为5M。
3.2.4 SQL缓冲区
SQL缓冲区提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。
DM Server在配置文件dm.ini提供了参数来支持是否需要计划重用,参数为USE_PLN_POOL,当指定为非0时,则启动计划重用;为0时禁止计划重用。DM同时还提供了参数CACHE_POOL_SIZE(单位为MB),来改变SQL缓冲区大小,系统管理员可以设置该值以满足应用需求,默认值为20M。
结果集缓存包括SQL查询结果集缓存和DMSQL程序函数结果集缓存,在INI参数文件中同时设置参数RS_CAN_CACHE=1且USE_PLN_POOL非0时DM服务器才会缓存结果集。
客户端结果集也可以缓存,但需要在配置文件dm_svc.conf中设置参数:
ENABLE_RS_CACHE = (1) //表示启用缓存;
RS_CACHE_SIZE = (100) //表示缓存区的大小为100M, 可配置为1-65535
RS_REFRESH_FREQ = (30) //表示每30秒检查缓存的有效性,如果失效,自动重查; 0表示不检查。
同时在服务器端使用INI参数文件中的CLT_CACHE_TABLES参数设置哪些表的结果集需要缓存。另外,FIRST_ROWS参数表示当查询的结果达到该行数时,就返回结果,不再继续查询,除非用户向服务器发一个FETCH命令。这个参数也用于客户端缓存的配置,仅当结果集的行数不超过FIRST_ROWS时,该结果集才可能被客户端缓存。
3.3 排序区
排序缓冲区提供数据排序所需要的内存空间。当用户执行SQL语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
DM Server提供了参数来指定排序缓冲区的大小,参数SORT_BUF_SIZE在DM配置文件dm.ini中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排序数据结构决定,建议使用默认值2M。
3.4 哈希区
哈希区是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 监听线程
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。
DM服务器所有配置端口的范围为1024-65534。当客户端工具发起连接时,由操作系统为客户端工具自动分配一个端口用于与DM服务器进行通信。对于数据守护、DMDSC、MPP和DMTDD等分布式数据库中各实例节点之间的通信,发起连接的节点也由操作系统自动分配端口,所以配置主备/DSC/MPP/TDD时,除了各实例指定的端口外,发起连接的实例也会有操作系统自动分配的用于和其他实例进行通信的端口。
4.2 工作线程
工作线程是DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。
4.3 IO线程
IO线程的职责就是处理IO操作。
通常情况下,DM Server需要进行IO操作的时机主要有以下三种:
需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
检查点到来时,需要将所有脏数据页写入磁盘。
IO线程在启动后,通常都处于睡眠状态,当系统需要进行IO时,只需要发出一个IO请求,此时IO线程被唤醒以处理该请求,在完成该IO操作后继续进入睡眠状态。
IO线程的个数是可配置的,可以通过设置dm.ini文件中的IO_THR_GROUPS参数来设置,默认情况下,IO线程的个数是2个。同时,IO线程处理IO的策略根据操作系统平台的不同会有很大差别,一般情况下,IO线程使用异步的IO将数据页写入磁盘,此时,系统将所有的IO请求直接递交给操作系统,操作系统在完成这些请求后才通知IO线程,这种异步IO的方式使得IO线程需要直接处理的任务很简单,即完成IO后的一些收尾处理并发出IO完成通知,如果操作系统不支持异步IO,此时IO线程就需要完成实际的IO操作。
4.4 调度线程
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作;
会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
必要时执行数据更新页刷盘;
唤醒等待的工作线程。
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需要进行定时操作的事件主要有以下几种:
逻辑日志异步归档;
异步归档日志发送(只有在PRIMARY模式下,且是OPEN状态下);
作业调度。
定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务,如逻辑日志异步归档等。
默认情况下,达梦服务器启动的时候,定时器线程是不启动的。用户可以设置dm.ini中的TIMER_INI参数为1来设置定时器线程在系统启动时启动。
4.9 逻辑日志归档线程
逻辑日志归档用于DM8的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。
1. 本地逻辑日志归档线程
本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。
2. 远程逻辑日志归档线程
远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。任务的类型包括同步发送和异步发送。
4.10 MAL系统相关线程
MAL系统是DM内部高速通信系统,基于TCP/IP协议实现。服务器的很多重要功能都是通过MAL系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL系统内部包含一系列线程,有MAL监听线程、MAL发送工作线程、MAL接收工作线程等。
4.11 线程查看
为了增加用户对DM数据库内部信息的了解,以及方便数据库管理员对数据库的维护,DM提供了很多动态性能视图,通过它们用户可以直观地了解当前系统中有哪些线程在工作,以及线程的相关信息。动态性能如下表所示。
名称 说明
V$LATCHES 记录当前正在等待的线程信息
V$THREADS 记录当前系统中活动线程的信息
V$WTHRD_HISTORY 记录自系统启动以来,所有活动过线程的相关历史信息。
V$PROCESS 记录服务器进程信息