注册
DM数据库体系结构——第一部分学习记录
培训园地/ 文章详情 /

DM数据库体系结构——第一部分学习记录

OK小魏 2026/06/30 435 1 0

数据库和实例的概念

  • 数据库:在DM数据库中,指存放在磁盘上的数据集合,一般包括:数据文件、日志文件、控制文件 以及临时数据文件等。
  • 实例:一组正在运行的DM后台进程/线程以及一个大型的共享内存组成。用来访问数据库内存结构以及后台进程的集合。

逻辑存储结构

所有数据库内部对象存放在表空间中。表空间进一步划分为段、簇、页(块)。细分使得DM数据库高效控制磁盘空间利用率。
image.png

表空间

分为普通表空间和混合表空间。

  • 普通表空间不能存储HUGE表。
  • 混合表空间可以同时存储普通表和HUGE表。

5个自动创建的表空间:

  • SYSTEM表空间,存放数据字典,系统表空间,用户无法建表和索引。
  • ROLL表空间,DM数据库自行维护,存放事务运行过程中执行DML操作之前的值。
  • RLOG表空间,初始化数据库时会自动创建两个后缀名为log的日志文件,用于存放重做日志。
  • MAIN表空间,初始化数据库时,自动创建一个大小为128M的数据文件,MAIN.DBF,以及一个HMAIN的目录作为HUGE数据文件路径,MAIN表空间为混和表空间。创建用户时没有指定默认表空间,则默认指定为MAIN表空间为用户默认表空间。
  • TEMP表空间(no log in,不记录日志信息,无法还原),数据库自动维护,SQL语句需要磁盘空间完成操作时(如创建索引、内存不足以完成排序等),从TEMP表空间分配临时段。

当表空间不足时,参考以下三种方式进行处理。

1.扩展数据文件

alter tablespace "TEST" resize datafile 'TEST01.DBF' to 2000;

2.增加数据文件

alter tablespace "TEST" add datafile '/dm8/data/DAMENG/TEST02.DBF' size 100 autoextend on next 1 maxsize 2000;

3.开启自动增长

alter tablespace "TEST" datafile 'TEST01.DBF' autoextend on next 1 maxsize 2000;

1、数据段(create语句建表或者索引的时候分配)

  • 表段
  • 索引段

2、回滚段(在回滚表空间中)

3、临时段(在临时表空间中,分配和释放完全由系统自动控制)

簇是页的上级逻辑单元,由一个数据文件中16个或32个或64个连续的数据页组成,簇的大小由用户在创建数据库时指定,默认大小为16。

如何计算一个数据文件包含多少个簇?

数据文件大小 ➗ 页大小 ➗簇包含的页数=数据文件包含的簇的数量

数据簇的分配

建表或者索引时,会分配至少一个簇,同时自动生成对应数量的空闲数据页。

当初始分配空间耗尽时,DM数据库会自动扩展。

数据簇释放

drop之前会至少保留一个簇不被回收。drop语句会回收段中包含的全部簇。

页是DM数据库中最小的数据存储单元,大小可以为4、8、16、32KB,默认是8KB。页在数据库的整个生命周期中无法修改。

物理存储结构

DM数据库使用了大量的物理存储结构来保存和管理用户数据。

  • 配置文件(dm.ini):进行功能配置
  • 控制文件(dm.ctl):记录文件分布
  • 数据文件、重做日志文件、归档日志文件、备份文件:保存用户实际数据
  • 日志文件:进行问题跟踪

配置文件

dm.ini

DM数据库启动所必须的配置文件,可以直接查看,用来配置数据库服务器的各种功能和性能选项。

参数属性分为三种:手动、静态和动态。

  • 手动:只能在dm.ini文件中修改,重启才能生效。
  • 静态:可以被动态修改,但也是重启才能生效。
  • 动态:可以被动态修改,分为系统级和会话级。会话级参数修改后,只影响当前会话和新建的会话,旧会话不受影响。系统级参数则影响所有会话。

控制文件

每个DM数据库包含两个控制文件,dm.ctl和dmtemp.ctl。均为二进制文件,无法直接查看。但是可以通过dmctlcvt转换成文本查看。

dmctlcvt type=1 src=dm.ctl dest=ctl.txt

其中type=1,意思是将ctl转换成txt。

dm.ctl用于记录数据库必要的初始信息。

  1. 数据库名称
  2. 数据库服务器模式
  3. OGUID唯一标识
  4. 数据库服务器版本
  5. 数据文件版本
  6. 数据库启动次数
  7. 数据库最近一次启动时间
  8. 表空间信息(表空间名称、ID、创建时间、修改时间、文件路径等)
  9. 控制文件校验码

dmtemp.ctl用于记录临时表空间相关信息,主要包括临时表空间名以及临时表空间物理文件路径等。

数据文件

数据文件以DBF为扩展名。

重做日志文件(REDO日志)

DM数据库中添加、删除、修改对象,或者改变数据, DM 都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。默认是log作为扩展名。可以通过RLOG_POSTFIX_NAME参数自定义扩展名。每个DM数据库实例至少有2个重做日志文件。默认dbname01.log、dbname02.log。

