文章目录

  • 一、数据库和实例
  • 1.1 数据库
  • 1.2 实例
  • 1.3 两者联系与差异
  • 二、逻辑存储结构
  • 2.1 表空间
  • 2.2 记录
  • 2.3 页
  • 2.4 簇
  • 2.5 段
  • 三、物理存储结构
  • 3.1 配置文件
  • 3.1.1 DM数据库服务配置
  • 3.1.2 复制配置
  • 3.2 控制文件
  • 3.3 数据文件
  • 3.4 重做日志文件
  • 3.5 归档日志文件
  • 3.6 逻辑日志文件
  • 3.7 物理逻辑日志文件
  • 3.8 备份文件
  • 3.9 SQL日志文件
  • 3.10 事件日志文件
  • 3.11 数据重演文件
  • 四、内存结构
  • 4.1 内存池
  • 4.2 缓冲区
  • 4.3 排序区
  • 4.4 哈希区
  • 4.5 SSD缓冲区
  • 五、线程
  • 总结



一、数据库和实例

1.1 数据库

DM数据库指的是磁盘上存放在DM数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。

1.2 实例

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

1.3 两者联系与差异

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


二、逻辑存储结构

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

如图显示了这些数据结构之间的关系。

达梦数据库相比于MySQL数据库效率如何_系统架构

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

  • 数据库由一个或多个表空间组成;
  • 每个表空间由一个或多个数据文件组成;
  • 每个数据文件由一个或多个簇组成;
  • 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
  • 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
  • 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。

2.1 表空间

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

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

达梦数据库相比于MySQL数据库效率如何_DM_02

  • SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。
  • ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
  • MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
  • TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP表空间。
  • HMAIN 表空间属于 HTS 表空间,完全由 DM 数据库自动维护,用户无需干涉。当用户在创建 HUGE 表时,未指定 HTS 表空间的情况下,充当默认 HTS 表空间。

每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。如果用户已指定有默认表空间A,创建表时指定存储在表空间B,则该表数据及表上索引在默认情况下将存储在表空间B中,但用户默认表空间仍为A。

用户可以通过执行如下语句来查看表空间相关信息。
SYSTEM、ROLL、MAIN 和 TEMP 表空间查看语句:

SELECT * FROM V$TABLESPACE;

达梦数据库相比于MySQL数据库效率如何_DM_03

HMAIN 表空间查看语句:

SELECT * FROM V$HUGE_TABLESPACE;

达梦数据库相比于MySQL数据库效率如何_表空间_04

2.2 记录

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

2.3 页

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

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

达梦数据库相比于MySQL数据库效率如何_DM_05

在绝大多数情况下,用户都无需干预 DM 数据库对数据页的管理。但是 DM 数据库还是提供了选项供用户选择,使得在某些情况下能够为用户提供更佳的数据处理性能。

FILLFACTOR 是 DM 数据库提供的一个与性能有关的数据页级存储参数,它指定一个数据页初始化后插入数据时最大可以使用空间的百分比(100),该值在创建表/索引时可以指定。设置 FILLFACTOR 参数的值,是为了指定数据页中的可用空间百分比(FILLFACTOR)和可扩展空间百分比(100-FILLFACTOR)。可用空间用来执行更多的 INSERT 操作,可扩展空间用来为数据页保留一定的空间,以防止在今后的更新操作中增加列或者修改变长列的长度时,引起数据页的频繁分裂。当插入的数据占据的数据页空间百分比低于 FILLFACTOR时,允许数据插入该页,否则将当前数据页中的数据分为两部分,一部分保留在当前数据页中,另一部分存入一个新页中。

对于 DBA 来说,使用 FILLFACTOR 时应该在空间和性能之间进行权衡。为了充分利用空间,用户可以设置一个很高的 FILLFACTOR 值,如 100,但是这可能会导致在后续更新数据时,频繁引起页分裂,而导致需要大量的 I/O 操作。为了提高更新数据的性能,可以设置一个相对较低(但不是过低)的 FILLFACTOR 值,使得后续执行更新操作时,可以尽量避免数据页的分裂,提升 I/O 性能,不过这是以牺牲空间利用率来换取性能的提高

