达梦数据库体系结构

1.逻辑存储结构:

数据库为所有对象分配逻辑空间,并存放在数据文件中,文件组合在一起被划分到一个或者多个表空间中。表空间被进一步划分为段、簇和页(也称块)数据库由一个或多个表空间组成;

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

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

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

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

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

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

SYSTEM表空间存放了有关DM数据库的字典信息,用户不能在SYSTEM表空间创建表和索引 SYS、SYSSSO、SYSAUDITOR系统用户,默认的用户表空间是SYSTEM

ROLL表空间完全由DM数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。MAIN表空间在初始化库的时候,就会自动创建一个大小为128M的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间 SYSDBA的默认表空间为MAIN

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

HMAIN表空间属于HTS表空间,完全由DM数据库自动维护,用户无需干涉。当用户在创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。与普通的表空间不同,并非通过段、簇、页来管理,HUGE 表空间是通过 HFS 存储机制来管理的 创建一个 HTS,其实就是创建一个空的文件目录

SELECT * FROM V$TABLESPACE;

SELECT * FROM V$HUGE_TABLESPACE;

页:

数据库表中的每一行是一条记录,由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此DM规定每条记录的总长度不能超过页面大小的一半。一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。

页头控制信息包含了关于页类型、页地址等信息。页的中部存放数据,为了更好地利用数据页,在数据页的尾部专门留出一部分空间用于存放行偏移数组,行偏移数组用于标识页上的空间占用情况以便管理数据页自身的空间。

FILLFACTOR是DM数据库提供的一个与性能有关的数据页级存储参数,创建表/索引时可以指定,指定数据页中的可用空间百分比(FILLFACTOR)和可扩展空间百分比(100-FILLFACTOR)。

簇:

和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。

段:

同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的16或者32个数据页。

2.物理结构

典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等,

配置文件:

dm.ini

每创建一个实例,会自动生成一个。是启动所必须的配置文件,该文件可以设置各种功能和性能选项。某参数值设置为非法值时,与参数类型不兼容,则参数实际取默认值。

参数属性分为三种:

静态(可以被动态修改,重启才能生效。调用系统过程SP_SET_PARA_VALUE()、SP_SET_PARA_DOUBLE_VALUE()和SP_SET_PARA_STRING_VALUE()对参数值进行修改)、

动态(修改后即时生效)

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

dmmal.ini

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

dmarch.ini

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

dm_svc.conf

DM安装时生成一个配置文件dm_svc.conf

sqllog.ini

sqllog.ini用于sql日志的配置

dmrep.ini

dmrep.ini用于配置复制实例

dmllog.ini

dmllog.ini用于配置逻辑日志

dmtimer.ini

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

控制文件

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

数据库名称;

数据库服务器模式;

OGUID 唯一标识;

数据库服务器版本;

数据文件版本;

数据库的启动次数;

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

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

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

数据文件

数据文件按数据组织形式,可以分为如下几种:

行存储数据,也是应用最广泛的存储形式,其数据是按B树索引组织的。普通表、分区表、B树索引的物理存储格式都是B树。

堆表数据

堆表的数据是以挂链形式存储的,一般情况下,支持最多128个链表,一个链表在物理上就是一个段,堆表采用的是物理rowid,在插入过程中,rowid在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高,且由于rowid是即时生成,无需保存在物理磁盘上,也节省了空间。

列存储数据

数据按列方式组织存储,包含每个列对应的存放列数据的一系列数据文件,以及存放列数据控制信息的辅助表。读取列数据时,只需要顺序扫描列数据文件和辅助表数据。在某些特殊应用场景下,其效率要远远高于行存储。

位图索引

位图索引与B树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。

ROLL文件

ROLL 表空间的dbf文件,称为ROLL文件。ROLL文件用于保存系统的回滚记录,提供事务回滚时的信息

TEMP 文件

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

重做日志文件

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

归档日志文件

当产生检查点时,系统将系统缓冲区中的日志和脏数据页都写入磁盘,以保证当前日志所“保护”的数据页都已安全写入磁盘,这样日志文件即可被安全重用。

物理逻辑日志文件

当开启记录物理逻辑日志的功能时,这部分日志内容会被存储在重做日志文件中。

备份文件

备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。

跟踪日志文件

用户在dm.ini中配置SVR_LOG和SVR_LOG_SWITCH_COUNT参数后就会打开跟踪日志。以“dmsql_实例名_日期_时间”命名,默认生成在DM安装目录的log子目录下面,管理员可通过ini参数SVR_LOG_FILE_PATH设置其生成路径。跟踪日志内容包含系统各会话执行的SQL语句、参数信息、错误信息等。打开跟踪日志会对系统的性能会有较大影响。若需要跟踪日志但对日志的实时性没有严格的要求,又希望系统有较高的效率,可以设置参数SQL_TRACE_MASK和SVR_LOG_MIN_EXEC_TIME 只记录关注的相关记录,减少日志总量;设置参数SVR_LOG_ASYNC_FLUSH打开SQL日志异步刷盘提高系统性能。

事件日志文件

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

数据重演文件

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

3.内存结构

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

共享内存池

系统在运行过程中需要申请内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。可以通过DM Server的配置文件(dm.ini)来对共享内存池的大小进行设置,共享池的参数为MEMORY_POOL,该配置默认为200M。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展,INI参数MEMORY_EXTENT_SIZE指定了共享内存池每次扩展的大小,参数MEMORY_TARGET则指定了共享内存池扩展到超过该值后,空闲时会收缩到的大小。

