数据库和实例
数据库: 指存放在磁盘上的物理文件, 一般包含数据文件、日志文件、控制文件、参数文件等
实例: 用于操作数据库, 指当数据库启动后运行的后台进程和内存
DM 数据库逻辑结构
表空间
表空间是一个逻辑概念, 由多个段组成, 一个表空间可以包含多个数据文件, 默认数据库会自动出创建5个表空间
SYSTEM : 存储数据库的元数据信息
ROLL : 回滚段, 用于提供MVCC机制
MAIN : 如果创建的用户没有指定表空间, 则默认创建的数据库对象就存放在该表空间中, 相当于ORACLE的user表空间
TEMP : 存放临时数据, 例如SQL语句的执行结果
HMAIN : HTS表空间
表空间相关视图
V$TABLESPACE 当前数据库中有多少表空间
V$HUGE_TABLESPACE HTS表空间相关信息
段
段时逻辑概念, 由多个区组成
段的类型
数据段: 存放数据和索引的段
临时段: 临时结果集等, 临时段的分配和释放完全由系统自动控制,用户不能手工进行干预
回滚段: 用于存储多版本并发
区
区是一个逻辑概念, 由多个页组成, 主要用于当进行表空间扩展时, 一次性扩展多少空间
在进行数据库初始化时可以指定
页
数据库的最小存储单元, 也是最小的I/O操作单元
DM数据库页大小分为 4k 8k 16k 32k , 默认8k, 在数据库初始化时可以指定页大小, 一旦指定后就无法修改
页中存放内容
1、页的类型
2、记录
3、页的元数据信息
页大小的选择
页中存放的是真实的记录, 当一个表中的一行记录的总长度很大时, 则选择16k或者32k的页大小
因为数据库每次从磁盘读取都是根据数据页的大小进行读取可以减少磁盘IO
页的相关参数
fillfactor: 填充因子
当某个页中存放的数据, 达到该值设置的阈值时, 则不允许再插入数据, 可以有效的减少页分裂
页分裂和页合并
页分裂: 当插入或更新一行数据时, 当前页无法满足插入或更新数据的存储容量时发生页分裂
页合并: 由于删除数据, 造成某个页中的数据存储很低或者达到某个存储限制时, 则需要和其他页合并来减少存储空间
记录
数据库表中的每一行是一条记录
记录是存储在数据页中的一条记录只能存储在一个页中
数据页中还包含了页头控制信息等空间, 每条记录的总长度不能超过页面大小的一半, 这样保证每个页最少可以存储2条记录
DM8中存储的层次结构如下
数据库由一个或多个表空间组成
每个表空间由一个或多个数据文件组成
每个数据文件由一个或多个簇组成
段是簇的上级逻辑单元,一个段可以跨多个数据文件
簇由磁盘上连续的页组成,一个簇总是在一个数据文件中
页是数据库中最小的分配单元,也是数据库中使用的最小的IO单元
DM数据库物理结构
配置文件:
用于配置数据库运行时的各个参数
配置文件类型
dm.ini 对数据库运行时的参数进行配置
dmmal.ini MAL系统的配置文件, 所有站点dmmal.ini需要保证严格一致
dmarch.ini 用于本地归档和远程归档
dm_svc.conf DM各接口及客户端需要配置的一些参数, 类似ORACLE的tnsnames.ora
sqllog.ini 用于sql日志的配置
dmrep.ini 用于配置复制实例
dmllog.ini 用于配置逻辑日志
dmtimer.ini 用于配置定时器
控制文件
dm.ctl 存储数据库的初始化信息, 是一个二进制文件
控制文件存储内容
1、数据库名称
2、数据库服务器模式
3、OGUID唯一标识
4、数据库版本
5、数据文件版本
6、数据库启动次数
7、数据库最近一次启动时间
8、表空间信息
9、控制文件校验码
控制文件备份策略
1、在修改参数之前进行备份, 修改成功后删除备份文件
2、在修改参数之后进行备份, 根据参数CTL_BAK_NUM 保留备份数量
控制文件注意事项
控制文件存放在裸设备上, 则备份策略1无效
指定的控制文件路径无效, 则备份策略2无效
数据文件
存放真是数据的文件
重做日志文件
记录数据库的修改操作, 包含DML和DDL
默认DM提供两个日志,循环写入
redo日志的刷写
数据库定期将redo日志中的数据写入磁盘
当redo无法保存写入的数据时, 触发checkout机制, 将数据写入磁盘
归档日志
归档模式下, redo日志的备份
逻辑日志
复制模式下的一种特定文件
物理逻辑日志
专门用于dms_logmnr挖掘数据库历史执行语句的日志
备份文件
对数据库进行备份的文件
跟踪文件
对数据库中各会话在运行期间所执行的语句等信息存储, 主要用于问题诊断和性能优化
事件日志
事件日志文件对DM数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、IO错误等一些致命错误
数据重演文件
调用系统存储过程SP_START_CAPTURE和SP_STOP_CAPTURE, 主要用于分析在指定的时间内数据库的操作
DM 内存结构
共享内存池
指DM在启动后一次性分配给DM数据库的内存, 相当于ORACLE的SGA
运行时内存池
指客户端连接后, 所使用的内存, 相当于ORACLE的PGA
缓冲区
数据缓冲区
存放数据和索引的区域, 根据LRU算法进行脏页的刷写
LRU 链表
FREE LIST 当前空闲页的数量
LRU LIST LRU列表中的数量
DIRTY LIST 脏页列表的数量, LRU LIST 包含脏页列表
DM 中存在一个叫做热区的概念, 防止热数据被刷写, 个人理解, 根据LRU算法热数据一般不会被刷写不理解这个存在的意义
数据缓冲区参数
MULTI_PAGE_GET_NUM = 1
默认DM在读取读取数据时, 只读取当前页的数据, 如果需要其他数据则需要再次读取
该参数可以根据配置读取指定相邻页的个数, 从而达到优化,类似于MySQL中的是否读取相邻页的参数
日志缓冲区
存储redo日志信息
RLOG_BUF_SIZE对日志缓冲区大小进行控制
字典缓冲区
存储数据库的元数据信息, 采用LRU算法进行淘汰
DICT_BUF_SIZE,默认的配置大小为5M
SQL缓冲区
存储SQL语句执行过程中所需要的内存, 执行计划和结果集缓存
相当于MySQL的query cache
USE_PLN_POOL 当指定为非0时,则启动计划重用, 0时禁止
排序区
用于进行数据的排序,SORT_BUF_SIZE用于指定排序区的大小, 默认2M
哈希区
用于hash连接时, 使用的内存区域, HJ_BUF_SIZE的大小可以指定该区域的内存大小
后台线程
监听线程
用于监听客户端请求, 当有新的连接时, 分配一个线程接收客户端的数据
工作线程
负责将用户输入的SQL, 进行执行并将结果返回客户端
I/O线程
负责从磁盘读写数据到内存, 脏页的刷写 IO_THR_GROUPS用于配置IO线程的个数 DM使用的是aio
调度线程
负责处理系统中的定时任务, 调度线程每秒钟轮询一次
主要负责的任务有以下任务
1、检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
2、清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
3、检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
4、执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
5、自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作;
6、会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
7、必要时执行数据更新页刷盘;
8、唤醒等待的工作线程
日志FLUSH线程
将日志缓冲区的数据, 写入redo日志
如果系统配置了实时归档,在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成
归档线程
将redo日志进行归档
日志APPLAY线程
主要用于主备系统中, 相当于MySQL的SQL_THREAD
定时器线程
用于定义的定时任务, 每秒检测一次定时器链表
逻辑日志规定线程
主要用于复制环境
MAL系统线程
DM内部高速通道, 基于TCP/IP 主要用于和其他主机进行通信, 所有高可用环境都会用到
其他线程
完成某些特定功能的线程
线程信息的查看
V$LATCHES 记录当前正在等待的线程信息
V$THREADS 记录当前系统中活动线程的信息
V$WTHRD_HISTORY 记录自系统启动以来,所有活动过线程的相关历史信息。
V$PROCESS 记录服务器进程信息
详细内容请参考官方文档:https://eco.dameng.com
更多详情请访问达梦在线服务平台 https://eco.dameng.com/