目录
达梦数据库
国产达梦数据库在初始化数据库实例时会涉及到数据库标识如端口号的配置,也有页大小、字符集等参数的初始化配置,其中一些参数是作用在数据库实例的整个生命周期内的,一旦初始化不能修改。在实际使用过程中这些参数的不同,可能会对数据存储、查询、分组等存在不同的影响。
兼容模式设置
COMPATIBLE_MODE 参数用于控制 DM 在部分功能处理时与其他数据库管理系统的兼容模式。兼容模式参数值说明:
- 0:不兼容。默认为 0,用户可在 DM.INI 文件中对该参数进行配置。
- 1:兼容 SQL92 标准
- 2:兼容 ORACLE
- 3:兼容 MS SQL SERVER
- 4:兼容 MYSQL
- 5:兼容 DM6
- 6:兼容 TERADATA
- 7:兼容 PG
1. 查询兼容模式
在达梦数据库中,可以通过以下 SQL 查询当前兼容模式:
SELECT para_name, para_value FROM v$dm_ini WHERE para_name = 'COMPATIBLE_MODE';
2. 设置兼容模式
使用 sp_set_para_value 函数设置
sp_set_para_value(0, 'COMPATIBLE_MODE', 4);
使用 ALTER SYSTEM 命令设置
--和上面sp_set_para_value(0, 'COMPATIBLE_MODE', 4);效果一样
ALTER SYSTEM SET 'COMPATIBLE_MODE' = 4 BOTH;
--修改静态文件,这个修改完需要重启才能生效
ALTER SYSTEM SET 'COMPATIBLE_MODE' = 4 SPFILE;
服务管理
1、启动服务
① 切换到 dmdba 用户
su - dmdba
② 进入达梦数据库二进制文件目录
cd /home/dmdba/dmdbms/bin
③ 启动服务
./DmServiceDMSERVER start
2、关闭服务
① 切换到 dmdba 用户
su - dmdba
② 进入达梦数据库二进制文件目录
cd /home/dmdba/dmdbms/bin
3、停止服务
./DmServiceDMSERVER stop
数据库与实例
当同时出现 DM 数据库和实例时,DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等。
实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。简单来说,实例就是操作 DM 数据库的一种手段,是用来访问数据库的内存结构以及后台进程的集合。
DM 数据库存储在服务器的磁盘上,而 DM 实例则存储于服务器的内存中。通过运行 DM 实例,可以操作 DM 数据库中的内容。在任何时候,一个实例只能与一个数据库进行关联(装载、打开或者挂起数据库)。在大多数情况下,一个数据库也只有一个实例对其进行操作。但是在 DM 共享存储集群(DMDSC)中,多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的物理磁盘上)。此时,我们可以同时从多台不同的计算机访问这个数据库。
逻辑存储
在 DM8 中存储的层次结构如下:
-
数据库由一个或多个表空间组成;
-
每个表空间由一个或多个数据文件组成;
-
每个数据文件由一个或多个簇组成;
-
段是簇的上级逻辑单元,一个段可以跨多个数据文件;
-
簇由同一个数据文件中 16 个(默认)或 32 个或 64 个连续的数据页组成;
-
页(16(默认)、32、64个连续页)是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元。
页 → 簇 → 数据文件 → 表空间 → 数据库
表空间
DM 数据库中的所有对象在逻辑上都存放在表空间中,物理上都存储在所属表空间的数据文件中。
DM 数据库中的表空间可以分为普通表空间和混合表空间。普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通(非 HUGE)表和 HUGE 表,其中 HUGE 数据文件存储在混合表空间定义中指定的 HUGE 数据文件路径下。可以通过为普通表空间增加指定 HUGE 数据文件路径将普通表空间升级为混合表空间。
在创建 DM 数据库时,会自动创建 5 个表空间:
-
SYSTEM 表空间
存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。又称为系统表空间。
-
ROLL 表空间
完全由 DM 数据库自动维护。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
-
MAIN 表空间
MAIN 表空间在初始化库时会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径,因此 MAIN 表空间为混合表空间。创建用户时如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认表空间。
-
TEMP 表空间
完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
-
HMAIN表空间
由dm数据库自动维护,当用户创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。
表空间有联机和脱机两种状态。系统表空间、回滚表空间、重做日志表空间和临时文件表空间不允许脱机,不允许修改数据缓冲区。
每一个用户都有一个默认表空间。对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认表空间是 SYSTEM,SYSDBA 默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为默认表空间。如果用户创建表时,指定了存储表空间 A,但是和当前用户的默认表空间 B 不一致时,表存储在用户指定的表空间 A 中,并且默认情况下,在这张表上面建立的索引也将存储在 A 中,但是用户默认表空间不变仍为 B。
一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。
//用户可以通过执行如下语句来查看 SYSTEM、ROLL、MAIN 以及 TEMP 的表空间相关信息。
SELECT * FROM V$TABLESPACE;
//查询表空间与数据文件对应关系
SELECT ts.NAME, df.PATH FROM V$TABLESPACE AS ts, V$DATAFILE AS df WHERE ts.ID= df.GROUP_ID;
段
同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的 16 或者 32 个数据页。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。
-
数据段
段可以被定义成特定的对象的数据结构,如表数据段或索引数据段。dm以簇为单位给每个数据段分配空间,当数据段的簇空间完全用完时,dm数据库就给该段重新分配簇。段的分配和释放完全数据库自动完成,可以在创建对象时设置参数来决定数据段的簇如何分配。
当用户使用 CREATE 语句创建表/索引时,DM 创建相应的数据段。表/索引的存储参数用来决定对应数据段的簇如何被分配,这些参数将会影响与对象相关的数据段的存储与访问效率。对于分区表,每个分区使用单独的数据段来容纳所有数据,对于分区表上的非分区索引,使用一个索引数据段来容纳所有数据,而对于分区索引,每个分区使用一个单独索引数据段来容纳其数据。表的数据段和与其相关的索引段不一定要存储在同一表空间中,用户可以在创建表和索引时,指定不同的表空间存储参数。
-
临时段
所有的临时段都在temp表空间中,这样可以分流磁盘设备的io,也可以减少由于在其它表空间频繁创建临时数据段而造成的碎片。
当处理一个查询时,经常需要为 SQL 语句的解析与执行的中间结果准备临时空间。DM 数据库会自动地分配临时段的磁盘空间。例如,DM 在进行排序操作时就可能需要使用临时段,当排序操作可以在内存中执行,或设法利用索引就可以执行时,就不必创建临时段。对于临时表及其索引,DM 数据库也会为它们分配临时段。
临时段的分配和释放完全由系统自动控制,用户不能手工进行干预。
-
回滚段
dm数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更。在数据库恢复阶段,回滚记录被用来做任何未提交变更的回滚。在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询。
DM 数据库提供了
全自动回滚管理机制
来管理回滚信息和回滚空间,自动回滚管理消除了管理回滚段的复杂性。此外,系统将尽可能保存回滚信息,来满足用户查询回滚信息的需要。事务被提交后,回滚数据不能再回滚或者恢复,但是从数据读一致性的角度出发,长时间运行查询可能需要这些早期的回滚信息来生成早期的数据页镜像,基于此,数据库需要尽可能长时间的保存回滚信息。DM 数据库会收集回滚信息的使用情况,并根据统计结果对回滚信息保存周期进行调整,数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长
簇
簇的大小由用户在创建数据库时指定,默认大小为 16。假定某个数据文件大小为 32MB,页大小为 8KB,则共有 32MB/8KB/16=256 个簇,每个簇的大小为 8K*16=128K。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。一个簇以及该簇所包含的数据页只能来自一个文件。
分配数据簇:
当创建一个表/索引的时候,DM 为表/索引的数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,供后续操作使用。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,DM 数据库将自动分配新的簇。在缺省情况下,DM 数据库在创建表/索引时,初始分配 1 个簇,当初始分配的空间用完时,DM 数据库会自动扩展。 当 DM 数据库的表空间为新的簇分配空闲空间时,首先在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配;如果各数据文件都没有空闲簇,则在各数据文件中查找空闲空间足够的,将需要的空间先进行格式化,然后进行分配;如果各文件的空闲空间也不够,则选一个数据文件进行扩充。 对于创建普通表和索引,DM8提供了几个和簇的存储参数:
-
初始簇数目INITIAL:
建立表时分配的簇个数(默认为1),1<INITIAL<256
-
下次分配簇数目NEXT:
指当表空间不够时,从数据文件中分配的簇个数(默认为1),1<NEXT<256;
-
最小保留簇数目MINEXTENTS:
当删除表中的记录后,如果表使用的簇数目小于这个值(默认为1),就不再释放表空间,1<MINEXTENTS<256;
释放数据簇:
对于用户数据表空间:在删除表/索引对象中的记录的时候,DM数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用。
truncate table删除表中所有记录的时候会保留表结构和表上的约束及索引信息。因此会留下1~2个簇供后续使用。
drop table/index删除表对象的时候,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。
对于临时表空间:DM数据库会自动释放在执行SQL过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。需要注意的是,临时表空间文件在磁盘所占大小并不会因此而缩减,用户可以通过系统函数SF_RESET_TEMP_TS来进行磁盘空间的清理。
对于回滚表空间:DM数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇。
页(数据块)
数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,DM 数据库中页大小可以为 4KB、8KB(默认)、16KB、32KB,用户在创建数据库时可以指定,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。下图显示了 DM 数据库页的典型格式。
页头控制信息包含了关于页类型、页地址等信息。
行偏移数组用于标识页上的空间占用情况以便管理数据页自身的空间。
在绝大多数情况下,用户都无需干预DM数据库对数据页的管理。不过,DM数据库还是提供了选项供用户选择。对于普通表和索引DM8提供了一个用于管理数据页填充比例的存储参数:
填充比例FILLFACTOR:指定插入数据时数据页的可用空间百分比,取值范围从0到100(默认值为0,等价于100),其余的空间被称为可扩展空间。可扩展空间可供页内的数据更新时使用。插入数据时填充比例的值越低,可由新数据使用的空间就越多;更新数据时填充比例的值越大,更新导致出现的页分裂的几率越大。
当插入的数据占据的数据页空间百分比低于FILLFACTOR时,允许数据插入该页,否则将当前数据页中的数据分为两部分,一部分保留在当前数据页中,另一部分存入一个新页中。
为了提高更新数据的性能,可以设置一个相对较低(但不是过低)的FILLFACTOR值,使得后续执行更新操作时,可以尽量避免数据页的分裂,提升I/O性能,不过这是以牺牲空间利用率来换取性能的提高。
记录
数据库中的每一行是一条记录。在DM中,除了huge表,其它的表都是在数据页中按记录存储数据的。也就是说记录是存储在数据页中的,记录并不是dm数据库的存储单位,页才是。而由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。除此之外,数据页还包含了页头控制信息等空间,因此dm规定每条记录的总长度不能超过页大小的一半。
物理存储架构
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:
用于进行功能设置的配置文件;
用于记录文件分布的控制文件;
用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;
用来进行问题跟踪的跟踪日志文件等
配置文件
配置文件是DM数据库用来设置功能选项的一些文本文件的集合,配置文件以ini为扩展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的目标:
-
启用/禁用特定功能项;
-
针对当前系统运行环境设置更优的参数值以提升系统性
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()对参数值进行修改。
dmmal.ini
dmmal.ini是MAL系统的配置文件。需要用到MAL环境的实例,所有站点dmmal.ini需要保证严格一致。
MAL系统是DM内部高速通信系统,基于TCP/IP协议实现。服务器的很多重要功能都是通过MAL系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL系统内部包含一系列线程,有MAL监听线程、MAL发送工作线程、MAL接收工作线程等。
dmarch.ini
dmarch.ini用于本地归档和远程归档。配置项如下:
相关说明 1. 归档类型 ARCH_TYPE 有以下几种: 本地归档 LOCAL(一台主库最多配 8 个) 远程实时归档 REALTIME(一台主库最多配 8 个) 远程异步归档 ASYNC(一台主库最多配 8 个) 同步归档 SYNC(一台主库最多配 8 个) 即时归档 TIMELY(一个主库最多配 8 个) 远程归档 REMOTE(一个主库最多配 8 个) RAFT 归档 RAFT/LEARNER (一个主库最多配 8 个) 2. 配置名[ARCHIVE_*]表示归档名,在配置文件中必须唯一。 3. 不能存在相同实例名的不同归档; 4. 不能存在 DEST 相同的不同归档实例; 5. ARCH_TIMER_NAME 为定制的定时器名称,定时器配置见 dmtimer.ini; 6. ARCH_SPACE_LIMIT 表示归档文件的磁盘空间限制,如果归档文件总大小超过这个值,则在生成新归档文件前会删除最老的一个归档文件。
dmsvc.conf
dm_svc.conf 是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能生效。
初始 dm_svc.conf 文件在 DM 安装时自动生成。不同平台的生成目录有所不同。
32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
在 Linux 平台下,此文件位于/etc 目录。
可以通过设置操作系统环境变量 DM_SVC_PATH 来修改 dm_svc.conf 文件路径。
sqllog.ini
以dmsql_数据库实例名.log类型命名的文件为跟踪日志文件
sqllog.ini用于sql日志的配置。当把INI参数SVR_LOG设置为1,才会打开SQL日志。
如果在服务器启动过程中,修改了sqllog.ini文件。修改之后的文件,只要调用过程SP_REFRESH_SVR_LOG_CONFIG() 就会生效。
SVR_LOG(动态,系统级)是否打开SQL日志功能
-
0:表示关闭;
-
1:表示打开;
-
2:按文件中记录数量切换日志文件,日志记录为详细模式;
-
3:不切换日志文件,日志记录为简单模式,只记录时间和原始语句。
其他
dmrep.ini 用于配置复制实例,详见DBA手册“数据复制”章节
dmllog.ini 用于配置逻辑日志,详见DBA手册“数据复制”章节
dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息,或者数据复制中记录异步复制的定时器信息。
控制文件
使用dmctlcvt工具将dm.ctl转换为文本文件才能查看它的内容。查看控制文件内容:
/home/dmdba/dmdbms/bin/dmctlcvt type=1 src=/dm8/dmdata/DMDB/dm.ctl dest=/tmp/dmctl1.txt
每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:
-
数据库名称;
-
数据库服务器模式;
-
OGUID 唯一标识;
-
数据库服务器版本;
-
数据文件版本;
-
数据库的启动次数;
-
数据库最近一次启动时间;
-
表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
-
控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。
在服务器运行期间,执行表空间的 DDL 等操作后,服务器内部需要同步修改控制文件内容。如果在修改过程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内部会执行备份操作。备份策略如下:
-
策略一
在修改 dm.ctl 之前,先执行一次备份,确定 dm.ctl 修改成功后,再将备份删除,如果 dm.ctl 修改失败或中途出现故障,则保留备份文件。
-
策略二
在修改 dm.ctl 成功之后,根据 dm.ini 中指定的 CTL_BAK_PATH/CTL_BAK_NUM 对最新的 dm.ctl 执行备份,如果用户指定的 CTL_BAK_PATH 是非法路径,则不再生成备份文件,在路径有效的情况下,生成备份文件时根据指定的 CTL_BAK_NUM 判断是否删除老的备份文件。
注意: 如果 dm.ctl 文件存放在裸设备上,则【策略一】不会生效。 如果指定的 CTL_BAK_PATH 是无效路径,则【策略二】也不会生效。 如果【策略一】和【策略二】的条件都满足,则都会生效执行,否则只执行满足条件的备份策略,如果都不满足,则不会再生成备份文件。 如果是初始化新库,在初始化完成后,会在“SYSTEM_PATH/CTL_BAK”路径下对原始的 dm.ctl 执行一次备份。
数据文件
数据文件以 dbf 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方。
可以在创建数据文件时通过 MAXSIZE参数限制其扩展量,当然,也可以不限制。举例如下:
create tablespace "DMTBS" datafile '/dm8/data/DMDB/DMTBS01.DBF' size 64 autoextend on next 2 maxsize 10240, '/dm8/data/DMDB/DMTBS02.DBF' size 64 autoextend on next 2 maxsize 10240 CACHE = "NORMAL";
create tablespace "DMTBS" datafile 'D:\dmdbms\data\DAMENG\DMTBS01.DBF' size 64 autoextend on next 2 maxsize 10240, 'D:\dmdbms\dat\DAMENG\DMTBS02.DBF' size 64 autoextend on next 2 maxsize 10240 CACHE = "NORMAL";
在实际使用中,一般不建议使用单个巨大的数据文件,为一个表空间创建多个较小的数据文件是更好的选择。
数据文件按数据组织形式,可以分为如下几种:
-
B 树数据
行存储数据,也是应用最广泛的存储形式,其数据是按 B 树索引组织的。普通表、分区表、B 树索引的物理存储格式都是 B 树。
一个 B 树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。其 B 树的逻辑关系由段内页面上的记录,通过文件指针来完成。
当表上没有指定聚集索引时,系统会自动产生一个唯一标识 rowid 作为 B 树的 key 来唯一标识一行。
-
堆表数据
堆表的数据是以挂链形式存储的,一般情况下,支持最多 128 个链表,一个链表在物理上就是一个段,堆表采用的是物理 rowid,在插入过程中,rowid 在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高,且由于 rowid 是即时生成,无需保存在物理磁盘上,也节省了空间。
-
列存储数据
数据按列方式组织存储,包含每个列对应的存放列数据的一系列数据文件,以及存放列数据控制信息的辅助表。读取列数据时,只需要顺序扫描列数据文件和辅助表数据。在某些特殊应用场景下,其效率要远远高于行存储。
-
位图索引
位图索引与 B 树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。
数据文件中还有两类特殊的数据文件:ROLL 和 TEMP 文件。
-
ROLL 文件
ROLL 表空间的 dbf 文件,称为 ROLL 文件。ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。回滚文件可被分为若干回滚段,每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。
-
TEMP 文件
TEMP.DBF 临时数据文件,临时文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。
当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在 TEMP.DBF 文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。
-
重做日志文件
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件默认以 log 为扩展名,可在初始化数据库时使用建库参数 RLOG_POSTFIX_NAME 指定重做日志文件的扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启 DM 实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。
重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
归档日志文件
日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下运行。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。
联机日志文件指的是系统当前正在使用的日志文件。创建数据库时,联机日志文件通常被扩展至一定长度,其内容则被初始化为空,当系统运行时,该文件逐渐被产生的日志所填充。对日志文件的写入是顺序连续的。然而系统磁盘空间总是有限,系统必须能够循环利用日志文件的空间,为了做到这一点,当所有日志文件空间被占满时,系统需要清空一部分日志以便重用日志文件的空间,为了保证被清空的日志所“保护”的数据在磁盘上是安全的,这里需要引入一个关键的数据库概念——检查点。当产生检查点时,系统将系统缓冲区中的日志和脏数据页都写入磁盘,以保证当前日志所“保护”的数据页都已安全写入磁盘,这样日志文件即可被安全重用。
归档日志文件,就是在归档模式下,重做日志被连续写入到归档日志后,所生成了归档日志文件。归档日志文件以归档时间命名,扩展名默认与初始化数据库时指定的参数 RLOG_POSTFIX_NAME 一致,也可通过 INI 参数 LOG_FILE_POSTFIX_NAME 指定归档日志文件的扩展名。只有在归档模式下运行时,DM 数据库才会将重做日志写入到归档日志文件中。采用归档模式会对系统的性能产生影响,然而系统在归档模式下运行会更安全,当出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故障,如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,而如果没有归档日志文件,则只能利用备份进行恢复。
逻辑日志文件
如果在 DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式,且不在第一章所述的页,簇和段的管理之下。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。详细内容请看“数据复制”章节。
物理逻辑日志文件
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 DBMS_LOGMNR 包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内容会被存储在重做日志文件中。
要开启物理逻辑日志的功能,需要满足下面两个条件:
首先,要设置 RLOG_APPEND_LOGIC 为 1、2、3 或者 4;
其次,通过设置参数 RLOG_IGNORE_TABLE_SET=1 或者建表(或修改表)时指定 ADD LOGIC LOG 开启。如果需要记录所有表的物理逻辑日志,设置 INI 参数 RLOG_IGNORE_TABLE_SET 为 1 即可;如果只需要记录某些表的物理逻辑日志,设置 INI 参数 RLOG_IGNORE_TABLE_SET 为 0,并在建表或者修改表的语法中使用 ADD LOGIC LOG。
备份文件
备份文件以 bak 为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。然而,从来没有哪个数据库系统能够保证永远正确无误地运行,当数据库不幸出现故障时,备份文件就显得尤为重要了。
当客户利用管理工具或直接发出备份的 SQL 命令时,DM Server 会自动进行备份,并产生一个或多个备份文件,备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。同时,系统还会自动记录备份信息及该备份文件所处的位置,但这种记录是松散的,用户可根据需要将其拷贝至任何地方,并不会影响系统的运行。
SQL 日志文件
用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志。
SQL 日志文件是一个纯文本文件。命名格式为 dmsql_实例名[_模式名][_用户名][_日期_时间].log
。当 sqllog.ini 中存在多个有效模式名时,日志文件名中会添加 “_模式名”
,否则不添加;当 sqllog.ini 参数 PART_STOR=1 时,日志文件名中会添加 “_用户名
”,否则不添加;当 sqllog.ini 参数 SWITCH_MODE 不为 0 时,日志文件名中会添加“_日期_时间”
,否则不添加。
SQL 日志文件缺省生成在 DM 安装目录的 log 子目录下,可通过 sqllog.ini 参数 FILE_PATH 设置生成路径。
SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的 SQL 语句,进而对其进行优化。
系统中 SQL 日志的缓存是分块循环使用,管理员可根据系统执行的语句情况及压力情况设置恰当的日志缓存块大小及预留的缓冲块个数。当预留块不足以记录系统产生的任务时,系统会分配新的用后即弃的缓存块,但是总的空间大小由 sqllog.ini 参数 BUF_TOTAL_SIZE 控制,管理员可根据实际情况进行设置。
打开 SQL 日志会影响系统的性能,因此一般在需要查错和调优的时候才会打开。缺省情况下系统是关闭 SQL 日志的。若用户需要打开 SQL 日志,同时对日志的实时性并没有严格的要求,又希望系统性能好,此时可以从两方面进行改进:一设置 sqllog.ini 参数 SQL_TRACE_MASK 和 MIN_EXEC_TIME 只记录关注的相关记录,减少日志总量;二设置 sqllog.ini 参数 ASYNC_FLUSH 打开 SQL 日志异步刷盘提高系统性能。
用户可以调用系统过程 SP_SET_SQLLOG_INI()或 SP_DELETE_SQLLOG_INI_MODE()来动态修改 sqllog.ini 文件的内容,修改后可以调用系统过程 SP_REFRESH_SVR_LOG_CONFIG()更新内存中对应的参数值,使修改生效。
利用动态视图 V$DM_SQLLOG_INI
可以查询 sqllog.ini 文件中的 SQL 日志配置参数,
利用动态视图 V$DM_SQLLOG_CONFIG
可以查询内存中的 SQL 日志配置参数。
事件日志文件
事件日志文件记录了 DM 数据库运行时的关键事件。例如:系统启动、关闭、内存申请失败、IO 错误等一些致命错误;数据库运行过程中的日志信息;备份还原过程中备份还原操作的阶段性信息等。
事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志简称 ELOG。事件日志文件随着 DM 数据库服务的运行一直存在。
事件日志文件打印的是中间步骤的信息,所以出现部分缺失属于正常现象。事件日志信息格式为:时间 + 日志类型(INFO/WARNING/ERROR/FATAL)+ 进程(database)+ 进程 ID(P 开头)+ 线程(dm_sql_thd/main_thread 等)+ 日志内容。
初始化过程中产生的 ELOG 会保存在 ELOG_PATH 参数指定的目录下,名称为“dmini+ 日期 + 时间”。例如:dminit20220914090452.log。
系统启动和运行过程中产生的 ELOG 保存在系统 log 目录下。
系统启动时,如遇到 dm.key、dm.ini 不存在等原因无法正常启动,因尚未获取到实例名,因此将生成的事件日志文件命名为“dm_unknown_年月”。例如:dm_unknown_202212。
当 ELOG_FLAG 设为 1 时,数据库运行过程中的事件日志都记录在名为“dm_实例名”的日志文件中,如 dm_DMSERVER.log。
当 ELOG_FLAG 设为 0 时,事件日志会被拆分记录到多个带有时间后缀的日志文件中。下图 展示了 ELOG_FLAG 设为 0 时,9 月份的月度日志和分时日志。运行过程中,ELOG 日志文件的生成分两步完成:
-
系统将所有 ELOG 内容生成到当月的月度 ELOG 日志文件中,命名为“dm实例名年月”。例如:9 月的月度 ELOG 日志文件为 dm_DMSERVER_202209.log。
-
当符合 SVR_ELOG_FREQ 切换频率的切换点来临时,系统将月度 ELOG 日志文件中最近生成的(1 月/1 日/1 时)日志,剪切并归档到新的(分月/分日/分时)ELOG 日志文件中,命名为“dm实例名日期_整点”,其中后缀中的整点为该日志首条记录的时间。不论切换频率为月、日或时,切换的时间点均为某时 0 分。例如:设置 SVR_ELOG_FREQ=2 按小时切换,则归档后的分时 ELOG 日志文件名为 dm_DMSERVER_20220914_09.log。