运行时内存池

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

数据缓冲区

将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。设定得太小,会导致缓冲页命中率低,磁盘IO频繁。

数据缓冲区存在三条链来管理被缓冲的数据页,一条是“自由”链,用于存放目前尚未使用的内存数据页,一条是“LRU”链,用于存放已被使用的内存数据页(包括未修改和已修改),还有一条即为“脏”链,用于存放已被修改过的内存数据页。

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

四种类型的数据缓冲区,分别是NORMAL、KEEP、FAST和RECYCLE。

用户可以在创建表空间或修改表空间时,指定表空间属于NORMAL或KEEP缓冲区。RECYCLE缓冲区供临时表空间使用,FAST缓冲区根据用户指定的FAST_POOL_PAGES大小由系统自动进行管理,用户不能指定使用RECYCLE和FAST缓冲区的表或表空间。

NORMAL缓冲区主要是提供给系统处理的一些数据页,没有特定指定缓冲区的情况下,默认缓冲区为NORMAL;KEEP的特性是对缓冲区中的数据页很少或几乎不怎么淘汰出去,主要针对用户的应用是否需要经常处在内存当中,如果是这种情况,可以指定缓冲区为KEEP。

DM Server提供了可以更改这些缓冲区大小的参数,用户可以根据自己应用需求情况,指定dm.ini文件中BUFFER(100MB)、KEEP(8MB)、RECYCLE(64MB)、FAST_POOL_PAGES(3000)值(括号中为默认值),这些值分别对应是NORMAL缓冲区大小、KEEP缓冲区大小、RECYCLE缓冲区大小、FAST缓冲区数据页总数。

读多页:在需要进行大量I/O的应用当中,DM之前版本的策略是每次只读取一页。如果知道用户需要读取表的大量数据,当读取到第一页时,可以猜测用户可能需要读取这页的下一页,在这种情况下,一次性读取多页就可以减少I/O次数,从而提高了数据的查询、修改效率。

DM Server提供了可以读取多页的参数,用户可以指定这些参数来调整数据库运行效率的最佳状态。在DM配置文件dm.ini中,可以指定参数MULTI_PAGE_GET_NUM大小(默认值为1页),来控制每次读取的页数。

如果用户没有设置较适合的参数MULTI_PAGE_GET_NUM值大小,有时可能会给用户带来更差的效果。如果MULTI_PAGE_GET_NUM太大,每次读取的页可能大多都不是以后所用到的数据页,这样不仅会增加I/O的读取,而且每次都会做一些无用的I/O,所以系统管理员需要衡量好自己应用需求,给出最佳方案。

日志缓冲区

日志缓冲区是用于存放重做日志的内存缓冲区。避免直接磁盘IO使性能受影响,运行中产生的日志不会立即写入磁盘,而是和数据页一样,先将其放到日志缓冲区中。为何不在数据缓冲区中缓存重做日志?

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

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

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

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

字典缓冲区

字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。DM8采用的是将部分数据字典信息加载到缓冲区中,并采用LRU算法进行字典信息的控制。参数为DICT_BUF_SIZE,默认的配置大小为5M。分区数较多的水平分区表,例如上千个分区,那么就需要适当调大DICT_BUF_SIZE参数值。

SQL缓冲区

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

反复执行相同SQL语句,可以使用缓冲区保存这些语句和执行计划,这就是计划重用。参数为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时,该结果集才可能被客户端缓存。

排序区

排序缓冲区提供数据排序所需要的内存空间。参数SORT_BUF_SIZE在DM配置文件dm.ini中,由系统内部排序算法和排序数据结构决定,建议使用默认值2M。

哈希区

DM8提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。参数HJ_BUF_SIZE来进行控制,由于该值的大小可能会限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。创建哈希表个数的初始化参数,其中,HAGR_HASH_SIZE表示处理聚集函数时创建哈希表的个数,建议保持默认值100000。

3.DM进程

DM进程中主要包括监听线程、IO线程、工作线程、调度线程、日志线程等。

监听线程

它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。对于数据守护、DMDSC、MPP和DMTDD等分布式数据库中各实例节点之间的通信,发起连接的节点也由操作系统自动分配端口,所以配置主备/DSC/MPP/TDD时,除了各实例指定的端口外,发起连接的实例也会有操作系统自动分配的用于和其他实例进行通信的端口。

工作线程

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

IO线程

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

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

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

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

IO线程的个数是可配置的,可以通过设置dm.ini文件中的IO_THR_GROUPS参数来设置,默认情况下,IO线程的个数是2个。

调度线程

调度线程每秒钟轮询一次,负责的任务有以下一些:

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

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

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

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

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

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

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

唤醒等待的工作线程。

日志FLUSH线程

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

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

日志归档线程

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

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

日志APPLY线程

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

定时器线程

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

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

逻辑日志异步归档;

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

作业调度。

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

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

逻辑日志归档线程

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

本地逻辑日志归档线程

本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。

远程逻辑日志归档线程

远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。任务的类型包括同步发送和异步发送。

MAL系统相关线程

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

其他线程

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

线程信息的查看

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

V$LATCHES    记录当前正在等待的线程信息

V$THREADS   记录当前系统中活动线程的信息

V$WTHRD_HISTORY 记录自系统启动以来,所有活动过线程的相关历史信息。

V$PROCESS      记录服务器进程信息

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值