【赵渝强老师】达梦数据库的物理存储结构

达梦数据库由硬盘上的文件组成,而要读写数据需要通过达梦实例来完成。那么,达梦数据库是如何存储数据的呢?要搞清楚这个问题,就需要理解什么是达梦数据库的存储结构。达梦数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库,还是NoSQL数据库在存储结构上,都是通过逻辑存储结构来管理物理存储结构。

视频讲解如下
【赵渝强老师】达梦数据库的物理存储结构

达梦数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。典型的物理存储结构包括:用于进行功能设置的配置文件;用于记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等。

下面分别介绍这些DM数据库的物理文件。

一、 配置文件

配置文件是DM数据库用来设置功能选项的一些文本文件的集合,配置文件以ini为扩展名,它们具有固定的格式,用户可以通过修改其中的某些参数取值可以启用或者禁用特定功能项;也可以针对当前系统运行环境设置更优的参数值以提升系统性能。这里介绍两个比较重要的配置文件dm.ini和sqllog.ini。

(1)dm.ini

每创建一个DM数据库,就会自动生成dm.ini文件。dm.ini是DM数据库启动所必须的配置文件,通过配置该文件可以设置DM数据库服务器的各种功能和性能选项。设置的参数分为三种:静态参数、动态参数和手动参数。

  • 静态参数可以被动态修改,但修改后重启服务器才能生效。
  • 动态参数可以被动态修改,修改后即时生效。
  • 手动参数不能被动态修改,必须手动修改dm.ini参数文件,然后重启才能生效。
sql 复制代码
其中:
动态修改是指DBA用户可以在数据库服务器运行期间,通过调用以下的系统过程对参数值进行修改:
SP_SET_PARA_VALUE()
SP_SET_PARA_DOUBLE_VALUE()
SP_SET_PARA_STRING_VALUE()

在dm.ini配置文件中一共有500多个初始化参数,涉及的方面包括:控制文件相关参数、实例名、内存相关参数、线程相关参数、查询相关参数、检查点相关参数、 IO相关参数 、数据库相关参数等。下表列举了dm.ini文件中控制文件相关参数和实例名的相关参数。

(2)sqllog.ini

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

二、 控制文件

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

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

通过执行下面的语句可以查看当前数据库实例对应的控制文件。

sql 复制代码
SQL> select para_name,para_value from v$dm_ini where para_name='CTL_PATH';

# 输出的信息如下:
行号     		PARA_NAME PARA_VALUE                           
---------- --------- -------------------------------------
1          	CTL_PATH  /home/dmdba/dmdbms/data/DAMENG/dm.ctl

三、 数据文件

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

通过执行下面的语句可以查看当前数据库实例对应的数据文件。

sql 复制代码
SQL> select group_id,path from v$datafile;

# 输出的的信息如下
行号     GROUP_ID    PATH                                       
---------- ----------- -------------------------------------------
1          0           /home/dmdba/dmdbms/data/DAMENG/SYSTEM.DBF
2          1           /home/dmdba/dmdbms/data/DAMENG/ROLL.DBF
3          3           /home/dmdba/dmdbms/data/DAMENG/TEMP.DBF
4          4           /home/dmdba/dmdbms/data/DAMENG/MAIN.DBF
5          5           /home/dmdba/dmdbms/data/DAMENG/BOOKSHOP.DBF
6          6           /home/dmdba/dmdbms/data/DAMENG/DMHR.DBF

# 这里的GROUP_ID为对应于的表空间ID。

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

sql 复制代码
SQL> alter tablespace DMHR add datafile \
'/home/dmdba/dmdbms/data/DAMENG/DMHR02.dbf' size 128;

四、 重做日志文件

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

通过执行下面的语句可以查看当前数据库实例对应的重做日志文件。

sql 复制代码
SQL> select path from v$rlogfile;

# 输出的信息如下:
行号     PATH                                       
---------- -------------------------------------------
1          /home/dmdba/dmdbms/data/DAMENG/DAMENG01.log
2          /home/dmdba/dmdbms/data/DAMENG/DAMENG02.log

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

重做日志文件对于数据库是至关重要的。它们用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复。在DM数据库运行过程中,任何修改数据库的操作都会产生重做日志,例如,当一条元组插入到一个表中的时候,插入的结果写入了重做日志,当删除一条元组时,删除该元组的事实也被写了进去,这样,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态。下图展示了DM数据库写入数据的过程。

五、 归档日志文件

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

执行下面的语句可以查看当前数据库实例的日志模式。

sql 复制代码
SQL> select arch_mode from v$database;

# 输出的信息如下:
行号     		ARCH_MODE
---------- ---------
1         	 	N

# 在默认情况下,DM数据库是非归档模式。

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

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

六、 逻辑日志文件

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

七、 物理逻辑日志文件

物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于DBMS_LOGMNR包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内容会被存储在重做日志文件中。要开启物理逻辑日志的功能,需要满足下面两个条件:

  1. 设置RLOG_APPEND_LOGIC为1、2或者3;
  2. 通过设置参数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会自动进行备份,并产生一个或多个备份文件,备份文件自身包含了备份的名称、对应的数据库、备份类型和备份时间等信息。同时,系统还会自动记录备份信息及该备份文件所处的位置,但这种记录是松散的,用户可根据需要将其拷贝至任何地方,并不会影响系统的运行。

九、 跟踪日志文件

用户在dm.ini中配置SVR_LOG和SVR_LOG_SWITCH_COUNT参数后就会打开跟踪日志。跟踪日志文件是一个纯文本文件,以"dmsql_实例名_日期_时间"命名,默认生成在DM安装目录的log子目录下面,管理员可通过ini参数SVR_LOG_FILE_PATH设置其生成路径。

跟踪日志内容包含系统各会话执行的SQL语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的SQL语句,进而对其进行优化。

十、 事件日志文件

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

十一、 数据重演文件

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

相关推荐
Full Stack Developme2 小时前
SQL 版本历史
数据库·sql
杰克逊的日记4 小时前
mysql数据实时全量+增量迁移
数据库·mysql·数据迁移
linuxxx1105 小时前
centos7 升级MariaDB 到 10.5 或更高版本
数据库·mariadb
换个网名有点难5 小时前
django怎么配置404和500
数据库·django
Adellle6 小时前
MySQL
数据库·后端·mysql
就是有点傻6 小时前
C# 中实现一个线程持续读取,另一个线程负责写入,且写入时读取线程暂停
数据库·c#
云观秋毫6 小时前
试试智能体工作流,自动化搞定运维故障排查
运维·数据库·自动化
是沫沫子耶7 小时前
mysql实例
数据库
比钻石还闪亮的nan人7 小时前
CentOS 7下安装PostgreSQL 15
数据库·postgresql
Full Stack Developme7 小时前
SQL 集合运算
数据库·sql