2.4 簇

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

  • 分配数据簇
    当创建一个表/索引的时候,DM 为表/索引的数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,供后续操作使用。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,DM 数据库将自动分配新的簇。在缺省情况下,DM 数据库在创建表/索引时,初始分配 1 个簇,当初始分配的空间用完时,DM 数据库会自动扩展。

    当 DM 数据库的表空间为新的簇分配空闲空间时,首先在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配;如果各数据文件都没有空闲簇,则在各数据文件中查找空闲空间足够的,将需要的空间先进行格式化,然后进行分配;如果各文件的空闲空间也不够,则选一个数据文件进行扩充。
  • 释放数据簇
    对于用户数据表空间,在用户将一个数据段对应的表/索引对象 DROP 之前,该表对应的数据段会保留至少 1 个簇不被回收到表空间中。在删除表/索引对象中的记录的时候,DM数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用。当用户删除了表中所有记录时,DM 数据库仍然会为该表保留 1-2 个簇供后续使用。若用户使用 DROP 语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。(这里体现出了DELETE和DROP的区别在于簇是否被收回。)

    对于临时表空间,DM 数据库会自动释放在执行 SQL 过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。
    对于回滚表空间,DM 数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇。

2.5 段

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

(1)数据段
段可以被定义成特定对象的数据结构,如表数据段或索引数据段。 表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储。DM 以簇为单位给每个数据段分配空间,当数据段的簇空间用完时,DM 数据库就给该段重新分配簇,段的分配和释放完全由 DM 数据库自动完成,可以在创建表/索引时设置存储参数来决定数据段的簇如何分配。

当用户使用 CREATE 语句创建表/索引时,DM 创建相应的数据段。表/索引的存储参数用来决定对应数据段的簇如何被分配,这些参数将会影响与对象相关的数据段的存储与访问效率。

对于分区表,每个分区使用单独的数据段来容纳所有数据,对于分区表上的非分区索引,使用一个索引数据段来容纳所有数据,而对于分区索引,每个分区使用一个单独索引数据段来容纳其数据。表的数据段和与其相关的索引段不一定要存储在同一表空间中,用户可以在创建表和索引时,指定不同的表空间存储参数。

(2)临时段
在 DM 数据库中,所有的临时段都创建在临时表空间中,这样可以分流磁盘设备的 I/O,也可以减少由于在 SYSTEM 或其他表空间内频繁创建临时数据段而造成的碎片

当处理一个查询时,经常需要为 SQL 语句的解析与执行的中间结果准备临时空间。DM数据库会自动地分配临时段的磁盘空间。例如,DM 在进行排序操作时就可能需要使用临时段,当排序操作可以在内存中执行,或设法利用索引就可以执行时,就不必创建临时段。对于临时表及其索引,DM 数据库也会为它们分配临时段。

临时段的分配和释放完全由系统自动控制,用户不能手工进行干预。

(3)回滚段
DM 数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更。在数据库恢复阶段,回滚记录被用来做任何未提交变更的回滚。在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询

DM 数据库提供了全自动回滚管理机制来管理回滚信息和回滚空间,自动回滚管理消除了管理回滚段的复杂性。此外,系统将尽可能保存回滚信息,来满足用户查询回滚信息的需要。事务被提交后,回滚数据不能再回滚或者恢复,但是从数据读一致性的角度出发,长时间运行查询可能需要这些早期的回滚信息来生成早期的数据页镜像,基于此,数据库需要尽可能长时间的保存回滚信息。DM 数据库会收集回滚信息的使用情况,并根据统计结果对回滚信息保存周期进行调整,数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长。



三、物理存储结构

DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结

构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等。如图所示。

达梦数据库相比于MySQL数据库效率如何_数据库_06

3.1 配置文件

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

  • 启用/禁用特定功能项;
  • 针对当前系统运行环境设置更优的参数值以提升系统性能。

3.1.1 DM数据库服务配置

