DM体系结构
1 DM 逻辑结构概述
数据库和实例
在 DM7 之前版本的 DM 数据库中,“数据库”和“实例”这两个术语经常可以互相替换,意义也很相近。在 DM7 以及之后版本的数据库中,“数据库”和“实例”这两个概念之间有着很大的差别,甚至可以说它们是两个完全不同的实体。
1.1.1 数据库
在有些情况下,数据库的概念包含的内容会很广泛。如在单独提到 DM 数据库时,可能指的是 DM 数据库产品,也有可能是正在运行的 DM 数据库实例,还可能是 DM 数据库运行中所需的一系列物理文件的集合等。但是,当同时出现 DM 数据库和实例时,DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。
1.1.2 实例
实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。
DM 数据库存储在服务器的磁盘上,而 DM 实例则存储于服务器的内存中。通过运行 DM 实例,可以操作 DM 数据库中的内容。在任何时候,一个实例只能与一个数据库进行关联(装载、打开或者挂起数据库)。在大多数情况下,一个数据库也只有一个实例对其进行操作。但是在 DM 数据共享集群(DMDSC)中,多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。此时,我们可以同时从多台不同的计算机访问这个数据库。
DM 逻辑存储结构
DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在 DM 数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。通过这种细分,可以使得 DM 数据库能够更加高效地控制磁盘空间的利用率。如图显示了这些数据结构之间的关系。
对应oracle的:tablespace—表空间、segement—段、extent—区、block—块
可以看出,在 DM8 中存储的层次结构如下:
- 数据库由一个或多个表空间组成;
- 每个表空间由一个或多个数据文件组成;
- 每个数据文件由一个或多个簇组成;
- 段是簇的上级逻辑单元,一个段可以跨多个数据文件;
- 簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
- 页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
表空间
在 DM 数据库中,表空间由一个或者多个数据文件组成。DM 数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。
DM 数据库中的表空间可以分为普通表空间和混合表空间。普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通(非 HUGE)表和 HUGE 表,其中 HUGE 数据文件存储在混合表空间定义中指定的 HUGE 数据文件路径下。可以通过为普通表空间增加指定 HUGE 数据文件路径将普通表空间升级为混合表空间。
在创建 DM 数据库时,系统会自动创建 5 个表空间:SYSTEM 表空间、ROLL 表空间、RLOG 表空间、MAIN 表空间和 TEMP 表空间。
- SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。SYSTEM 表空间又称为系统表空间。
- ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML(数据操作语言)操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
- RLOG 表空间称为日志表空间,初始化库时会自动创建 2 个后缀名为 log 的日志文件,用于存放重做日志,用户可主动添加日志文件或者扩展日志文件。日志文件包括当前活动日志文件及非活动日志文件,当前日志文件写满后系统会自动切换到下一个日志文件,日志文件可循环使用。
- MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径,因此 MAIN 表空间为混合表空间。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
- TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 系统用户的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。如果用户在创建表的时候,指定了存储表空间 A,并且和当前用户的默认表空间 B 不一致时,表存储在用户指定的表空间 A 中,并且默认情况下,在这张表上面建立的索引也将存储在 A 中,但是用户的默认表空间是不变的,仍为 B。
一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。
每一个用户都有一个默认的表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 系统用户的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。如果用户在创建表的时候,指定了存储表空间 A,并且和当前用户的默认表空间 B 不一致时,表存储在用户指定的表空间 A 中,并且默认情况下,在这张表上面建立的索引也将存储在 A 中,但是用户的默认表空间是不变的,仍为 B。
一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。
用户可以通过执行如下语句来查看 SYSTEM、ROLL、MAIN 以及 TEMP 的表空间相关信息。
SELECT * FROM V$TABLESPACE;
用户可以通过执行如下语句来查看 RLOG 表空间相关信息:
SELECT * FROM V$RLOG; --查看日志空间信息
SELECT * FROM V$RLOGFILE; --RLOG文件信息
SELECT * FROM V$LOG_HISTORY; --日志文件切换历史
记录
数据库表中的每一行是一条记录。在 DM 中,除了 HUGE 表,其他的表都是在数据页中按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是 DM 数据库的存储单位,页才是。由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此 DM 规定每条记录的总长度不能超过页面大小的一半。
页
数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。如图显示了 DM 数据库页的典型格式。
页头控制信息包含了关于页类型、页地址等信息。页的中部存放数据,为了更好地利用数据页,在数据页的尾部专门留出一部分空间用于存放行偏移数组,行偏移数组用于标识页上的空间占用情况以便管理数据页自身的空间。
在绝大多数情况下,用户都无需干预 DM 数据库对数据页的管理。但是 DM 数据库还是提供了选项供用户选择,使得在某些情况下能够为用户提供更佳的数据处理性能。
FILLFACTOR 是 DM 数据库提供的一个与性能有关的数据页级存储参数,它指定一个数据页初始化后插入数据时最大可以使用空间的百分比(100),该值在创建表/索引时可以指定。设置 FILLFACTOR 参数的值,是为了指定数据页中的可用空间百分比(FILLFACTOR)和可扩展空间百分比(100-FILLFACTOR)。可用空间用来执行更多的 INSERT 操作,可扩展空间用来为数据页保留一定的空间,以防止在今后的更新操作中增加列或者修改变长列的长度时,引起数据页的频繁分裂。当插入的数据占据的数据页空间百分比低于 FILLFACTOR 时,允许数据插入该页,否则将当前数据页中的数据分为两部分,一部分保留在当前数据页中,另一部分存入一个新页中。
对于 DBA 来说,使用 FILLFACTOR 时应该在空间和性能之间进行权衡。为了充分利用空间,用户可以设置一个很高的 FILLFACTOR 值,如 100,但是这可能会导致在后续更新数据时,频繁引起页分裂,而导致需要大量的 I/O 操作。为了提高更新数据的性能,可以设置一个相对较低(但不是过低)的 FILLFACTOR 值,使得后续执行更新操作时,可以尽量避免数据页的分裂,提升 I/O 性能,不过这是以牺牲空间利用率来换取性能的提高。
簇
簇是数据页的上级逻辑单元,由同一个数据文件中 16 个或 32 个或 64 个连续的数据页组成。在 DM 数据库中,簇的大小由用户在创建数据库时指定,默认大小为 16。假定某个数据文件大小为 32MB,页大小为 8KB,则共有 32MB/8KB/16=256 个簇,每个簇的大小为 8K*16=128K。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。
- 分配数据簇
一般的,当创建一个表/索引的时候,DM 数据库会为表/索引的数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,供后续操作使用。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,DM 数据库将自动分配新的簇。在缺省情况下,DM 数据库在创建表/索引时,初始分配 1 个簇,当初始分配的空间用完时,DM 数据库会自动扩展。另外,DM 还提供了延迟段分配的功能,特点为不会在进行创建表/索引时马上为表/索引分配存储结构。
当 DM 数据库的表空间为新的簇分配空闲空间时,首先在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配;如果各数据文件都没有空闲簇,则在各数据文件中查找空闲空间足够的,将需要的空间先进行格式化,然后进行分配;如果各文件的空闲空间也不够,则选一个数据文件进行扩充。
- 释放数据簇
对于用户数据表空间,在用户将一个数据段对应的表/索引对象 DROP 之前,该表对应的数据段会保留至少 1 个簇不被回收到表空间中。在删除表/索引对象中的记录的时候,DM 数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用。当用户删除了表中所有记录时,DM 数据库仍然会为该表保留 1-2 个簇供后续使用。若用户使用 DROP 语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。
对于临时表空间,DM 数据库会自动释放在执行 SQL 过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。
对于回滚表空间,DM 数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇。
段
段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的 16 或 32 或 64 个数据页。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。
- 数据段
段可以被定义成特定对象的数据结构,如表数据段或索引数据段。表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储。DM 以簇为单位给每个数据段分配空间,当数据段的簇空间用完时,DM 数据库就给该段重新分配簇,段的分配和释放完全由 DM 数据库自动完成,可以在创建表/索引时设置存储参数来决定数据段的簇如何分配。
当用户使用 CREATE 语句创建表/索引时,DM 创建相应的数据段。表/索引的存储参数用来决定对应数据段的簇如何被分配,这些参数将会影响与对象相关的数据段的存储与访问效率。对于分区表,每个分区使用单独的数据段来容纳所有数据,对于分区表上的非分区索引,使用一个索引数据段来容纳所有数据,而对于分区索引,每个分区使用一个单独索引数据段来容纳其数据。表的数据段和与其相关的索引段不一定要存储在同一表空间中,用户可以在创建表和索引时,指定不同的表空间存储参数。
- 临时段
在 DM 数据库中,所有的临时段都创建在临时表空间中,这样可以分流磁盘设备的 I/O,也可以减少由于在 SYSTEM 或其他表空间内频繁创建临时数据段而造成的碎片。
当处理一个查询时,经常需要为 SQL 语句的解析与执行的中间结果准备临时空间。DM 数据库会自动地分配临时段的磁盘空间。例如,DM 在进行排序操作时就可能需要使用临时段,当排序操作可以在内存中执行,或设法利用索引就可以执行时,就不必创建临时段。对于临时表及其索引,DM 数据库也会为它们分配临时段。
临时段的分配和释放完全由系统自动控制,用户不能手工进行干预。
- 回滚段
DM 数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更。在数据库恢复阶段,回滚记录被用来做所有未提交变更的回滚。在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询。
DM 数据库提供了全自动回滚管理机制来管理回滚信息和回滚空间,自动回滚管理消除了管理回滚段的复杂性。此外,系统将尽可能保存回滚信息,来满足用户查询回滚信息的需要。事务被提交后,回滚数据不能再回滚或者恢复,但是从数据读一致性的角度出发,长时间运行查询可能需要这些早期的回滚信息来生成早期的数据页镜像,基于此,数据库需要尽可能长时间的保存回滚信息。DM 数据库会收集回滚信息的使用情况,并根据统计结果对回滚信息保存周期进行调整,数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长。
DM 支持了延迟段分配的功能,在创建表或索引时先暂时不申请存储空间,当对表中插入数据时,才尝试申请存储空间。对于已延迟段分配的表创建二级索引时,新建的索引同样也会延迟段分配。(除了全局索引、online 方式创建索引,此时二级索引总是会申请段)。可以通过设置 ini 参数 DEFERRED_SEGMENT_CREATION=1 开启延迟段分配功能,也可以在建表语句中进行指定,具体的段分配情况可以通过查看 V$SEGMENT_INFOS 获取。该功能可以有效改善创建分区表时,分区数较多导致初始为空的分区表分配过多空间的问题。
对表或索引进行延迟段分配,可能存在以下特殊场景:
- 对已延迟段分配的表进行查询插入,即便查询空表不会插入任何数据,目标表也会申请段。 因此需要注意,在启用 DDL 相关优化如 ALTER_TABLE_OPT 参数时,DM 可能会选择使用查询插入的方式来加速 DDL 执行,此时即便目标表已延迟段分配,该 DDL 的执行会导致目标表申请段。
- 表指定了自增列起始边界,即便建表时指定了延迟段分配也会被忽略。
- 重建已延迟段分配的索引将导致该索引申请段。
DM 物理存储结构
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等,如图下图所示。
配置文件
配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的目标:
- 启用/禁用特定功能项;
- 针对当前系统运行环境设置更优的参数值以提升系统性能。
2.1.1 DM 数据库服务配置
2.1.1.1 dm.ini
详情见:
https://eco.dameng.com/document/dm/zh-cn/pm/physical-storage.html#2.1.1.1%20dm.ini
每创建一个 DM 数据库,就会自动生成 dm.ini 参数文件。dm.ini 是 DM 数据库启动所必须的配置文件,通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项,主要的配置模块包括:控制文件相关、实例名、内存相关、线程相关等。
参数属性分为三种:手动、静态和动态。
手动,不能被动态修改,必须手动修改 dm.ini 参数文件,然后重启才能生效。
静态,可以被动态修改,修改后重启服务器才能生效。
动态,可以被动态修改,修改后即时生效。动态参数又分为会话级和系统级两种。会话级参数被修改后,新参数值只会影响当前会话和新创建的会话,之前创建的会话不受影响;系统级参数的修改则会影响所有的会话。
其中,动态修改是指 DBA 用户可以在数据库服务器运行期间,通过调用系统过程 SP_SET_PARA_VALUE()、SP_SET_PARA_DOUBLE_VALUE()和 SP_SET_PARA_STRING_VALUE()对参数值进行修改。当动态修改 dm.ini 参数文件时,如果遇到磁盘空间不足导致系统崩溃的情况,需要手动使用 dm.ini 文件所在目录下的 dm.ini.dmbak 文件恢复 dm.ini,并重启服务器。
当手动修改 dm.ini 参数文件且将 dm.ini 中的某参数值设置为非法值时,若设置值与参数类型不兼容,则参数实际取值为默认值;若设置值小于参数取值范围的最小值,则实际取值为最小值;若设置值大于参数取值范围的最大值,则实际取值为最大值。
当动态修改 ini 参数且设置参数为非法值时,包括设置值与参数类型不兼容、设置值小于参数取值范围的最小值、设置值大于参数取值范围的最大值三种情况,均进行报错处理。
参考值环境(主机:CPU:4 路 8 核 /内存:64GB /磁盘阵列:1TB)。
2.1.1.1.1 文件路径相关
参数名 | 缺省值 | 属性 | 说明 |
CTL_PATH | SYSTEM_PATH | 手动 | 控制文件路径 |
CTL_BAK_PATH | SYSTEM_PATH\ctl_bak | 手动 | 控制文件备份路径。在初始化库或没有配置该项时均指定为缺省路径。 |
CTL_BAK_NUM | 10 | 手动 | 控制文件备份个数限制,取值范围1~100,在此限制之外,会再多保留一个备份文件,在生成新的备份文件时, |
SYSTEM_PATH | 数据库目录\数据库名 | 手动 | 系统库目录。其中数据库目录由安装时指定,或者dminit工具PATH参数指定 |
CONFIG_PATH | SYSTEM_PATH | 手动 | 指定DMSERVER所读取的配置文件(DMMAL.INI, DMARCH.INI, DMTIMER.INI等)的路径。 |
TEMP_PATH | SYSTEM_PATH\TEMP.DBF | 手动 | 临时库文件路径 |
BAK_PATH | SYSTEM_PATH/BAK | 手动 | 备份路径 |
2.1.1.1.2 实例名
参数名 | 缺省值 | 属性 | 说明 |
INSTANCE_NAME | DMSERVER | 静态 | 实例名。只能由_、$、大写字母A至Z、小写字母A至Z、数字0至9组成,且第一个字符不能是数字。长度不超过16个字节 |
2.1.1.1.3 内存相关
参数名 | 缺省值 | 属性 | 说明 |
MAX_OS_MEMORY | 100 | 静态 | DM服务器能使用的最大内存占操作系统物理内存与虚拟内存总和的百分比,取值范围40~100。当取值100时,服务器不进行内存的检查 建议设置为:100 |
MEMORY_POOL | 500 | 静态 | 共享内存池大小,单位MB。共享内存池是由DM管理的内存。取值范围:32位平台为64~2000,64位平台为64~67108864 |
MEMORY_N_POOLS | 1 | 静态 | 共享内存池个数,取值范围0~2048,0与1等价,即共享池不分片。分片时,每池的初始容量为MEMORY_POOL / MEMORY_N_POOLS, 但受最小初始容量为30M限制,因此实际分片数可能会小于MEMORY_N_POOLS,每个池的TARGET也按此方式由MEMORY_TARGET导出 |
MEMORY_TARGET | 15000 | 动态,系统级 | 共享内存池在扩充到此大小以上后,空闲时收缩回此指定大小,单位MB,取值范围:32位平台为0~2000,64位平台为0~67108864,0表示不限制 |
MEMORY_EXTENT_SIZE | 32 | 静态 | 共享内存池每次扩充的大小,单位MB,取值范围1~10240 |
MEMORY_LEAK_CHECK | 0 | 动态,系统级 | 是否开启内存泄漏检测。0:否;1:是,此时系统对每一次内存分配都登记到动态视图V$MEM_REGINFO中, 并在释放时解除登记 |
MEMORY_MAGIC_CHECK | 1 | 静态 | 是否开启对所有内存池的校验。0:不开启;1:开启校验,校验码基于分配出的块地址计算,在被分配空间的头部和尾部写入校验码;2:增强校验,在1的基础上,如果是内存池分配的,则对尾部未使用空间也计算校验码,写入未使用空间的头部 建议设置为:2,如果性能明显下降改为1 |
HUGEPAGE_THRESHOLD | 16 | 动态,系统级 | 如果从OS申请内存的尺寸大于等于 HUGEPAGE_THRESHOLD * 2MB, 则尝试先申请巨页内存,若失败再申请常规内存; 0表示不尝试使用巨页内存。取值范围0~1024。注:本参数仅对LINUX操作系统有效,使用巨页内存需要对OS进行相关配置 |
MEMORY_BAK_POOL | 4 | 静态 | 系统备份内存池大小,单位MB。系统备份内存池是由DM管理的内存。取值范围2~2048 |
HUGE_MEMORY_PERCENTAGE | 50 | 静态 | 指示HUGE_BUFFER中可以借用作常规内存分配的空间百分比,取值范围0~100 |
HUGE_BUFFER | 80 | 静态 | HUGE表使用的缓冲区大小,单位MB。取值范围8~1048576 |
HUGE_BUFFER_POOLS | 4 | 静态 | HUGE BUFFER系统分区数,每个HUGE BUFFER分区的大小为HUGE_BUFFER/HUGE_BUFFER_POOLS。取值范围1~10000 |
BUFFER | 8000 | 静态 | 系统缓冲区大小,单位MB。推荐值:系统缓冲区大小为可用物理内存的60%~80%。取值范围8~16777216。在PAGE_SIZE 为4K的库中,BUFFER最大值为15728640 建议设置为:32000 |
BUFFER_POOLS | 19 | 静态 | BUFFER系统分区数,每个BUFFER分区的大小为BUFFER/BUFFER_POOLS。取值范围1~512 建议设置为:7 |
FAST_POOL_PAGES | 3000 | 静态 | 快速缓冲区页数。取值范围0~99999999。 FAST_POOL_PAGES的值最多不能超过BUFFER总页数的90%,如果超过,系统会自动调整为BUFFER总页数的90% |
FAST_ROLL_PAGES | 1000 | 静态 | BUFFER中FAST POOL回滚页数量。取值范围0~9999999,最多不超过FAST_POOL_PAGES的75%,如果超过,系统会自动调整。填充规则:将回滚表空间0号文件的0~FAST_ROLL_PAGE-1号页填入FAST POOL中 |
KEEP | 8 | 静态 | KEEP缓冲区大小,单位MB。取值范围8~16777216 |
RECYCLE | 300 | 静态 | RECYCLE缓冲区大小,单位MB。取值范围8~16777216 |
RECYCLE_POOLS | 19 | 静态 | RECYCLE缓冲区分区数,每个RECYCLE分区的大小为RECYCLE/RECYCLE缓冲区分区数。取值范围1~512。一般情况下,每个RECYCLE分区的大小为RECYCLE/RECYCLE_POOLS,但系统也会自动校正RECYCLE缓冲区分区数,以保证每个分区中数据页不少于3000页 |
MULTI_PAGE_GET_NUM | 1 | 静态 | 缓冲区最多一次读取的页面数,当且仅当ENABLE_FREQROOTS=0时有效。取值范围1~64。 当ENABLE_FREQROOTS值非0时,为开启动态FAST POOL填充模式,此时系统会强制调整MULTI_PAGE_GET_NUM=1,并关闭预加载功能。 |
PRELOAD_SCAN_NUM | 0 | 动态,系统级 | 数据页首次预加载时连续扫描的页数,取值范围0~64。取值为0时关闭数据页预加载功能。 |
PRELOAD_EXTENT_NUM | 0 | 动态,系统级 | 数据页首次预加载的簇数量,取值范围0~64。取值为0时关闭数据页预加载功能 |
SORT_FLAG | 1 | 动态,会话级 | 排序机制。 0:原排序机制,普通排序方式,按照排序缓冲区SORT_BUF_SIZE大小获取数据,并进行排序; 1:新排序机制,大内存排序方式,将大内存排序缓冲区SORT_BUF_GLOBAL_SIZE按照内存片大小SORT_BLK_SIZE进行分片,并对每个内存片进行排序,再对整个大内存排序缓冲区的数据进行排序; 2:采用SORT_FLAG为0的排序方式的同时,增加递增列,当排序列存在相同值时按递增列进行排序; 3:采用SORT_FLAG为1的排序方式的同时,增加递增列,当排序列存在相同值时按递增列进行排序 |
SORT_ADAPTIVE_FLAG | 0 | 动态,会话级 | 自适应排序区大小的方式。 0:不进行自适应; 1:SORT_FLAG为0、2时,计算待排序数据的实际排序所需要的内存大小,尽可能地分配所需要的内存,如果申请失败则减半申请,直到申请成功,并按照实际申请的内存大小代替SORT_BUF_SIZE大小进行使用。对进行过刷盘的数据进行排序时,计算排序所需要的内存,尽可能地放大排序内存,保证一次排序可以结束排序。SORT_FLAG为1、3时,根据SORT_BUF_GLOBAL_SIZE和分片内存最大10000个的限制,计算SORT_BLK_SIZE的最小值,如果SORT_BLK_SIZE小于最小值,则实际按照最小值来分片。对整个大内存排序缓冲区的数据进行排序时,计算排序所需要的内存,尽可能地放大排序内存,保证一次排序可以结束排序; 2:SORT_FLAG为0、2时,按照行数估算待排序数据的实际排序所需要的内存大小,找到最适合排序算法的内存大小。当待排序的数据行数超过50万时,才开启此优化,数据量太小无需优化; 3:1和2的组合。当SORT_FLAG为0、2时,计算待排序数据的实际排序所需要的内存大小时,采用SORT_ADAPTIVE_FLAG为2的按照行数估算待排序所需要内存大小。除此之外的其他情况均保持SORT_ADAPTIVE_FLAG为1的方式 |
SORT_BUF_SIZE | 20 | 动态,会话级 | 原排序机制下,排序缓存区最大值,单位MB。取值范围1~2048 |
SORT_BUF_GLOBAL_SIZE | 1000 | 动态,系统级 | 新排序机制下,排序全局内存使用上限,单位MB。取值范围10~4294967294。该值须大于SORT_BUF_SIZE的值,否则会在重启时被重置为SORT_BUF_SIZE两倍和100之间的最大值 |
SORT_BLK_SIZE | 1 | 动态,会话级 | 新排序机制下对数据进行排序的排序缓冲区分片大小,单位MB。取值范围1~50。 SORT_BLK_SIZE一般不需要设置太大,该内存片大小能容纳1万至5万行待排序的数据即可。该值须小于等于SORT_BUF_SIZE,否则会在重启时被重置为SORT_BUF_SIZE。为了保证归并排序的效率,对于大内存排序缓冲区的总的分片个数系统上限为10000个,因此,当SORT_BUF_GLOBAL_SIZE足够大的时候,为了保证大内存排序缓冲区能容纳足够多的数据,需要适当调大SORT_BLK_SIZE。例如,当SORT_BLK_SIZE为1时,SORT_BUF_GLOBAL_SIZE的最大可用值为10000。如果SORT_BUF_GLOBAL_SIZE需要20000M可用空间排序时,需要设置SORT_BLK_SIZE最小为2 |
SORT_BUF_SINGLE_SIZE | 10000 | 动态,会话级 | 控制单个排序操作符内存使用上限,大内存排序场景(参数SORT_FLAG取值包含1时)有效。在允许的取值范围内,内部还将检查其取值是否合理,SORT_BUF_SINGLE_SIZE的合理取值应该大于或等于SORT_BLK_SIZE且小于或等于SORT_BUF_GLOBAL_SIZE。取值范围1~4294967294 |
HAGR_HASH_SIZE | 100000 | 动态,会话级 | HAGR操作时,建立HASH表的桶个数。取值范围10000~100000000 |
HJ_BUF_GLOBAL_SIZE | 5000 | 动态,系统级 | HASH 连接操作符的数据总缓存大小,单位MB。取值范围10~500000。该值须大于HJ_BUF_SIZE的值,否则会在尝试使用系统函数修改为非法值或在DM.INI中指定为非法值后,被重置为HJ_BUF_SIZE两倍和500之间的最大值 建议设置为:4000 |
HJ_BUF_SIZE | 500 | 动态,会话级 | 单个HASH连接操作符的数据总缓存大小,单位MB。取值范围2~100000。该值须小于HJ_BUF_GLOBAL_SIZE的值,否则会在尝试使用系统函数修改为非法值时,被重置为HJ_BUF_GLOBAL_SIZE/2与100000之间的最小值 建议设置为:300 |
HJ_BLK_SIZE | 2 | 动态,会话级 | HASH连接操作符每次分配缓存(BLK)大小,单位MB。取值范围1~50。该值须小于等于HJ_BUF_SIZE的值,否则会在尝试使用系统函数修改为非法值或在DM.INI中指定为非法值后,被重置为HJ_BUF_SIZE |
HAGR_BUF_GLOBAL_SIZE | 5000 | 动态,系统级 | 分组、嵌套连接、集合运算、分析函数运算、统计信息、DISTINCT、临时表、TOP、ESEND操作符的数据总缓存大小,单位MB。取值范围10~1000000。该值须大于等于HAGR_BUF_SIZE,否则会在尝试使用系统函数修改为非法值或在DM.INI中指定为非法值后,被重置为两倍HAGR_BUF_SIZE和500之间的最大值 |
HAGR_BUF_SIZE | 500 | 动态,会话级 | 单个分组、嵌套连接、集合运算、分析函数运算、统计信息、DISTINCT、临时表、TOP、ESEND操作符的数据总缓存大小,单位MB。取值范围2~500000。该值须小于HAGR_BUF_GLOBAL_SIZE的值,否则会在尝试使用系统函数修改为非法值时,被重置为HAGR_BUF_GLOBAL_SIZE/2与500000之间的最小值 |
HAGR_BLK_SIZE | 2 | 动态,会话级 | 分组、嵌套连接、集合运算、分析函数运算、统计信息、DISTINCT、临时表、TOP、ESEND操作符每次分配缓存(BLK)大小,单位MB。取值范围1~50。该值须小于等于HAGR_BUF_SIZE的值,否则会在尝试使用系统函数修改为非法值或在DM.INI中指定为非法值后,被重置为HAGR_BUF_SIZE |
MTAB_MEM_SIZE | 8 | 动态,系统级 | MTAB缓存BDTA占用内存空间的大小,单位KB,取值范围1~1048576 |
FTAB_MEM_SIZE | 0 | 静态 | FTAB缓存BDTA占用内存空间的大小,单位KB。取值范围为0~64 * 1024。0表示使用MTAB,大于0时才使用FTAB。当取值小于32时,FTAB_MEM_SIZE均使用32。 |
MMT_SIZE | 0 | 动态,会话级 | 是否使用MMT。0:不启用;其他有效值:启用,并确定单个映射文件大小,必须小于MMT_GLOBAL_SIZE。取值范围0~64,单位MB |
MMT_GLOBAL_SIZE | 4000 | 动态,系统级 | 系统总共使用MMT的文件总大小,单位MB,取值范围10~1000000,仅在MMT_SIZE大于0时有效 |
MMT_FLAG | 1 | 动态,会话级 | MMT存储数据方式。1:按页存储;2:BDTA存储。仅在MMT_SIZE大于0时有效 |
DICT_BUF_SIZE | 50 | 静态 | 字典缓冲区大小,单位MB,取值范围1~67108864 |
HFS_CACHE_SIZE | 160 | 动态,系统级 | HUGE表 I/U/D 时HDTA_BUFFER缓存池大小,单位为MB。取值范围160~2000 建议设置为:50 |
VM_STACK_SIZE | 256 | 静态 | 系统执行时虚拟机堆栈大小,单位KB,堆栈的空间是从操作系统中申请的,取值范围64~256*1024) |
VM_POOL_SIZE | 64 | 静态 | 系统执行时虚拟机内存池大小,单位KB,在执行过程中用到的内存大部分是从这里申请的,它的空间是从操作系统中直接申请的,取值范围32~1024*1024 当系统中过程、函数、包等多时,适当放大 建议设置为:256. |
VM_POOL_TARGET | 16384 | 静态 | 虚拟机内存池能扩充到的最大大小,单位KB,取值范围0~10*1024*1024,0表示不限制 |
SESS_POOL_SIZE | 64 | 动态,系统级 | 会话缓冲区大小,单位KB,取值范围16~1024*1024。若所申请的内存超过实际能申请的大小,则系统将按16KB大小重新申请 建议设置为:256 |
SESS_POOL_TARGET | 16384 | 动态,系统级 | 会话缓冲区能扩充到的最大大小,单位KB,取值范围0~10*1024*1024,0表示不限制 |
RT_HEAP_TARGET | 8192 | 动态,系统级 | 会话上用于动态对象存储的RT_HEAP最大可扩展到的大小,单位KB,取值范围8192~10*1024*1024 |
VM_MEM_HEAP | 0 | 动态,系统级 | VM是否使用HEAP分配内存。0:MEMORY POOL模式;1:HEAP模式;2:MEMORY POOL和HEAP混合模式 |
RFIL_RECV_BUF_SIZE | 16 | 静态 | 控制服务器启动时,进行REDO操作过程中,REDO日志文件恢复时BUFFER的大小,单位MB,取值范围16~4000 |
HAGR_DISTINCT_HASH_TABLE_SIZE | 10000 | 动态,会话级 | 分组DISTINCT操作中HASH表的大小(桶数)。取值范围为10000~100000000 |
CNNTB_HASH_TABLE_SIZE | 100 | 动态,会话级 | 指定CNNTB操作符中创建HASH表的大小。取值范围100~100000000 |
GLOBAL_RTREE_BUF_SIZE | 100 | 动态,会话级 | R树全局缓冲区大小,单位MB |
SINGLE_RTREE_BUF_SIZE | 10 | 动态,会话级 | 单个R树的缓冲区大小,单位MB,必须小于GLOBAL_RTREE_BUF_SIZE |
SORT_OPT_SIZE | 0 | 静态 | 整型/浮点型数据排序优化辅助空间大小,单位MB,取值范围0~1024。取值0M时不使用优化;取值1M时对应待排序数组中元素的最大最小差值为262144,超过则不能使用优化 |
TSORT_OPT | 1 | 动态,系统级 | 排序优化选项。0:排序操作一律使用估算的行数分配内存(至少2M);1:打开优化,排序操作结果行数较少时,使用实际的记录行数分配内存 |
BIND_PLN_PERCENT | 30 | 静态 | 固定计划占据计划缓存空间的最大比例,取值范围0~100 |
FBACK_HASH_SIZE | 10000 | 动态,系统级 | 闪回系统中HASH表的桶个数。取值范围10000~1000000 |
XBOX_MEMORY_TARGET | 1024 | 动态,系统级 | XBOX 系统内存在扩充到此大小以上后,空闲时收缩回此指定大小,单位MB。取值范围1024~262144 |
ID_RECYCLE_THRESHOLD | 60 | 静态 | ID重用的开启比例。取值范围0~100。ID使用量超过此比例时,即当(可重用对象已分配的ID数目/非扩展的ID数目)*100>=ID_RECYCLE_THRESHOLD时,开启ID重用;小于ID_RECYCLE_THRESHOLD时,关闭ID重用 |
POOL_CLEAR_FLAG | 0 | 静态 | 内存池释放时是否全部清理,不全部清理时保留TARGET的内存。1:是;0:否 |
REGEX_MEM_LIMIT | 20 | 静态 | 限制对于正则表达式第三方库允许使用的内存上限,单位MB,取值范围0~8102。0表示不限制,当设置值小于10时无效,系统会强制设置为10 |
2.1.1.1.4 线程相关
参数名 | 缺省值 | 属性 | 说明 |
WORKER_THREADS | 16 | 静态 | 并发处理会话连接的线程数量;当打开SESS线程池(即STHD_FLAG=2或3时)时,该值为初始化的SESS线程池的组数量。取值范围1~64 |
TASK_THREADS | 16 | 静态 | 任务线程个数。非DMDSC环境取值范围1~1000;DMDSC环境取值范围16~1000 |
FAST_RW_LOCK | 1 | 静态 | 快速读写锁标记。0:不启用;1:表示只有FAST POOL启用,2:表示所有POOL都启用 |
SPIN_TIME | 4000 | 静态 | 线程在不能进入临界区时,自旋的次数。取值范围0~400000 |
WORK_THRD_STACK_SIZE | 8192 | 静态 | 工作线程堆栈大小,单位KB。取值范围1024~32768 |
WORK_THRD_RESERVE_SIZE | 512 | 静态 | 工作线程预留栈帧大小,单位KB。取值范围200~1024 |
WORKER_CPU_PERCENT | 0 | 静态 | 工作线程占CPU的比重,仅非WINDOWS下有效。取值范围0~100。0表示不限制,相当于100 |
NESTED_C_STYLE_COMMENT | 0 | 动态,系统级 | 是否支持C风格的嵌套注释。0:不支持;1:支持 |
STHD_FLAG | 0 | 静态 | 是否启用ESESS/SESS线程池。取值范围0~3。0:表示关闭;1:表示打开ESESS线程池;2:表示打开SESS线程池;3:表示同时打开ESESS和SESS线程池 |
STHD_THREAD_NUM | 8 | 静态 | 每个SESS/ESESS线程池初始化的线程数量。取值范围1~10000 |
STHD_GRP_NUM | 8 | 静态 | DMDPC专用。初始化的ESESS线程池的组数量。取值范围1~64 |
THRDS_POOL_INIT | 50 | 静态 | 底层线程池初始化的线程数量。取值范围1~65535 |
THRDS_POOL_MAX | 0 | 静态 | 底层线程池最大的线程数量。取值范围0~65535。0表示不限制最大线程数量 |
PTHD_THRD_POOLS | 16 | 静态 | PTHD线程池的组数量。取值范围1~64 |
MAX_SEC_ASYNC_THREADS | 0 | 动态,系统级 | 当参数INDEX_FINS_FLAG取值包含1时,二级索引可能由异步线程维护,该参数用于限制异步处理二级索引使用的线程数量。取值范围0~65535,0表示不限制最大线程数量。 |
ASYNC_THRD_MAX_PERCENT | 100 | 动态,系统级 | 全局异步线程数占所有工作线程数的最大百分比,超过时则不再抛出异步任务,报错处理 |
2.1.1.1.5 查询相关
参数名 | 缺省值 | 属性 | 说明 |
USE_PLN_POOL | 1 | 静态 | 是否重用执行计划。0:禁止执行计划的重用;1:启用执行计划的重用功能 ;2:对不包含显式参数的语句进行常量参数化优化;3:即使包含显式参数的语句,也进行常量参数化优化 建议设置为:1 |
OLAP_FLAG | 2 | 动态,会话级 | 启用联机分析处理,0:不启用;1:启用;2:不启用,同时倾向于使用索引范围扫描 建议设置为:2 |
OPTIMIZER_MODE | 1 | 动态,会话级 | DM优化器的模式,0:老优化器模式;1:新优化器模式 建议设置为:1 |
VIEW_PULLUP_FLAG | 34 | 动态,会话级 | 是否对视图进行上拉优化,把视图转换为其原始定义,消除视图。0:不进行视图上拉优化; 建议设置为:1 |
BATCH_PARAM_OPT | 0 | 静态 | 是否启用批量参数优化,0:不启用;1:启用,默认不启用。当置为1时,不返回操作影响的行数 建议设置为:1 |
其他参数请参考 :
https://eco.dameng.com/document/dm/zh-cn/pm/physical-storage.html#2.1.1.1.5%20%E6%9F%A5%E8%AF%A2%E7%9B%B8%E5%85%B3
2.1.1.1.6 数据库相关
参数名 | 缺省值 | 属性 | 说明 |
|---|---|---|---|
MAX_SESSIONS | 10000 | 静态 | 系统允许同时连接的最大会话数。取值范围 1~150000。 建议设置为:500 |
MAX_SESSION_STATEMENT | 10000 | 动态,系统级 | 单个会话上允许同时打开的语句句柄最大数,取值范围 64~20480) 建议设置为:2000 |
TEMP_SIZE | 10 | 静态 | 默认创建的临时表空间大小,单位 MB。取值范围 10~1048576 建议设置为:1000 |
TEMP_SPACE_LIMIT | 0 | 动态,系统级 | 临时表空间大小上限,单位 MB。0 表示不限制临时表空间大小。 取值范围 0~4294967294。 注:TEMP_SPACE_LIMIT 一定要大于等于 TEMP_SIZE 建议设置为:512000 |
CACHE_POOL_SIZE | 100 | 静态 | SQL 缓冲池大小,单位 MB。取值范围:32 位平台下为 167108864 建议设置为:2000 |
2.1.1.1.7 兼容性相关
参数名 | 缺省值 | 属性 | 说明 |
COMPATIBLE_MODE | 0 | 静态 | 是否兼容其他数据库模式。0:不兼容,1:兼容SQL92标准,2:部分兼容ORACLE,3:部分兼容MS SQL SERVER,4:部分兼容MYSQL,5:兼容DM6,6:部分兼容TERADATA,7:部分兼容POSTGRES 建议设置为:2 |
2.1.1.1.8 MONITOR 监控相关
参数名 | 缺省值 | 属性 | 说明 |
ENABLE_MONITOR | 1 | 动态,系统级 | 用于打开或者关闭系统的监控功能。1:打开;0:关闭 |
2.1.1.1.9 用户请求跟踪相关
参数名 | 缺省值 | 属性 | 说明 |
SVR_LOG | 0 | 动态,系统级 | 是否打开SQL日志功能,0:关闭;1:打开,并按照SQLLOG.INI中的配置来记录SQL日志;2:打开,按文件中记录数量切换日志文件,日志记录为详细模式;3:打开,不切换日志文件,日志记录为简单模式,只记录时间和原始语句 建议设置为:1 |
SVR_LOG_NAME | SLOG_ALL | 动态,系统级 | SQLLOG.INI中预设模式的名称。支持指定多个预设模式名,限制如下: |
SVR_LOG_PLN_STR | 1 | 动态,会话级 | 表明是否在SQL 日志中记录当前SQL的计划 |
2.1.1.1.10 IO 相关
参数名 | 缺省值 | 属性 | 说明 |
DIRECT_IO | 0 | 静态 | 非WINDOWS下有效,0:使用OS文件系统缓存;1:不使用OS文件系统缓存,采用系统模拟的异步IO,异步IO的线程数由IO_THR_GROUP控制;2:不使用OS文件系统缓存,采用系统提供的NATIVE AIO机制, 要求LINUX内核2.6以上 注:此参数应根据应用特征谨慎设置,一般保留默认为0即可 使用 SSD 时推荐为 1 |
2.1.1.2 dmarch.ini
dmarch.ini 用于配置归档。dmarch.ini 的配置项见下表。
项目 | 项目意义 | 字段 | 字段意义 |
全局配置项 | ARCH_WAIT_APPLY | 备库收到Redo日志后,是否需要重演完成后再响应主库。0表示收到马上响应(高性能模式),1表示重演完成后响应(事务一致模式)。配置为即时归档时,缺省值为1;配置为实时归档时,缺省值为0。 | |
ARCH_RESERVE_TIME | 归档日志保留时间,单位分钟,取值范围0~2147483647。只对本地归档有效。服务器每隔5分钟检查是否存在超过保留时间的归档并删除。缺省为0,表示不删除归档 | ||
ARCH_LOCAL_SHARE | DMDSC 集群本地归档是否共享给远程节点作为远程归档。 | ||
ARCH_LOCAL_SHARE_CHECK | 是否进行LOCAL归档和REMOTE归档路径的一致性校验。 | ||
ARCH_SEND_POLICY | 主库发送REALTIME归档的策略,取值0或1,缺省为0。0:主库发送REALTIME归档后立即等待备库响应消息;1:主库发送REALTIME归档后不立即等待备库的响应消息,而是先将当前日志包写入联机日志文件,然后再等待备库响应消息。 | ||
XMAL_HB_INTERVAL | DMDPC专用。节点间通信检测间隔。单位S,取值范围1~600。该参数仅在多副本集群中使用,多副本各实例需配置相同 | ||
RAFT_HB_INTERVAL | DMDPC专用。主库广播心跳消息的间隔时间。单位MS,取值范围5~1800。该参数仅在多副本集群中使用,多副本各实例需配置相同 | ||
RAFT_VOTE_INTERVAL | DMDPC专用。选举超时时间。单位MS,取值范围10~60000。这个配置值需要保证至少是RAFT_HB_INTERVAL的2倍大小,确保在选举超时时间内能够收到主库的心跳消息,避免误判主库故障发起无效选举。建议各实例配置为不同的值,以便能够快速选举出主库,配置的值越小,被选举为主库的优先级越高。该参数仅在多副本集群中使用,并且仅在开启选举开关的实例上有效 | ||
RAFT_SELF_ID | DMDPC专用。多副本节点编号,用于标识多副本RAFT组中不同的节点。取值范围0~31 | ||
RAFT_LEARNER | DMDPC专用。用于标识自己是否为LEARNER角色。1:是,0:否。 参数缺省为0,非LEARNER节点可不配置此参数 | ||
RAFT_PKG_INTERVAL | DMDPC专用。专用于多副本环境中,设置备库接收主库日志包的超时时间。当备库超过该时间还未接收到主库日志包,则备库主动断开与主库连接。单位S,取值范围60~36000。缺省为不配置该参数。可选参数 | ||
[ARCHIVE_LOCAL1] | 本地归档配置 | ARCH_TYPE | 归档类型 |
ARCH_DEST | 归档路径。需要配置在ARCH_TYPE之后 | ||
ARCH_FILE_SIZE | 单个归档文件大小,单位MB,取值范围64~2048,缺省为1024MB,即1G 建议值为:2048 | ||
ARCH_SPACE_LIMIT | 本地归档文件空间限制。当同一节点号的本地归档文件达到限制值时,系统自动删除最早生成的本地归档日志文件。0表示无空间限制,取值范围1024~2147483647,缺省为0,单位MB | ||
ARCH_FLUSH_BUF_SIZE | 归档刷盘缓存大小,单位MB,取值范围0~128。0表示不使用归档刷盘缓存机制。缺省为2 | ||
ARCH_HANG_FLAG | 本地归档写入失败时系统是否挂起。取值范围0~2;缺省为1。 | ||
ARCHIVE_REALTIME | 实时归档配置 | ARCH_TYPE | 归档类型 |
ARCH_DEST | 归档目录实例名。需要配置在ARCH_TYPE之后 | ||
WAIT_APPLY | 若归档目标未配置WAIT_APPLY,则以全局ARCH_WAIT_APPLY为准;若某一个归档目标配置了WAIT_APPLY,则对应归档目标是否是事务一致由配置的WAIT_APPLY为准。取值:0:表示高性能模式;1:表示事务一致模式 | ||
ARCH_STANDBY_APPLY | 是否根据归档目标重演情况确定自身本地归档可删除。取值0:否;1:是。默认值为0 | ||
ARCHIVE_ASYNC | 异步归档 | ARCH_TYPE | 归档类型 |
ARCH_DEST | 归档目录实例名。需要配置在ARCH_TYPE之后 | ||
ARCH_TIMER_NAME | 定时器名称。需要配置在ARCH_TYPE之后 | ||
ARCH_SEND_DELAY | 指定源库到异步备库的归档延时发送时间,单位分钟,取值范围0~1440,缺省为0,表示不启用归档延时发送功能。 | ||
ARCH_STANDBY_APPLY | 是否根据归档目标重演情况确定自身本地归档可删除。取值0:否;1:是。默认值为0 | ||
ARCHIVE_SYNC | 同步归档 | ARCH_TYPE | 归档类型 |
ARCH_DEST | 归档目录实例名。需要配置在ARCH_TYPE之后 | ||
ARCH_RECOVER_TIME | 主库向同步备库发起异步恢复的时间间隔,单位秒,取值范围1~86400,缺省为1,表示主库每隔1秒检查一次同步备库的归档状态,若为INVALID且和同步备库通信正常,则发起异步恢复。 | ||
ARCH_STANDBY_APPLY | 是否根据归档目标重演情况确定自身本地归档可删除。取值0:否;1:是。默认值为0 | ||
ARCHIVE_TIMELY | 即时归档 | ARCH_TYPE | 归档类型 |
ARCH_DEST | 归档目录实例名。需要配置在ARCH_TYPE之后 | ||
WAIT_APPLY | 若归档目标未配置WAIT_APPLY,则以全局ARCH_WAIT_APPLY为准;若某一个归档目标配置了WAIT_APPLY,则对应归档目标是否是事务一致由配置的WAIT_APPLY为准。取值:0:表示高性能模式;1:表示事务一致模式 | ||
ARCH_STANDBY_APPLY | 是否根据归档目标重演情况确定自身本地归档可删除。取值0:否;1:是。默认值为0 | ||
[ARCHIVE_RAFT1] | RAFT归档 | ARCH_TYPE | 归档类型。ARCH_TYPE支持配置为RAFT和LEARNER。其中LEARNER归档仅在动态增删节点时使用 |
ARCH_DEST | 归档目标实例名。需要配置在ARCH_TYPE之后 | ||
ARCH_DEST_ID | 归档目标多副本节点编号,用于标识多副本RAFT组中不同的节点。取值范围0~31 | ||
ARCH_STANDBY_APPLY | 是否根据归档目标重演情况确定自身本地归档可删除。取值0:否;1:是。默认值为0 | ||
REMOTE | 远程归档配置 | ARCH_TYPE | 归档类型 |
ARCH_DEST | 归档目录实例名。需要配置在ARCH_TYPE之后 | ||
ARCH_INCOMING_PATH | 指定远程归档目标ARCH_DEST的本地归档日志文件存放路径。需要配置在ARCH_TYPE之后 | ||
ARCH_RECV_PATH | 修复故障节点归档,直接将联机日志检查点偏移后的所有有效日志拷贝一份写入本地路径 |
相关说明
- 归档类型 ARCH_TYPE 有以下几种:
本地归档 LOCAL(一台主库最多配 8 个)
远程实时归档 REALTIME(一台主库最多配 8 个)
远程异步归档 ASYNC(一台主库最多配 8 个)
同步归档 SYNC(一台主库最多配 8 个)
即时归档 TIMELY(一个主库最多配 8 个)
远程归档 REMOTE(一个主库最多配 8 个)
RAFT 归档 RAFT/LEARNER (一个主库最多配 8 个)
- 配置名[ARCHIVE_*]表示归档名,在配置文件中必须唯一。
- 不能存在相同实例名的不同归档。
- 不能存在 DEST 相同的不同归档实例。
- ARCH_TIMER_NAME 为定制的定时器名称,定时器配置见 dmtimer.ini。
- 对于一个归档配置,ARCH_TYPE 需要配置在 ARCH_DEST、ARCH_TIMER_NAME、ARCH_INCOMING_PATH 之前。
- ARCH_STANDBY_APPLY 参数支持 REALTIME/TIMELY/SYNC/ASYNC/RAFT 归档,如果多个归档目标都配置了此字段,当前库会根据重已重演 LSN 值最小的备库重演信息确定自身本地归档是否可以删除。当主库配置了本地归档文件空间限制参数 ARCH_SPACE_LIMIT,同一节点号的本地归档文件已经达到空间上限,但归档又不满足删除条件的情况下,仍然正常创建新文件,不再做挂起处理,优先保证主库服务不中断。如果备库一直故障,主库从未获取过此备库的 apply 信息,则不允许删除任何日志;如果曾经获取过此备库的 apply 信息,则以此历史信息为准判断是否删除。不要求备库一定和主库配置一致,备库切换主库后,将按照新主库的配置情况来决定如何删除归档,主备切换后,有可能还是会发生归档已经被清理的情况。对于异步备库的级联配置情况,异步备库会根据级联的备库重演情况决定自身的本地归档是否可删除。没有级联配置的备库,不受此参数控制。
- 关于 DSC 环境的本地归档清理规则说明如下:
(1)查询 V$ARCH_FILE 时,DSC 环境不仅会有本地归档还会有远程归档,若是 ASM 环境,还可能查出 DSC 集群其他节点的本地归档和远程归档。本地归档空间上限和远程归档空间上限分开计算。
(2)配置 ARCH_STANDBY_APPLY=1 后,DSC 为备库时,主库归档空间达到上限后,按照 DSC 控制节点的重演情况清理本地归档。
(3)当主库是 DSC 集群,备库生成本地归档时会按照收到日志包的节点号分开保存归档(对于主库是 DSC2 节点的场景,备库收到 0 号节点发送过来的日志包产生的归档文件加入到 0 号归档链表中,备库收到 1 号节点发送过来的日志包产生的归档文件加入到 1 号归档链表中)。两个归档文件链表的空间上限分开计算。若此后又发生主备切换,新主库为单机库的场景,主库生成的新归档文件仅会加入到 0 号归档链表中。
2.1.1.3 sqllog.ini
sqllog.ini 用于 SQL 日志的配置,当且仅当 INI 参数 SVR_LOG=1 时使用。
如果在服务器启动过程中,修改了 sqllog.ini 文件,须调用过程 SP_REFRESH_SVR_LOG_CONFIG()才会生效。
sqllog.ini 配置文件的内容分为全局配置区和模式配置区。
全局配置区为 sqllog.ini 文件头中无模式的配置区。全局配置区内允许配置所有的配置项,包括全局配置项(参数 BUF_TOTAL_SIZE、BUF_SIZE、 BUF_KEEP_CNT)和模式内配置项(除 BUF_TOTAL_SIZE、BUF_SIZE、 BUF_KEEP_CNT 的其他参数)。其中,全局配置项对全部模式生效,配置的参数的优先级为:模式配置区配置的值 > 全局配置区配置的值 > 缺省值。
模式配置区位于全局配置区后面,以“[模式名]”开头,可配置表 2.32 sqllog.ini 的配置项中除了 BUF_TOTAL_SIZE、BUF_SIZE、 BUF_KEEP_CNT 三个参数之外的所有参数,只对本模式生效。
当 SVR_LOG 为 1 时,但 sqllog.ini 不存在,或 sqllog.ini 存在但是配置的多个模式名均不在 INI 参数 SVR_LOG_NAME 中的情况下,按照各配置项的系统默认值记录 SQL 日志。在系统默认值中,模式名为*<*DEFAULT>。
通过动态视图 VDM_SQLLOG_INI和VDM_SQLLOG_CONFIG 可以分别查询 sqllog.ini 文件和内存中的 SQL 日志配置参数,由于视图中使用*<PUBLIC> 来标记全局配置参数,并且使用 <DEFAULT> 来标记系统默认配置,因此 sqllog.ini 中不允许指定模式名为 <PUBLIC> 或 <*DEFAULT>。
sqllog.ini 中可以配置多个模式配置区。不同模式配置区中的配置项(数量或取值)可以不同。例如:记录过滤掩码,刷盘方式,文件切换方式等。当各模式的 items 设置不同时,使用其并集。仅当配置的模式名存在于 INI 参数 SVR_LOG_NAME 中时,该模式名对应配置才会生效。当配置为多模式时,会在日志文件名中的实例名后面加上该日志文件对应的模式名。
2.1.2 客户端配置文件- dm_svc.conf
dm_svc.conf 配置文件的内容分为全局配置区和服务配置区。全局配置区在前,服务配置区在后,以“[服务名]”开头。“服务名”配置项可以在全局配置区,也可以在此服务名对应的服务配置区之前,即在其对应的“[服务名]”之前。
服务配置区中的配置优先级高于全局配置区。全局配置区的配置项影响所有会话,除非会话所属服务配置区中单独进行了配置,因此对于全局配置区配置项的设置修改需要慎重。
# 以#开头的行表示是注释
# 全局配置区
NORMAL=(192.168.0.1:5000,192.168.0.2:5236)
Data_Watch=(192.168.0.3:5236,192.168.0.4:4350)
TIME_ZONE=(480) #表示+8:00时区
DIRECT=(Y)
# 服务配置区
# 常规环境,两个没有关系的IP
[NORMAL]
TIME_ZONE=(540) #表示+9:00时区
LOGIN_MODE=(4)
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
# 服务配置区
# 数据守护环境,一主一备,只连备库
[Data_Watch]
TIME_ZONE=(540) #表示+9:00时区
LOGIN_MODE=(2)
SWITCH_TIMES=(3)
SWITCH_INTERVAL=(100)
2.2 控制文件
每个 DM 数据库都拥有两个控制文件,即 dm.ctl 和 dmtemp.ctl 控制文件,控制文件均为二进制文件。
dm.ctl 用于记录数据库必要的初始信息,主要包含以下内容:
- 数据库名称;
- 数据库服务器模式;
- OGUID 唯一标识;
- 数据库服务器版本;
- 数据文件版本;
- 数据库的启动次数;
- 数据库最近一次启动时间;
- 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
- 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。
dmtemp.ctl 用于记录临时表空间相关信息,主要包括临时表空间名以及临时表空间物理文件路径等。
在服务器运行期间,执行表空间的 DDL 等操作后,服务器内部需要同步修改控制文件内容。
如果在修改过程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内部会执行备份操作。备份策略如下:
- 策略一
在修改控制文件之前,先执行一次备份,确定控制文件修改成功后,再将备份删除,如果控制文件修改失败或中途出现故障,则保留备份文件。 - 策略二
在修改控制文件成功之后,根据 dm.ini 中指定的 CTL_BAK_PATH/CTL_BAK_NUM 对最新的控制文件执行备份,如果用户指定的 CTL_BAK_PATH 是非法路径,则不再生成备份文件,在路径有效的情况下,生成备份文件时根据指定的 CTL_BAK_NUM 判断是否删除老的备份文件。
注意:
- 如果控制文件存放在裸设备上,则【策略一】不会生效。
- 如果指定的 CTL_BAK_PATH 是无效路径,则【策略二】也不会生效。
- 如果【策略一】和【策略二】的条件都满足,则都会生效执行,否则只执行满足条件的备份策略,如果都不满足,则不会再生成备份文件。
- 如果是初始化新库,在初始化完成后,会在“SYSTEM_PATH/CTL_BAK”路径下对原始的控制文件执行一次备份。
2.3 数据文件
数据文件以 DBF 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。
当 DM 的数据文件空间用完时,它可以自动扩展。可以在创建数据文件时通过 MAXSIZE 参数限制其扩展量,当然,也可以不限制。但是,数据文件的大小最终会受物理磁盘大小的限制。在实际使用中,一般不建议使用单个巨大的数据文件,为一个表空间创建多个较小的数据文件是更好的选择。
1)ROLL 文件
ROLL 表空间的 DBF 文件,称为 ROLL 文件。ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。回滚文件可被分为若干回滚段,每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。
2)TEMP 文件
TEMP.DBF 临时数据文件,临时文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。
当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在 TEMP.DBF 文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。
2.4 重做日志文件
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件默认以 log 为扩展名,可在初始化数据库时使用建库参数 RLOG_POSTFIX_NAME 指定重做日志文件的扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启 DM 实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。
重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
2.5 归档日志文件
日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下运行。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。
联机日志文件指的是系统当前正在使用的日志文件。创建数据库时,联机日志文件通常被扩展至一定长度,其内容则被初始化为空,当系统运行时,该文件逐渐被产生的日志所填充。对日志文件的写入是顺序连续的。然而系统磁盘空间总是有限,系统必须能够循环利用日志文件的空间,为了做到这一点,当所有日志文件空间被占满时,系统需要清空一部分日志以便重用日志文件的空间,为了保证被清空的日志所“保护”的数据在磁盘上是安全的,这里需要引入一个关键的数据库概念——检查点。当产生检查点时,系统将系统缓冲区中的日志和脏数据页都写入磁盘,以保证当前日志所“保护”的数据页都已安全写入磁盘,这样日志文件即可被安全重用。
归档日志文件,就是在归档模式下,重做日志被连续写入到归档日志后,所生成了归档日志文件。归档日志文件以归档时间命名,扩展名默认与初始化数据库时指定的参数 RLOG_POSTFIX_NAME 一致,也可通过 INI 参数 LOG_FILE_POSTFIX_NAME 指定归档日志文件的扩展名。只有在归档模式下运行时,DM 数据库才会将重做日志写入到归档日志文件中。采用归档模式会对系统的性能产生影响,然而系统在归档模式下运行会更安全,当出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故障,如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,而如果没有归档日志文件,则只能利用备份进行恢复。
……
关于达梦数据库更多的相关问题请浏览达梦云适配技术社区
达梦云适配技术社区
https://eco.dameng.com/




