一、 概述
DM8达梦数据库包含实例和数据库两部分。
实例一般是由一组正在运行的 DM 后台进程/线程(监听线程、工作线程、IO线程、调度线程、日志线程等其他线程)以及一个大型的共享内存(内存池、缓冲区、排序区、哈希区等)组成。
数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。
二、 DM逻辑存储结构
达梦数据库存储结构和MySQL类似,除列数据外,表空间(Tablespace)都使用段、簇、和页分层的逻辑存储结构进行管理,这样作最大的好处就是高效地控制磁盘空间的利用率。表空间由一个或多个数据文件组成,创建表空间时制定或者后续添加。
以下是这些数据结构的图解。可以看出,在 DM8 中存储的层次结构如下:
(1)数据库由一个或多个表空间组成;
(2)每个表空间由一个或多个数据文件组成;
(3)每个数据文件由一个或多个簇组成;
(4)段是簇的上级逻辑单元,一个段可以跨多个数据文件;
(5)簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
(6)页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
段(seg)
段是簇的上级逻辑单元。特性就是一个段只能属于一个表空间,但是可以跨多个数据文件。
数据段:可以被定义成特定对象的数据结构,如表数据段、索引数据段、LOB数据段等。表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储。
回滚段:保存了对象在事务中操作的信息,所有对象的回滚段都在回滚表空间中。用于回滚还原数据以及保证多事务并发时的读一致性。
临时段:在 DM 数据库中,所有的临时段都创建在临时表空间中,这样可以分流磁盘设备的 I/O, 也可以减少由于在 SYSTEM 或其他表空间内频繁创建临时数据段而造成的碎片。
簇(extent)
簇由磁盘上的连续页组成,一个簇只能在一个数据文件中
簇可以由同一个数据文件中的16、32、64个连续数据页组成,默认为16,。
页(page)
页是数据库最小的分配单元,也是数据库中使用最小的IO单元。数据页是最小的的数据存储单元,页大小可以为4KB,8KB,16KB,32KB,默认大小为8KB。数据库页一旦创建好了数据库并且指定了大小,则在数据库的整个生命周期内,页大小都不能够改变!!!
行存储表
有两种组织方式,分别为B树和堆表,其中B树使用最为广泛,包括MySQL也在使用B树来存储。他的特点就是只在叶子结点存储数据,中间节点存储分支信息。这样存储大大减少了查询的时间;堆表的数据是以挂链形式存储的,一般情况下,支持最多128个链表,每个链表都使 用一个独立的数据段。 l 也可以将堆表的链表视为“扁平B树”,在系统中描述其的内存结构就是B树的描述结 构,链表中的数据页都是叶子数据页。
行存储数据结构补充:首先行存储的数据存放在数据页中,记录的长度有限制。大字段的数据可能会导致记录长度超长。表中如果存储有大字段(BLOB、CLOB)数据,则会在其所在的表空间内另外分配一 个LOB段来存储大字段数据。如果大字段的数据无法在行内存储,则转为行外存储,其行内存放真实数据的指针。
列存储
列存储的查询大幅减少IO和增删改代价大使得诞生该存储方式是为了OLAP/数据仓库等查询密集型应用。
列存数据表根据固定的记录行数将数据划分为不同的数据区(Section)
数据区的大小在创建列存表时指定,区的大小必须是2的多少次方。默认值为65536行
事务型列存表:4个辅助表:$AUX : 数据区信息、 $RAUX :插入的未满区的数据、$DAUX :删除的数据、$UAUX :更新的数据。插入新数据时,如果当前插入的数据未满一个区,则先插入到RAUX表中,待后续插入填满后再移到列存文件中;修改和删除数据时,直接将信息记录到UAUX和DAUX表中,不直接修改列存文件的数据。
非事务型列存表:只有一个辅助表,$AUX来存储数据区信息,每次修改都直接修改列存储数据文件。
三、 DM物理存储结构
典型的物理存储结 构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际 数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志 文件等,如下图所示。
配置文件、数据文件、控制文件、重做日志文件、归档日志文件、逻辑日志文件、物理逻辑日志文件、备份文件、SQL日志文件和事件日志文件。
配置文件(.ini):
1、DM 数据库服务配置
dm.ini:每创建一个 DM 数据库,就会自动生成 dm.ini 文件。dm.ini 是 DM 数据库启动所必须 的配置文件,通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项,主要的配 置模块包括:控制文件相关、实例名、内存相关、线程相关等。
dmmal.ini:dmmal.ini 是 MAL 系统的配置文件。
dmarch.ini:dmarch.ini 用于本地归档和远程归档。
dm_svc.conf:dm_svc.conf 是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能 生效。
sqllog.ini:sqllog.ini用于SQL日志的配置,当且仅当INI参数SVR_LOG=1时使用。 如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过程SP_REFRESH_SVR_LOG_CONFIG() 就会生效。
2、复制配置
dmrep.ini 用于配置复制实例
dmllog.ini 用于配置逻辑日志
dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。
四、 DM内存结构
内存池
DM Server 的内存池包括共享内存池和其他一些运行时内存池。
1、共享内存池:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过 程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归 还给共享内存池。
2、运行时内存池:除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。 这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存 池、虚拟机内存池等。
缓冲区
写入磁盘的“中专站”,包括数据缓冲区、日志缓冲区、字典缓冲区和SQL缓冲区。
排序区
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排 序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
哈希区
DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚 拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对 排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。
五、 管理DM线程
DM 进程中主要包括监听线程、工作线程、IO 线程、调度线程、日志线程等
1、监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监 听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。
2、工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
3、三种时机需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区; 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;检查点到来时,需要将所有脏数据页写入磁盘。
4、调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次。
5、日志 FLUSH 线程,任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO 日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的 REDO 日志保留在日志缓 冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘。
6、日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由 日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取 出任务,按照归档类型做相应归档处理。
7、日志 APPLY 线程,当服务器作为备库时,每 次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务 队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一 致,作为主库的一个镜像。
8、定时器线程:在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如 备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。
9、逻辑日志归档线程:本地逻辑日志归档线程和远程逻辑日志归档线程。
逻辑日志归档用于 DM8 的数据复制中,目的是为了加快异地访问的响应速度,包含本地 逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。
达梦社区地址 https://eco.dameng.com
文章
阅读量
获赞