(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.cof
dm_svc.conf 是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置 的一些参数。它必须和接口/客户端工具位于同一台机器上才能生效。

dm_svc.conf 的工作目录是固定的,不能改变。 用户如果需要将其修改并拷贝到其他客户端机器上,也必须位于相同的目录中。dm_svc.conf 工作的目录就是初始dm_svc.conf 文件生成的目录。

初始 dm_svc.conf 文件由 DM 安装时自动生成。不同的平台生成目录有所不同。

  • 在 Windows 平台下,此文件位于%SystemRoot%\system32 目录或者位于%SystemRoot%\SysWOW64目录;
  • 在 Linux 平台下,此文件位于/etc 目录。

dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,服务配置区在后,以“[服务名]”开头,可配置除了服务名和 WALLET_LOCATION 外的所有配置项。服务配置区中的配置优先级高于全局配置区。

需要说明的是,如果对 dm_svc.conf 的配置项进行了修改,需要重启客户端工具,修
改的配置才能生效。另外,如果 dm_svc.conf 配置文件中包含中文,则必须保证该配置文件的编码与客户端编码一致。

(5)sqllog.ini

sqllog.ini 用于sql日志的配置,当且仅当INI参数SVR_LOG=1时使用。 如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过程SP_REFRESH_SVR_LOG_CONFIG() 就会生效。

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 中的系统默认值。

3.1.2 复制配置

(1)dmrep.ini
dmrep.ini 用于配置复制实例,主要用于数据复制。

(2)dmllog.ini
dmllog.ini 用于配置逻辑日志,主要用于数据复制。

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

3.2 控制文件

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

  • 数据库名称;
  • 数据库服务器模式;
  • OGUID 唯一标识;
  • 数据库服务器版本;
  • 数据文件版本;
  • 数据库的启动次数;
  • 数据库最近一次启动时间;
  • 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的
    表空间,数组的方式保存起来;
  • 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控
    制文件合法性,防止文件损坏及手工修改。

在服务器运行期间,执行表空间的 DDL 等操作后,服务器内部需要同步修改控制文件内容。如果在修改过程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内部会执行备份操作。

3.3 数据文件

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

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

数据文件在物理上按照页、簇和段的方式进行管理。
数据文件按数据组织形式,可以分为如下几种:

(1)B 树数据
行存储数据,也是应用最广泛的存储形式,其数据是按 B 树索引组织的。普通表、分区表、B 树索引的物理存储格式都是 B 树。
一个 B 树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。其 B 树的逻辑关系由段内页面上的记录,通过文件指针来完成。
当表上没有指定聚簇索引时,系统会自动产生一个唯一标识 rowid 作为 B 树的 key 来唯一标识一行。
(2)堆表数据
堆表的数据是以挂链形式存储的,一般情况下,支持最多 128 个链表,一个链表在物理上就是一个段,堆表采用的是物理 rowid,在插入过程中,rowid 在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高,且由于 rowid 是即时生成,无需保存在物理磁盘上,也节省了空间。
(3)列存储数据
数据按列方式组织存储,包含每个列对应的存放列数据的一系列数据文件,以及存放列数据控制信息的辅助表。读取列数据时,只需要顺序扫描列数据文件和辅助表数据。在某些特殊应用场景下,其效率要远远高于行存储。
(4)位图索引
位图索引与 B 树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。



数据文件中还有两类特殊的数据文件:ROLL 和 TEMP 文件。
(1)ROLL 文件
ROLL 表空间的 dbf 文件,称为 ROLL 文件。ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。回滚文件可被分为若干回滚段,每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。
(2)TEMP 文件
TEMP.DBF 临时数据文件,临时文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。
当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在TEMP.DBF 文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。

3.4 重做日志文件

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

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

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

重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志。当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。

3.5 归档日志文件

日志文件分为联机日志文件归档日志文件

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

联机日志文件指的是系统当前正在使用的日志文件。创建数据库时,联机日志文件通常
被扩展至一定长度,其内容则被初始化为空,当系统运行时,该文件逐渐被产生的日志所填充。对日志文件的写入是顺序连续的。然而系统磁盘空间总是有限,系统必须能够循环利用日志文件的空间,为了做到这一点,当所有日志文件空间被占满时,系统需要清空一部分日志以便重用日志文件的空间,为了保证被清空的日志所“保护”的数据在磁盘上是安全的,这里需要引入检查点。当产生检查点时,系统将系统缓冲区中的日志和脏数据页都写入磁盘,以保证当前日志所“保护”的数据页都已安全写入磁盘,这样日志文件即可被安全重用。

归档日志文件,就是在归档模式下,重做日志被连续写入到归档日志后,所生成了归档
日志文件。归档日志文件以归档时间命名,扩展名也是 log。但只有在归档模式下运行时,DM 数据库才会将重做日志写入到归档日志文件中。采用归档模式会对系统的性能产生影响,然而系统在归档模式下运行会更安全,当出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故障,如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,而如果没有归档日志文件,则只能利用备份进行恢复。

3.6 逻辑日志文件

如果在 DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式,且不在第一章所述的页,簇和段的管理之下。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。

3.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。

3.8 备份文件

备份文件以 bak 为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。然而,从来没有哪个数据库系统能够保证永远正确无误地运行,当数据库不幸出现故障时,备份文件就显得尤为重要了。
当客户利用管理工具或直接发出备份的 SQL 命令时,DM Server 会自动进行备份,并产生一个或多个备份文件,备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。同时,系统还会自动记录备份信息及该备份文件所处的位置,但这种记录是松散的,用户可根据需要将其拷贝至任何地方,并不会影响系统的运行。

3.9 SQL日志文件

用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志。SQL 日志文件是一个纯文本文件。
当 PART_STOR=0 时,以“dmsql_实例名_日期_时间”命名,当 PART_STOR=1 时,以“dmsql_实例名_用户名_日期_时间”命名。缺省生成在 DM 安装目录的 log 子目录下面,管理员可通过 sqllog.ini 参数 FILE_PATH 设置其生成路径。

SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。
跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的 SQL 语句,进而对其进行优化。
系统中 SQL 日志的缓存是分块循环使用,管理员可根据系统执行的语句情况及压力情况设置恰当的日志缓存块大小及预留的缓冲块个数。当预留块不足以记录系统产生的任务时,系 统 会 分 配 新 的 用 后 即 弃 的 缓 存 块 , 但 是 总 的 空 间 大 小 由 sqllog.ini 参 数BUF_TOTAL_SIZE 控制,管理员可根据实际情况进行设置。

打开 SQL 日志会对系统的性能会有较大影响,一般用于查错和调优的时候才会打开,**默认情况下系统是关闭跟踪日志的。**若需要跟踪日志但对日志的实时性没有严格的要求,又希望系统有较高的效率,可以设置 sqllog.ini 参数 SQL_TRACE_MASK 和 MIN_EXEC_TIME 只记录关注的相关记录,减少日志总量;设置 sqllog.ini 参数 ASYNC_FLUSH 打开 SQL 日志异步刷盘提高系统性能。

3.10 事件日志文件

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

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

3.11 数据重演文件

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



四、内存结构

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

4.1 内存池

DM Server 的内存池包括共享内存池和其他一些运行时内存池。
动态视图 V$MEM_POOL 详细记录了当前系统中所有的内存池的状态,可通过查询这个动态视图掌握 DM Server 的内存使用情况。

(1)共享内存池:是DM Server在启动时从操作系统申请的一大片内存。默认大小500M,可在dm.ini修改参数MEMORY_POOL调整大小,参数MEMORY_EXTENT_SIZE指定共享内存池每次扩展的大小,参数MEMORY_TARGET 指定共享内存池能扩展到的最大值。

(2)运行时内存池:是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。

4.2 缓冲区

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

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

DM Server 中有四种类型的数据缓冲区,分别是 NORMAL、KEEP、FAST 和 RECYCLE。其中,用户可以在创建表空间或修改表空间时,指定表空间属于 NORMAL 或 KEEP 缓冲区。RECYCLE 缓冲区供临时表空间使用,FAST 缓冲区根据用户指定的 FAST_POOL_PAGES 大小由系统自动进行管理,用户不能指定使用RECYCLE 和 FAST 缓冲区的表或表空间。

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

(2)日志缓冲区:日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘IO而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。

为何不在数据缓冲区中缓存重做日志而要单独设立日志缓冲区?

  • 重做日志的格式同数据页完全不一样,无法进行统一管理;
  • 重做日志具备连续写的特点;
  • 在逻辑上,写重做日志比数据页 IO 优先级更高。

(3)字典缓冲区:主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。每次对数据库的操作都会涉及到数据字典信息,访问数据字典信息的效率直接影响到相应的操作效率。DM8 采用的是将部分数据字典信息加载到缓冲区中,并采用 LRU 算法进行字典信息的控制。

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

4.3 排序区

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

4.4 哈希区

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

4.5 SSD缓冲区

固态硬盘采用闪存作为存储介质,因没有机械磁头的寻道时间,在读写效率上比机械磁盘具有优势。在内存、SSD磁盘、机械磁盘之间,符合存储分级的条件。为提高系统执行效率,DM Server将SSD文件作为内存缓存与普通磁盘之间的缓冲层,称为"SSD缓存"。



五、线程

DM 服务器使用“对称服务器构架”的单进程、多线程结构。

服务器在运行时由各种内存数据结构和一系列的线程组成,线程分为多种类型,不同类型的线程完成不同的任务。线程通过一定的同步机制对数据结构进行并发访问和处理,以完成客户提交的各种任务。DM 数据库服务器是共享的服务器,允许多个用户连接到同一个服务器上,服务器进程称为共享服务器进程。

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

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

名称

说明

V$LATCHES

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

V$THREADS

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

V$WTHRD_HISTORY

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

V$PROCESS

记录服务器进程信息