达梦数据库体系架构由DM逻辑结构、DM物理结构、DM内存结构等组成。
在 DM7 以及之后版本的数据库中,“数据库”和“实例”这两个概念之间有着很大 的差别,甚至可以说它们是两个完全不同的实体。
DM 数据库指 的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件 以及临时数据文件等。
实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。简单 来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的 集合。
DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在 DM 数据库 内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象 都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。通过这种细 分,可以使得 DM 数据库能够更加高效地控制磁盘空间的利用率。图 1.1 显示了这些数据结构 之间的关系。
可以看出,在 DM8 中存储的层次结构如下:
1. 数据库由一个或多个表空间组成;
2. 每个表空间由一个或多个数据文件组成;
. 每个数据文件由一个或多个簇组成;
4. 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
5. 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
6. 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
在 DM 数据库中,表空间由一个或者多个数据文件组成。DM 数据库中的所有对象在逻 辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
DM 数据库中的表空间可以分为普通表空间和混合表空间。普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通(非 HUGE)表和 HUGE 表,其中 HUGE 数据文件存储 在混合表空间定义中指定的 HUGE 数据文件路径下。可以通过为普通表空间增加指定 HUGE 数据文件路径将普通表空间升级为混合表空间。
在创建DM数据库时,会自动创建 4 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间和 TEMP 表空间。
数据库表中的每一行是一条记录。在 DM 中,除了 HUGE 表,其他的表都是在数据页中 按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是 DM 数据库的存储单位,页才是。由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中 还包含了页头控制信息等空间,因此DM 规定每条记录的总长度不能超过页面大小的一半。
数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB, 用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。
簇是数据页的上级逻辑单元,由同一个数据文件中 16 个或 32 个或 64 个连续的数据页 组成。在 DM 数据库中,簇的大小由用户在创建数据库时指定,默认大小为 16。假定某个数 据文件大小为 32MB,页大小为 8KB,则共有 32MB/8KB/16=256 个簇,每个簇的大小为 8K*16=128K。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。
段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不 同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自 一个文件,是连续的 16 或者 32 个数据页。由于簇的数量是按需分配的,数据段中的不同簇 在磁盘上不一定连续。
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储 结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实 际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日 志文件等,如图 2.1 所示。
配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 INI 为扩 展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的目标:
1. 启用/禁用特定功能项;
2. 针对当前系统运行环境设置更优的参数值以提升系统性能。
每创建一个 DM 数据库,就会自动生成 dm.ini 文件。dm.ini 是 DM 数据库启动所必须 的配置文件,通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项,主要的配 置模块包括:控制文件相关、实例名、内存相关、线程相关等。
当 dm.ini 中的某参数值设置为非法值时,若设置值与参数类型不兼容,则参数实际取值 为默认值;若设置值小于参数取值范围的最小值,则实际取值为最小值;若设置值大于参数 取值范围的最大值,则实际取值为最大值。
参数属性分为三种:手动、静态和动态。
手动,不能被动态修改,必须手动修改 dm.ini 参数文件,然后重启才能生效。
静态,可以被动态修改,修改后重启服务器才能生效。
动态,可以被动态修改,修改后即时生效。动态参数又分为会话级和系统级两种。会话级参数被修改后,新参数值只会影响当前会话和新创建的会话,之前创建的会话不受影响; 系统级参数的修改则会影响所有的会话。
(注:通过调用系统过程SP_SET_PARA_VALUE() 、 SP_SET_PARA_DOUBLE_VALUE() 和 SP_SET_PARA_STRING_VALUE()对参数值进行修改,此外详情参数信息可看官方手册)
dmmal.ini 是 MAL 系统的配置文件,需要用到MAL环境的实例,所有站点 dmmal.ini 需要保证严格一致。
dmarch.ini 用于本地归档和远程归档.
dm_svc.conf 是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能 生效。
初始 dm_svc.conf 文件在 DM 安装时自动生成。不同平台的生成目录有所不同。
1. 32 位的 DM 安装在 Win32 操作平台下,此文件位于%SystemRoot%\system32 目录;
2. 64 位的 DM 安装在 Win64 操作平台下,此文件位于%SystemRoot%\system32 目录;
3. 32 位的 DM 安装在 Win64 操作平台下,此文件位于%SystemRoot%\SysWOW64 目录;
4. 在 Linux 平台下,此文件位于/etc 目录。
可以通过设置操作系统环境变量 DM_SVC_PATH 来修改 dm_svc.conf 文件路径。
sqllog.ini用于SQL日志的配置,当且仅当INI参数SVR_LOG=1时使用。
dmrep.ini 用于配置复制实例、dmllog.ini 用于配置逻辑日志、dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。
每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记 录了数据库必要的初始信息
数据文件以 dbf 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁 盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的 地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。(可自动扩展空间,MAXSIZE参数限制其扩展量)
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据, DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中重做日志 文件默认以 log 为扩展名,可在初始化数据库时使用建库参数 RLOG_POSTFIX_NAME 指定 重做日志文件的扩展名。每个DM数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用。
日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下运行。
非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;
归档模式下, 数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储
如果在 DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式,且上述中的页,簇和段的管理之下。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源 端的各种逻辑操作。用于发送给复制目的端(因此dmhs搭建时必须开启逻辑日志参数)。
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 DBMS_LOGMNR 包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内 容会被存储在重做日志文件中。
备份文件以 bak 为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数 据库必须有的联机文件类型之一。然而,从来没有哪个数据库系统能够保证永远正确无误地 运行,当数据库不幸出现故障时,备份文件就显得尤为重要了。
用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志。SQL 日志文件是一个纯文本文件。命名格式为“dmsql_实例名[_模式名][_用户名][_ 日期_时间].log”。
SQL 日志文件缺省生成在 DM 安装目录的 log 子目录下面,管理员可通过 sqllog.ini 参 数 FILE_PATH 设置其生成路径。
内容与作用:SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要 用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析
事件日志文件记录了 DM 数据库运行时的关键事件。例如:系统启动、关闭、内存申请 失败、IO 错误等一些致命错误;数据库运行过程中的日志信息;备份还原过程中备份还原操 作的阶段性信息等。
数据库管理系统是一种对内存申请和释放操作频率很高的软件,如果每次对内存的使用 都使用操作系统函数来申请和释放,效率会比较低,加入自己的内存管理是 DBMS 系统所必 须的。通常内存管理系统会带来以下好处:
1. 申请、释放内存效率更高;
2. 能够有效地了解内存的使用情况;
3. 易于发现内存泄露和内存写越界的问题。
DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系 统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
DM Server 的内存池包括共享内存池和其他一些运行时内存池。
数据缓冲区、日志缓冲区、字典缓冲区、SQL 缓冲区
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排 序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束 后再释放内存。
DMServer 提供了参数来指定排序缓冲区的大小,参数 SORT_BUF_SIZE 在 DM 配置文 件 dm.ini 中,系统管理员可以设置其大小以满足需求,由于该值是由系统内部排序算法和排 序数据结构决定,建议使用默认值 20M。
DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚 拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对 排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希 操作。
DMServer 在 dm.ini 中提供了参数 HJ_BUF_SIZE 来进行控制,由于该值的大小可能会 限制哈希连接的效率,所以建议保持默认值,或设置为更大的值。 除了提供 HJ_BUF_SIZE 参数外,DM Server 还提供了创建哈希表个数的初始化参数, 其中,HAGR_HASH_SIZE表示处理聚集函数时创建哈希表的个数,建议保持默认值100000。
学无止境-->想要了解更多:达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台