数据库和实例:
在达梦(DM)数据库中,数据库和实例的概念是广义和狭义并存的,理解这些概念可以帮助我们更好地管理和使用数据库系统。
1、广义和狭义的数据库概念
广义概念
当我们提到“DM 数据库”时,可能有多种含义:
-
DM 数据库产品:指的是整个达梦数据库管理系统(DBMS)软件,包括所有的工具、实用程序和服务。
-
运行中的 DM 数据库实例:指的是达梦数据库软件在内存中运行时的进程,它管理数据库的操作。
-
物理文件集合:指的是达梦数据库运行所需的一系列物理文件,如数据文件、日志文件、控制文件、临时文件等。
狭义概念
当我们在特定语境下同时提到DM 数据库和实例时,它们的含义更加明确:
-
DM 数据库:指的是存储在磁盘上的数据集合,包含数据文件、日志文件、控制文件和临时数据文件等。
-
实例:指的是在内存中运行的数据库管理进程,负责管理这些磁盘上的数据文件。
2、具体组成部分
数据库
当狭义提到数据库时,它主要包括以下几个部分:
-
数据文件(.BDF):存储数据库的实际数据。
-
日志文件(.log):记录数据库的事务日志,用于恢复数据。
-
控制文件(.ctl):记录数据库的结构信息和状态信息。
-
临时数据文件:用于存储临时数据,如排序操作的中间结果。
实例
实例是在内存中的进程/线程,负责管理和操作数据库,包括:
-
系统全局区:内存结构,存储数据库的共享数据和控制信息。
-
后台进程:多个进程协同工作,负责数据库的读写、日志记录、恢复等操作。
3、实例与数据库的关系
-
实例是数据库的管理者,它在内存中运行,管理数据库的所有操作。
-
数据库是实例管理的对象,是存储在磁盘上的数据集合。
4、总结
-
DM 数据库产品是指达梦数据库管理系统整体。
-
数据库实例是在内存中运行的进程,负责管理和操作数据库。
-
数据库是存储在磁盘上的数据集合,包含数据文件、日志文件、控制文件和临时数据文件。
-
实例和数据库的关系是管理与被管理的关系,实例管理磁盘上的数据库文件。
达梦数据库逻辑存储结构
在 DM 数据库中,存储的层次结构由多个层级组成,每个层级都有其特定的功能和作用。我们来逐一讲解这些概念。
1、数据库(Database)
数据库是一个逻辑集合,包含所有的数据和元数据。它是整个数据存储系统的顶层单位。
2、表空间(Tablespace)
在 DM 数据库中,表空间是数据存储的逻辑单位,每个表空间由一个或多个数据文件组成。所有数据库对象在逻辑上存放在表空间中(如表、视图、函数、索引等),物理上则存储在表空间的数据文件中,表空间有助于数据库管理员将数据存储在不同的物理位置。
表空间类型
-
普通表空间:不能存储 HUGE 表。
-
混合表空间:可以同时存储普通(非 HUGE)表和 HUGE 表。
系统自动创建的表空间
-
SYSTEM 表空间:存放数据库字典信息,用户不能在其中创建表和索引。
-
ROLL 表空间:自动维护,用于存放事务操作前的值,提供数据的读一致性。
-
MAIN 表空间:混合表空间,默认用户表空间。如果创建用户时没有指定表空间,默认使用 MAIN 表空间。
-
TEMP 表空间:自动维护,用于临时操作,如排序和中间结果集。
用户和默认表空间
-
系统用户 SYS、SYSSSO、SYSAUDITOR 的默认表空间是 SYSTEM。
-
SYSDBA 的默认表空间是 MAIN。
-
新用户默认表空间是 MAIN,除非另有指定。
创建和管理表空间
建议用户创建自己的表空间来存放业务数据,也可以使用默认的 MAIN 表空间。
查询表空间信息
可以通过以下语句查看系统表空间信息:
SELECT * FROM V$TABLESPACE;
这个查询结果提供了表空间的详细信息。
示例说明
假设创建了一个新的表空间和一个表:
-- 创建一个新的表空间
CREATE TABLESPACE USER_DATA DATAFILE 'USER_DATA.BDF' SIZE 128;
-- 在新表空间中创建一个表
CREATE TABLE STUDENTS (
STUDENT_ID INT PRIMARY KEY,
NAME VARCHAR(50),
AGE INT
) TABLESPACE USER_DATA;
在这个例子中,USER_DATA
表空间中STUDENTS
表对象的数据存储在USER_DATA.BDF数据文件中,可以帮助我们有效管理和组织数据。
3、数据文件(Datafile)
数据文件是表空间的物理存储单位。每个表空间可以包含一个或多个数据文件,这些文件实际存储表空间中的数据。
示例:
在创建表空间时,我们指定了数据文件。
CREATE TABLESPACE STUDENT_DATA DATAFILE 'STUDENT_DATA.BDF' SIZE 100;
# STUDENT_DATA.BDF这个就是数据文件
4、记录
记录:数据库表中的每一行数据称为一条记录。每条记录包含多个字段,比如一个学生表中的一条记录可能包括学生的 ID、姓名、年龄等信息。
记录和数据页的关系:
-
记录存储在数据页中:除了 HUGE 表,其他表中的数据都是按记录存储在数据页中的。也就是说,一条记录实际上是存储在某个数据页内。
-
记录长度限制:由于记录不能跨页存储,所以记录的长度受到数据页大小的限制。DM 数据库规定,每条记录的总长度不能超过页面大小的一半。这是因为数据页中还包含了页头控制信息等空间。
举个例子:
-
学生表的记录:假设有一个学生表,其中有一条记录,这条记录存储在一个数据页中。
# 表数据:
STUDENT_ID: 1
NAME: 'Alice'
AGE: 20
-
数据页的示例:假设数据页的大小是 8KB,那么每个数据页中可以存储多条记录。如果每条记录的长度是 1KB,那么一个数据页可以存储 8 条记录。
为什么记录不能跨页存储:
-
效率和一致性:记录不能跨页存储有助于提高数据库的访问效率和保证数据的一致性。因为一个数据页可以在一次 IO 操作中被读取或写入,而跨页存储会导致多个 IO 操作,增加复杂性和开销。
5、页(数据页)
数据页(也称数据块)是 DM 数据库中最小的数据存储单元,也是数据库中使用的最小的 IO 单元。。页的大小对应物理存储空间上特定数量的存储字节,数据页的大小可以影响数据库的性能和存储效率。
数据页的组成:
数据页中除了存储记录,还包含一些页头控制信息、行偏移数组。
-
页头控制信息:
-
包含页类型、页地址等信息。
-
用于管理和识别数据页。
-
-
数据存储区:
-
存放实际的数据记录。
-
是数据页的主要部分。
-
-
行偏移数组:
-
位于数据页的尾部。
-
用于记录数据在页中的位置,帮助管理数据页的空间利用情况。
-
示例:数据页的典型结构
+-----------------+
| 页头控制信息 |
+-----------------+
| 数据存储区 |
| (数据记录) |
+-----------------+
| 行偏移数组 |
+-----------------+
示例说明:创建表并插入数据:
-- 创建学生表
CREATE TABLE STUDENTS (
STUDENT_ID INT PRIMARY KEY,
NAME VARCHAR(50),
AGE INT
);
-- 插入一条记录
INSERT INTO STUDENTS (STUDENT_ID, NAME, AGE) VALUES (1, 'Alice', 20);
在这个示例中,我们创建了一个 STUDENTS
表,并插入了一条记录。这条记录将存储在某个数据页中。
总结:
-
记录:数据库表中的每一行数据。
-
数据页:DM 数据库中最小的存储和 IO 单元。
-
记录存储在数据页中:记录不能跨页存储,记录的长度受到数据页大小的限制。
-
数据页包含控制信息:除了记录,数据页还包含页头控制信息等。
6、簇(Extent)
在 DM 数据库中,簇是数据页的上级逻辑单元,由同一个数据文件中连续的数据页组成,也就是每个簇中的页在磁盘上是连续存放的。
簇的大小和分配
-
簇的大小由用户在创建数据库时指定,默认大小为 16 个数据页。
-
一旦创建好数据库,簇的大小就不能改变。
分配数据簇
-
当创建表或索引时,DM 会为数据段分配至少一个簇,并自动生成对应数量的空闲数据页。
-
如果初始分配的簇中的数据页用完,或者需要更多空间,DM 数据库会自动分配新的簇。
释放数据簇
-
在删除表或索引对象时,DM 数据库会释放相应的簇空间。
-
对于用户数据表空间,删除表中的所有记录后,仍会保留几个簇供后续使用。
-
对于临时表空间,执行 SQL 过程中产生的临时段会被自动释放。
-
对于回滚表空间,DM 数据库定期检查回滚段,并根据需要释放簇空间。
-
示例:簇的分配和释放:
假设有一个数据文件大小为 32MB,页大小为 8KB,簇大小为 16 个数据页。共有 256 个簇,每个簇的大小为 128KB。在数据库运行期间,当需要存储新的数据时,DM 数据库会按照以下步骤进行簇的分配:
-
初始分配:在创建表或索引时,DM 分配至少一个簇给数据段,并生成相应数量的空闲数据页。
-
空间不足:如果初始分配的簇中的数据页不足,或者需要更多空间,DM 会自动分配新的簇。
-
簇空间释放:在删除表或索引对象时,DM 数据库会释放相应的簇空间,并标记为可用空间。
7、段(Segment)
段是簇的上级逻辑单元。一个段可以跨多个数据文件,由多个簇组成(段是一组簇的集合,可以跨越多个数据文件。段就像一个更大的盒子,这个大盒子里装着多个簇,而每个簇又装着数据页),段是数据库中存储对象数据的基本单位,段通常用于表示某种特定的数据结构,如表段、索引段等。
举个例子
-
簇的例子:如果你有一个簇,它就像是一个装着 16 或 32 页纸的文件夹,这些页是连续的。
-
段的例子:段就像是一个书架,书架上有很多文件夹(簇),这些文件夹可能来自不同的房间(数据文件)。
DM 数据库中的段的类型
-
数据段
-
表数据段:存储表的数据。创建一个表时,会生成一个表数据段,所有的表数据都存储在这个段中。
-
索引数据段:存储索引的数据。创建一个索引时,会生成一个索引数据段,所有的索引数据都存储在这个段中。
-
DM 数据库以簇为单位分配空间给每个数据段,当数据段的簇空间用完时,数据库会重新分配簇,段的分配和释放完全由数据库自动完成。
-
-
临时段
-
所有的临时段都创建在临时表空间中,这样可以分流磁盘设备的 I/O,并减少碎片。
-
临时段用于存储处理查询时的中间结果,例如排序操作,数据库会自动分配和释放临时段的磁盘空间。
-
-
回滚段
-
DM 数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。
-
回滚段为用户提供读一致性,以及在数据库恢复阶段执行未提交变更的回滚操作。
-
数据库提供全自动的管理机制来管理段的分配和释放,用户无需手动干预。
层次结构总结
-
数据库是最高层次的逻辑单位,包含一个或多个表空间。
-
表空间是数据库中的逻辑存储单位,由一个或多个数据文件组成。
-
数据文件是表空间的物理存储单位,实际存储数据。
-
簇是数据文件中的逻辑存储单元,由连续的页组成。
-
段是簇的上级逻辑单元,可以跨多个数据文件,由多个簇组成。
-
页是最小的存储和 IO 单元,是数据库操作的基本单位。
达梦数据库物理存储结构
DM 数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等,如图所示。
1、配置文件
配置文件是 DM 数据库用来设置功能选项的一些文本文件的集合,配置文件以 ini 为扩展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值来达成如下两个方面的目标:
-
启用/禁用特定功能项;
-
针对当前系统运行环境设置更优的参数值以提升系统性能。
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()
对参数值进行修改。当动态修改 dm.ini 参数文件时,如果遇到磁盘空间不足导致系统崩溃的情况,需要手动使用 dm.ini 文件所在目录下的 dm.ini.dmbak 文件恢复 dm.ini,并重启服务器。
当手动修改 dm.ini 参数文件且将 dm.ini 中的某参数值设置为非法值时,若设置值与参数类型不兼容,则参数实际取值为默认值;若设置值小于参数取值范围的最小值,则实际取值为最小值;若设置值大于参数取值范围的最大值,则实际取值为最大值。
当动态修改 ini 参数且设置参数为非法值时,包括设置值与参数类型不兼容、设置值小于参数取值范围的最小值、设置值大于参数取值范围的最大值三种情况,均进行报错处理。
通过这个文件,可以设置数据库服务器的各种功能和性能选项。以下是 dm.ini
文件的一些关键配置项和它们的作用:
-
数据库实例名:
INSTANCE_NAME
,设置数据库实例的名称,需要保证在数据守护系统中全局唯一。 -
监听端口:
PORT_NUM
,定义数据库实例监听的端口号,通常范围是 1024 到 65534。 -
守护进程端口:
DW_PORT
,服务器监听守护进程连接请求的端口。 -
错误时间设置:
DW_ERROR_TIME
,服务器认定守护进程未启动的时间,单位为秒,默认为 60 秒。 -
修改数据库模式状态:
ALTER_MODE_STATUS
,是否允许手工修改数据库的模式和状态,1 表示允许,0 表示不允许。 -
表空间离线设置:
ENABLE_OFFLINE_TS
,是否允许离线表空间,1 表示允许,0 表示不允许,2 表示禁止备库。 -
日志重演时间限制:
REDOS_MAX_DELAY
,备库重演日志的时间限制,超过此限制服务器自动宕机。 -
日志预加载设置:
REDOS_PRE_LOAD
,备库重演日志时预加载的 RLOG_BUF 数,以加快 Redo 日志重演速度。 -
归档发送和应用监控:
RLOG_SEND_APPLY_MON
,统计主库到备库的归档发送时间和备库重演日志的时间。
dm.ini
文件的配置项分为几种类型,包括只读参数(READ ONLY)、系统级动态参数(SYS)、静态参数(IN FILE)和会话级动态参数(SESSION)。不同类型的参数对数据库的影响和修改方式有所不同。例如,只读参数不能通过系统函数或命令语句修改,而系统级动态参数可以立即生效。
管理员可以通过控制台工具、系统函数或直接编辑 dm.ini
文件来查看和修改参数。但是,某些修改需要重启数据库实例才能生效。正确配置 dm.ini
对于优化数据库性能和确保数据库的稳定性非常重要。
2、dmmal.ini配置文件
dmmal.ini 是 MAL 系统的配置文件。需要用到 MAL 环境的数据库实例,所有站点 dmmal.ini 需要保证严格一致。
MAL 系统是基于 TCP 协议实现的一种内部通信机制,具有可靠、灵活、高效的特性。DM 通过 MAL 系统实现 Redo 日志传输,以及其他一些实例间的消息通讯。
在达梦数据库中,很多重要的功能都是通过MAL系统来实现通信的。以下是MAL系统的主要功能:
-
数据守护:MAL系统用于数据守护进程之间的通信,确保数据的安全性和一致性。
-
数据复制:在数据复制过程中,MAL系统负责实例站点间的通信,以实现数据的实时同步。
-
远程日志归档:MAL系统还负责远程日志归档的功能,将REDO日志发送到集群中的其他实例。
-
内部通信机制:MAL系统是达梦数据库内部通信机制的一部分,包含多个线程,如监听线程、发送工作线程、接收工作线程等,以支持各种服务和功能的通信。
3、dmarch.ini配置文件
dmarch.ini
是达梦数据库的配置文件之一,它用于设置和管理数据库的归档操作。归档是数据库维护过程中的一个重要环节,它涉及到将数据库的事务日志(REDO日志)保存到一个安全的位置,以便在数据恢复或灾难恢复时使用。以下是 dmarch.ini
文件的一些关键作用和配置项:
-
归档类型:
dmarch.ini
配置文件允许用户定义归档的类型,例如本地归档(LOCAL)或实时归档(REALTIME)。 -
归档目的地:用户可以指定归档文件存放的路径(
ARCH_DEST
),这可以是本地文件系统上的目录,也可以是远程数据库实例的名称。 -
归档文件大小:通过设置
ARCH_FILE_SIZE
参数,可以控制每个归档文件的最大大小,通常以兆字节(MB)为单位。 -
归档空间限制:使用
ARCH_SPACE_LIMIT
参数,用户可以设定归档文件占用空间的上限,以避免归档数据占用过多磁盘空间。 -
定时器配置:对于异步归档,
dmarch.ini
可以与dmtimer.ini
配合使用,通过dmtimer.ini
设置归档操作的定时任务。
4、dm_svc.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 文件路径。
dm_svc.conf
是达梦数据库中一个重要的客户端配置文件,它用于定义客户端如何连接到数据库服务,包括服务名、连接参数等。以下是 dm_svc.conf
文件的一些关键作用和配置项:
-
服务名定义:文件中可以定义一个或多个服务名,每个服务名关联一组数据库实例的 IP 地址和端口号。
-
读写分离:通过配置文件可以实现读写分离,即读操作可以被路由到备库,而写操作则路由到主库。
-
故障自动切换:
dm_svc.conf
可以配置故障检测和自动切换逻辑,以便在主库发生故障时自动连接到备库。 -
连接模式:可以设置连接模式,比如只连接主库、只连接集群的主控节点或者只连接集群的第一个节点。
-
连接参数:文件中可以配置各种连接参数,如超时时间、重试次数、加密连接等。
-
配置生效:对
dm_svc.conf
文件的修改需要重启客户端程序才能生效。
5、sqllog.ini配置文件
sqllog.ini
是达梦数据库中用于配置 SQL 日志记录的文件。它允许数据库管理员根据需要来定制 SQL 日志的详细程度和记录方式。以下是 sqllog.ini
文件的一些关键配置项和它们的作用:
-
SQL_TRACE_MASK :定义了需要记录的 SQL 语句的类型,通过位掩码的方式控制记录哪些类型的 SQL 语句。
-
FILE_NUM :指定了总共记录多少个日志文件,超过这个数量后,新生成的日志文件会替换掉最早的日志文件。
-
SWITCH_MODE :定义了日志文件的切换模式,可以是按记录数量、文件大小或时间间隔来切换。
-
SWITCH_LIMIT :根据
SWITCH_MODE
的设置,这个参数定义了日志文件切换的具体限制,如记录条数或文件大小。 -
ITEMS :定义了 SQL 日志记录中需要包含哪些列的信息。
-
USER_MODE 和 USERS :允许根据用户来过滤 SQL 日志,可以指定只记录特定用户的 SQL 日志或排除特定用户的日志。
-
MIN_EXEC_TIME :定义了记录 SQL 语句的最小执行时间阈值,只有执行时间超过这个阈值的 SQL 语句才会被记录。
-
ASYNC_FLUSH :定义了日志刷盘的模式,可以选择异步刷盘或实时刷盘。
-
FILE_PATH :指定了日志文件存放的路径。
-
BUF_TOTAL_SIZE 和 BUF_SIZE :定义了 SQL 日志缓冲区的总大小和单个缓冲区的大小。
-
BUF_KEEP_CNT :定义了 SQL 日志缓冲区保留的数量。
-
PART_STOR :表示 SQL 日志是否进行分区存储。
sqllog.ini
文件的配置需要根据实际的监控和分析需求来设定。配置完成后,通过设置 INI 参数 SVR_LOG=1
来启用 SQL 日志记录功能。如果需要立即生效配置的更改,可以调用 SP_REFRESH_SVR_LOG_CONFIG()
过程。正确的配置可以帮助数据库管理员更好地监控和分析数据库的性能和活动。
6、dmthrd.ini配置文件
dmthrd.ini
是达梦数据库的一个配置文件,它的作用是用于将不同类型的线程绑定到特定的 CPU 核心上。这种绑定可以优化数据库的性能,通过确保关键线程始终获得必要的 CPU 资源来提高系统的响应速度和吞吐量。dmthrd.ini
文件的配置仅在达梦数据库的dm.ini配置文件中 参数 DMTHRD_INI
设置为 1 时才会生效。
当启用线程绑定时,数据库管理员可以根据系统的具体硬件配置和工作负载特性,精细控制数据库线程的行为,例如,可以将日志写入线程或查询处理线程绑定到特定的核心上,以减少上下文切换和提高 CPU 缓存的命中率。
正确配置 dmthrd.ini
可以显著提高数据库在高并发环境下的性能,尤其是在多核处理器系统上。然而,需要注意的是,线程绑定可能需要根据具体的硬件和操作系统环境进行调整,以实现最优的配置。
7、dmrep.ini配置文件
dmrep.ini
是达梦数据库中用于配置数据复制的参数文件。数据复制是数据库系统中的一种重要功能,用于实现数据的同步或异步复制,保证数据的高可用性和灾难恢复能力。
8、dmllog.ini配置文件
dmllog.ini
是达梦数据库(DM,DaMeng Database)中用于配置数据复制日志的文件。在达梦数据库的数据复制过程中,复制日志记录了所有需要复制到备库的变更操作。
9、dmtimer.ini配置文件
dmtimer.ini 用于配置定时器,用于数据守护中记录异步备库的定时器信息或数据复制中记录异步复制的定时器信息。以下是 dmtimer.ini
文件的一些关键作用和配置项:
-
定时任务配置:
dmtimer.ini
允许用户定义定时执行的任务,例如,可以设置定时备份、定时归档或者定时同步等操作。 -
定时器名称:每个定时任务都有一个名称,如
[TIMER_NAME]
,用于在配置文件中标识不同的定时任务。 -
定时器调度类型:
TYPE
参数定义了定时器的调度类型,例如,可以是一次性执行、按日执行、按周执行、按月执行等。 -
执行频率:
FREQ_MONTH_WEEK_INTERVAL
、FREQ_SUB_INTERVAL
和FREQ_MINUTE_INTERVAL
参数用于定义执行的频率,如每天、每周或每月的间隔。 -
开始和结束时间:
START_TIME
和END_TIME
参数定义了定时任务的开始和结束时间。 -
有效日期范围:
DURING_START_DATE
和DURING_END_DATE
参数定义了定时任务的有效日期范围。 -
是否结束标记:
NO_END_DATE_FLAG
参数用于标记定时任务是否在到达结束日期后停止执行。 -
定时器描述:
DESCRIBE
参数提供了对定时任务的描述,有助于用户理解定时任务的目的。 -
定时器有效标记:
IS_VALID
参数用于控制定时任务是否启用,0 表示关闭定时器,1 表示启用定时器。
dmtimer.ini
文件的配置对于自动化数据库的维护任务至关重要,可以减少人工干预,提高数据库管理的效率和可靠性。管理员需要根据具体的业务需求和系统架构来合理配置该文件中的参数。
2、控制文件
每个 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 执行一次备份。
3、数据文件
数据文件以 .DBF 为扩展名,它是数据库中最重要的文件类型,一个 DM 数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方,每个数据库至少有一个与之相关的数据文件。在实际应用中,通常有多个数据文件。
当 DM 的数据文件空间用完时,它可以自动扩展。可以在创建数据文件时通过 MAXSIZE 参数限制其扩展量,当然,也可以不限制。但是,数据文件的大小最终会受物理磁盘大小的限制。在实际使用中,一般不建议使用单个巨大的数据文件,为一个表空间创建多个较小的数据文件是更好的选择。
数据文件在物理上按照页、簇和段的方式进行管理,详细结构请前面的内容。
数据文件按数据组织形式,可以分为如下几种:
-
B 树数据
行存储数据,也是应用最广泛的存储形式,其数据是按 B 树索引组织的。普通表、分区表、B 树索引的物理存储格式都是 B 树。
一个 B 树包含两个段,一个内节点段,存放内节点数据;一个叶子段,存放叶子节点数据。其 B 树的逻辑关系由段内页面上的记录,通过文件指针来完成。
当表上没有指定聚集索引时,系统会自动产生一个唯一标识 rowid 作为 B 树的 key 来唯一标识一行。
-
堆表数据
堆表的数据是以挂链形式存储的,一般情况下,支持最多 128 个链表,一个链表在物理上就是一个段,堆表采用的是物理 rowid,在插入过程中,rowid 在事先已确定,并保证其唯一性,所以可以并发插入,插入效率很高,且由于 rowid 是即时生成,无需保存在物理磁盘上,也节省了空间。
-
列存储数据
数据按列方式组织存储,包含每个列对应的存放列数据的一系列数据文件,以及存放列数据控制信息的辅助表。读取列数据时,只需要顺序扫描列数据文件和辅助表数据。在某些特殊应用场景下,其效率要远远高于行存储。
-
位图索引
位图索引与 B 树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。
数据文件中还有两类特殊的数据文件:ROLL 和 TEMP 文件。
1)ROLL 文件
ROLL 表空间的 dbf 文件,称为 ROLL 文件。ROLL 文件用于保存系统的回滚记录,提供事务回滚时的信息。回滚文件可被分为若干回滚段,每个事务的回滚页在回滚段中各自挂链,页内则顺序存放回滚记录。
2)TEMP 文件
TEMP.DBF 临时数据文件,临时文件可以在 dm.ini 中通过 TEMP_SIZE 配置大小。
当数据库查询的临时结果集过大,缓存已经不够用时,临时结果集就可以保存在 TEMP.DBF 文件中,供后续运算使用。系统中用户创建的临时表也存储在临时文件中。
4、重做日志文件
重做日志(即 REDO 日志)指在 DM 数据库中添加、删除、修改对象,或者改变数据,DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。重做日志文件默认以 log 为扩展名,可在初始化数据库时使用建库参数 RLOG_POSTFIX_NAME 指定重做日志文件的扩展名。每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为 DAMENG01.log、DAMENG02.log,这两个文件循环使用。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
重做日志文件主要用于数据库的备份与恢复。理想情况下,数据库系统不会用到重做日志文件中的信息。然而现实世界总是充满了各种意外,比如电源故障、系统故障、介质故障,或者数据库实例进程被强制终止等,数据库缓冲区中的数据页会来不及写入数据文件。这样,在重启 DM 实例时,通过重做日志文件中的信息,就可以将数据库的状态恢复到发生意外时的状态。
重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在 DM 数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。
5、归档日志文件
日志文件分为联机日志文件和归档日志文件。DM 数据库可以在归档模式和非归档模式下运行。非归档模式下,数据库会只将重做日志写入联机日志文件中进行存储;归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件中分别进行存储。
联机日志文件指的是系统当前正在使用的日志文件。创建数据库时,联机日志文件通常被扩展至一定长度,其内容则被初始化为空,当系统运行时,该文件逐渐被产生的日志所填充。对日志文件的写入是顺序连续的。然而系统磁盘空间总是有限,系统必须能够循环利用日志文件的空间,为了做到这一点,当所有日志文件空间被占满时,系统需要清空一部分日志以便重用日志文件的空间,为了保证被清空的日志所“保护”的数据在磁盘上是安全的,这里需要引入一个关键的数据库概念——检查点。当产生检查点时,系统将系统缓冲区中的日志和脏数据页都写入磁盘,以保证当前日志所“保护”的数据页都已安全写入磁盘,这样日志文件即可被安全重用。
归档日志文件,就是在归档模式下,重做日志被连续写入到归档日志后,所生成了归档日志文件。归档日志文件以归档时间命名,扩展名默认与初始化数据库时指定的参数 RLOG_POSTFIX_NAME 一致,也可通过 INI 参数 LOG_FILE_POSTFIX_NAME 指定归档日志文件的扩展名。只有在归档模式下运行时,DM 数据库才会将重做日志写入到归档日志文件中。采用归档模式会对系统的性能产生影响,然而系统在归档模式下运行会更安全,当出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故障,如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,而如果没有归档日志文件,则只能利用备份进行恢复。
6、逻辑日志文件
如果在 DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式。
逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。
7、物理逻辑日志文件
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 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。
8、备份文件
备份文件以 bak 为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。然而,从来没有哪个数据库系统能够保证永远正确无误地运行,当数据库不幸出现故障时,备份文件就显得尤为重要了。
当客户利用管理工具或直接发出备份的 SQL 命令时,DM Server 会自动进行备份,并产生一个或多个备份文件,备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。同时,系统还会自动记录备份信息及该备份文件所处的位置,但这种记录是松散的,用户可根据需要将其拷贝至任何地方,并不会影响系统的运行。
9、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 日志配置参数。
10、事件日志文件
事件日志文件记录了 DM 数据库运行时的关键事件。例如:系统启动、关闭、内存申请失败、IO 错误等一些致命错误;数据库运行过程中的日志信息;备份还原过程中备份还原操作的阶段性信息等。
事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志简称 ELOG。事件日志文件随着 DM 数据库服务的运行一直存在。
事件日志文件打印的是中间步骤的信息,所以出现部分缺失属于正常现象。事件日志信息格式为:时间 + 日志类型(INFO/WARNING/ERROR/FATAL)+ 进程(database)+ 进程 ID(P 开头)+ 线程(dm_sql_thd/main_thread 等)+ 日志内容。
初始化过程中产生的 ELOG 会保存在 ELOG_PATH 参数指定的目录下,名称为“dminit+ 日期 + 时间”。例如:dminit20220914090452.log。
系统启动和运行过程中产生的 ELOG 保存在系统 log 目录下。
系统启动时,如遇到 dm.key、dm.ini 不存在等原因无法正常启动,因尚未获取到实例名,因此将生成的事件日志文件命名为"dm_unknown_年月"。例如:dm_unknown_202212。
当 ELOG_FLAG 设为 1 时,数据库运行过程中的事件日志都记录在名为"dm_实例名"的日志文件中,如 dm_DMSERVER.log。
当 ELOG_FLAG 设为 0 时,事件日志会被拆分记录到多个带有时间后缀的日志文件中。运行过程中,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。
大家想学习达梦数据库或者解决报错问题,可以去达梦数据库社区地址(https://eco.dameng.com)
制作不易,各位看官如果觉得还可以,对您有帮助,请给小弟一键三连鼓励一下,后续还会继续保持