特点:

  1. 循环使用
  2. 只能增加日志组,但是不能删除
  3. 各日志文件大小一致
  4. 文件状态为“活动”和“不活动”两种

归档日志文件

在归档模式下, 数据库会同时将重做日志写入联机日志文件(REDO日志也叫联机日志文件)和归档日志文件中分别进行存储。

内存结构

内存结构分为内存池、缓冲区、排序区、哈希区

内存池

共享内存池
  1. 启动时按照MEMORY_POOL参数值,向操作系统申请内存;
  2. 用于维护数据库系统内部内存分配与释放;
  3. 参数MEMORY_EXTENT_SIZE指定共享内存池每次扩展的大小,单位MB;
  4. 参数MEMORY_TARGET指定共享内存池超出该值后,空闲时收缩到的大小。

不依赖操作系统内存管理,减少对操作系统内存的调用。

运行时内存池
  1. 一些功能模块运行时会使用自己的运行时内存池。
  2. 这些内存池从操作系统申请,作为本功能模块内存池使用,如会话内存池,虚拟机内存池等。

缓冲区

分为数据缓冲区、日志缓冲区、字典缓冲区、SQL缓冲区。

数据缓冲区

磁盘数据页在内存中的镜像(读取和写入)

日志缓冲区

存放重做日志内容的缓冲区

  1. 重做日志比数据页IO优先级更高
  2. 由RLOG_BUF_SIZE参数进行控制,大小必须为2的N次幂。
  3. 该缓冲区的内存从共享池中申请。
字典缓冲区

存储一些数据字典信息,如模式、表、列、触发器等信息。

  1. 由DICT_BUF_SIZE控制大小,默认5M
  2. 采用LRU算法(LRU(Least Recently Used,最近最少使用)算法是一种常用的缓存淘汰策略,它的核心思想是:当缓存空间满了,需要淘汰一个数据时,优先淘汰最近最少被访问的数据。)
  3. 系统表到内存中的映射
  4. 加速对数据字典信息的查询
SQL缓冲区

提供SQL执行时所需要的内存,包括执行计划、SQL语句和结果集缓存

  • 由CACHE_POOL_SIZE确定SQL缓冲区大小
  • 开启结果集缓存,需要RS_CAN_CACHE=1且USE_PLN_POOL非0

排序区

提供数据排序所需要的内存空间

  1. SORT_BUF_SIZE参数决定大小
  2. 每次排序,先申请内存,排序结束后释放内存
  3. 当排序缓冲区内存不足时,会申请使用temp表空间

哈希区

为哈希连接而设定的缓冲区

  1. 虚拟缓冲区
  2. 由HJ_BUF_SIZE参数控制大小,该值可能影响哈希连接效率。

线程结构

DM服务器使用单进程、多线程结构。

DM进程中主要包括监听线程、IO线程、工作线程、调度线程、日志线程等。

监听线程

在服务器端口上监听,当有客户端的连接请求时,监听线程会生成一个会话申请任务,加入工作线程的任务队列。监听线程在系统启动完成后才启动,在系统关闭时首先关闭。

工作线程

核心线程,负责各种类型任务的处理,以及所有实际的数据相关操作。工作线程包括任务工作线程和会话工作线程等。

任务工作线程

负责处理服务器内部生成并加入任务队列的各项任务,初始个数由TASK_THREADS 指定。当任务队列中的任务堆积时,系统 会增加任务工作线程数量以减少任务堆积。

会话工作线程

负责处理会话的请求任务,分为非线程池模式和线程池模式。由STHD_FLAG控制。

非线程池模式

下每一个会话对应一个会话工作线程,一个会话上的任务 全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。

线程池模式

初始工作线程个数由参数WORKER_THREADS*STHD_THREAD_NUM 指定,由会话轮询 线程接收所有用户请求,加入会话任务队列,会话工作线程从会话任务队列依次摘取请求任 务进行处理。

IO线程

IO操作相对耗时,把IO操作从工作线程中分离出来。IO线程负责处理这些IO操作。

  1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
  2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
  3. 检查点到来时,需要将所有脏数据页写入磁盘。

IO线程只有在系统需要进行IO时,被唤醒并处理请求,处理完成进入睡眠状态。

IO线程个数可以配置,dm.ini文件中的IO_THR_GROUPS参数,默认是8个。

调度线程

接管系统中所有需要定时调度的任务,每秒轮询一次。

  1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到任务工作线程的任务 队列由任务工作线程执行;
  2. 清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
  3. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
  4. 自动执行检查点。
  5. 会话超时检测。
  6. 必要时执行数据更新页刷盘;
  7. 唤醒等待的工作线程。

日志FLUSH线程

用于把保留在日志缓冲区的REDO日志进行刷盘。

日志归档线程

日志归档包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由 日志FLUSH线程产生的任务会分别加入日志归档线程。

日志APPLY线程

当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列 中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致

定时器线程

某个时间点开始进行的操作,或者某个时间段内反复进行某种操作。

  1. 逻辑日志异步归档;
  2. 异步归档日志发送(只有在PRIMARY模式下,且是OPEN状态下);
  3. 作业调度。
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服