数据库指磁盘上持久化的物理文件集合,包含数据文件、日志文件、控制文件、临时文件等。
实例是运行时载体,存于服务器内存,由共享内存区 + 后台进程 / 线程组成,是访问、操作磁盘数据库的工具。绑定规则
单机常规环境:一个实例只能挂载打开一个数据库,一套数据库通常仅搭配一个实例;
DMDSC 共享存储集群:多台服务器的多个实例,可同时挂载同一套共享磁盘上的数据库,实现多节点并发访问
达梦的逻辑存储结构遵循以下层次关系,从上到下是包含关系:
数据库 (Database) -> 表空间 (Tablespace) -> 段 (Segment) -> 簇 (Extent) -> 页 (Page)
从上至下逻辑层级:
a.数据库 → 多个表空间
b.表空间 → 多个数据文件
c.段(可跨数据文件)→ 多个簇
d.簇(仅存于单个数据文件,由连续页构成)→ 多个页
e.页:最小分配、最小 IO 单元
表空间是 DM 数据库的逻辑存储容器,由一个或多个数据文件组成,数据库对象逻辑上存于表空间,物理上存于对应数据文件中。
表空间类型
1.普通表空间:无法存储 HUGE 表;2. 混合表空间:可存储普通表和 HUGE 表(HUGE 文件存于指定路径),普通表空间可通过添加 HUGE 路径升级为混合表空间。
系统自动创建的5个初始化表空间
•SYSTEM:存数据字典,禁止用户创建表和索引;SYS、SYSSSO、SYSAUDITOR 系统用户默认表空间。
•ROLL:自动维护,存储 DML 操作前旧值,保障读一致性。
•RLOG:存重做日志,初始化生成2个.log 文件,可扩展、循环使用。
•MAIN:混合表空间,含128M 的 MAIN.DBF 和 HMAIN 目录(HUGE 路径);SYSDBA 及未指定默认表空间的新用户,默认表空间为 MAIN。
•TEMP:自动维护,为大排序、创建索引、临时表等操作分配临时段。
用户表空间使用规则
创建表时若指定表空间 A(与用户默认表空间 B 不同),表及默认索引存于 A,用户默认表空间仍为 B。建议用户自建表空间存业务数据,或使用 MAIN 表空间。
查看语句
1.查看 SYSTEM、ROLL、MAIN、TEMP:SELECT * FROM VTABLESPACE;
2.查看 RLOG 相关:SELECT * FROM VRLOG;(日志空间)、SELECT∗FROMVRLOGFILE;(日志文件)、SELECT * FROM VLOG_HISTORY;(日志切换历史)。
数据表的一行即为一条记录。DM8 中除 HUGE 表外,数据均以记录形式存放在数据页内;页是最小存储单元,记录不是。
记录不允许跨页存放,受页大小约束;且页面本身占用控制空间,因此普通表单条记录长度不能超过页面大小的一半
数据页是 DM 最小存储单元,创建库时指定大小(可选 4/8/16/32KB,默认 8KB),库创建后不可修改。
数据页由四部分组成:页头控制信息、数据区、空闲空间、行偏移数组。FILLFACTOR 在建表 / 索引时配置,代表数据页初始可填充空间占比,预留剩余空间应对后续更新。
值越高:空间利用率高,但更新易触发页分裂,产生大量 I/O;
值越低:预留空闲空间多,减少页分裂、提升 I/O 性能,但会降低空间利用率。
簇是页的上层逻辑单元,由同一数据文件内连续的数据页组成(16/32/64 页);建库时指定簇大小,默认 16,库创建后不可修改。
段由多个簇组成,段可跨多个数据文件,但簇不能跨文件。
数据段:对应表与索引;分区表、分区索引各分区拥有独立段;表段和索引段可放在不同表空间。
临时段:统一位于临时表空间,排序、临时表自动产生,生命周期由系统自动管控。
回滚段:存变更前数据,实现事务回滚、故障恢复、读一致性;系统自动管理,自适应调整回滚信息保存时长。
DM 依靠多种物理文件存储管理数据:包含配置文件、控制文件;存储业务数据的数据文件、重做日志、归档日志、备份文件;以及用于故障排查的跟踪日志文件。
服务器配置文件:后缀为 INI,调整参数控制数据库功能、优化服务性能;
客户端配置文件:dm_svc.conf,为 JDBC、Disql 等工具配置连接信息与客户端功能。
分类:
dm.ini:主配置文件,管控实例全部核心参数;
dmmal.ini:集群、数据守护 MAL 通信配置;
dmarch.ini:各类归档配置,容灾必备;
dm_svc.conf:客户端连接配置,路径固定;
sqllog.ini:SQL 日志配置,开启 SVR_LOG 后生效,支持动态刷新;
dmrep.ini 复制、dmllog.ini 逻辑日志、dmtimer.ini 异步定时器。
配置文件多为文本,参数调整不当会造成数据库异常。
DM 数据库包含两类二进制控制文件:
1.dm.ctl:记录数据库名称、OGUID、版本、启动信息、全部表空间路径等核心信息,内置校验码防止篡改损坏;
2.dmtemp.ctl:仅保存临时表空间相关信息。
修改控制文件(如表空间 DDL)时存在故障损坏风险,系统提供两套自动备份策略:
•策略一:修改前先备份;修改成功删除备份,失败则保留备份。控制文件存放裸设备时该策略失效。
•策略二:修改成功后,依据 dm.ini 中CTL_BAK_PATH、CTL_BAK_NUM生成备份并清理旧备份;路径非法则不生效。
两条策略条件同时满足时并行执行;新建库初始化完成后,会自动备份一份原始控制文件。
数据文件后缀为.dbf,是存放真实业务数据的核心物理文件;支持自动扩展,可通过MAXSIZE限制上限,建议一个表空间建立多个小数据文件,不推荐单个超大文件;内部以页、簇、段进行管理。
四类数据组织形式
1.B 树数据:最常用,普通表、分区表、B 树索引均采用;分为内节点段与叶子段;无聚集索引时自动生成 ROWID 作为主键。
2.堆表数据:链表结构存储,使用物理 ROWID,支持高并发插入,插入性能优异。
3.列存储数据:按列组织数据,适合特定分析场景,查询效率优于行存。
4.位图索引:索引条目映射多行数据,保存键值与数据行的位图映射关系。
两类特殊 DBF 文件
1.ROLL 文件:回滚表空间的数据文件,存储回滚记录,支撑事务回滚、读一致性。
TEMP 文件:临时表空间文件,大小由TEMP_SIZE控制;存放超大查询临时结果集与用户临时表数据。
重做日志(REDO 日志)默认后缀.log,初始化库时可自定义后缀;实例至少拥有 2 个重做日志文件,循环复用,又称联机日志。
所有增删改操作都会记录重做日志,核心作用是故障恢复:发生宕机、进程异常终止等故障时,利用日志重放事务,将数据库恢复至故障前一致状态,也支撑数据库备份恢复。
日志分为联机重做日志、归档日志,数据库支持归档 / 非归档两种运行模式:
非归档模式:仅写入联机重做日志;日志写满触发检查点后循环覆盖复用。检查点会将缓冲区脏页、日志落盘,保障日志可以安全重用。
归档模式:修改操作同时写入联机日志与归档日志。联机日志写满后,日志数据生成独立归档文件保存,不会被直接覆盖。
归档文件名称带时间戳,后缀可配置。开启归档会小幅损耗性能,但数据安全性更高:介质故障时可依托备份 + 归档日志恢复至故障前任意时间点;非归档模式仅能恢复到备份时刻。
物理逻辑日志记录数据库逻辑操作,存放于重做日志文件,供DBMS_LOGMNR工具解析历史 SQL 语句。 开启需要两个条件:
1.参数RLOG_APPEND_LOGIC设置为 1/2/3/4;
2.通过两种方式选择采集范围:
○全局采集:RLOG_IGNORE_TABLE_SET=1,记录全部表;
○指定表采集:RLOG_IGNORE_TABLE_SET=0,建 / 改表时添加ADD LOGIC LOG。
备份文件用于故障场景恢复数据库,DM 分为物理备份与逻辑备份:
物理备份:备份数据文件、控制文件等物理文件;生成备份集,包含.meta元数据文件与.bak备份片。
逻辑备份:备份表、视图、存储过程等逻辑对象;通过 dexp 生成.dmp文件
SQL 日志开启方式:修改 dm.ini 中SVR_LOG=1,依靠sqllog.ini控制细节;文件为纯文本,默认存放于安装目录 log 文件夹,路径可自定义。 日志记录会话执行 SQL、参数与报错信息,多用于故障排查、SQL 性能调优。 日志采用分块循环缓存,总缓存上限由BUF_TOTAL_SIZE管控。
开启 SQL 日志会损耗性能,默认关闭;优化方案:
1.通过SQL_TRACE_MASK、MIN_EXEC_TIME过滤日志,减少输出量;
2.开启ASYNC_FLUSH异步刷盘降低影响。
支持存储过程动态修改 sqllog.ini,执行SP_REFRESH_SVR_LOG_CONFIG()刷新生效;可通过VDM_SQLLOG_INI、VDM_SQLLOG_CONFIG分别查询文件配置与内存生效参数。
事件日志(ELOG)持续记录数据库启停、IO 错误、内存异常、备份阶段等关键运行事件,主要用于故障定位排查。文件命名规则
库初始化日志:存放于ELOG_PATH,前缀dminit;
实例启动失败(未读取配置):日志名称dm_unknown_年月;
ELOG_FLAG=1:全部日志写入单一文件dm_实例名.log;
ELOG_FLAG=0:先写入月度日志,到达SVR_ELOG_FREQ切换点后,自动剪切归档为按日 / 小时拆分的分时日志。
可通过视图V$ELOG_FILE查看日志信息,调用SP_ELOG_FILE_DELETE清理指定 ELOG 文件。
DM 自主实现内存管理,提升内存分配效率、便于排查内存问题;内存主要分为内存池、各类缓冲区、排序区、哈希区。
1.共享内存池:实例启动一次性向 OS 申请大块内存,减少频繁系统调用;参数MEMORY_POOL配置基础大小,支持自动扩缩容;视图V$MEM_POOL查看内存池状态。
2.运行时内存池:各功能模块独立使用,例如会话内存池、虚拟机内存池。
1.数据缓冲区:存放读写的数据页,依靠自由链、LRU 链、脏链管理;分为三类:
○NORMAL 通用缓冲区、RECYCLE 缓冲区(临时表空间)、FAST 缓冲区; 参数BUFFER、RECYCLE、FAST_POOL_PAGES管控大小;MULTI_PAGE_GET_NUM控制预读多页,减少 IO。
2.日志缓冲区:缓存重做日志,独立划分(日志格式、连续写入、高优先级);由RLOG_BUF_SIZE控制,内存取自共享内存池。
3.字典缓冲区:缓存表、列、触发器等元数据,LRU 淘汰;参数DICT_BUF_SIZE;分区多的表建议调大。
4.SQL 缓冲区:缓存 SQL 执行计划与结果集;USE_PLN_POOL开启计划重用,CACHE_POOL_SIZE设置缓冲区大小;客户端结果集缓存在dm_svc.conf配置。
排序操作使用的内存,每次排序动态申请、用完释放;参数SORT_BUF_SIZE,默认 20MB。
用于哈希连接,属于虚拟缓冲区,没有独立内存;由HJ_BUF_SIZE控制阈值,数据量超限自动启用外存哈希。
DM 采用单进程、多线程对称架构,包含各类功能线程,主要线程职责如下:
1.监听线程:监听客户端连接请求,生成会话任务放入任务队列,优先级高于普通线程。
2.工作线程(核心)
○任务工作线程:处理系统内部后台任务,数量可动态扩张;
○会话工作线程:处理用户会话请求,支持单会话单线程与线程池两种模式,由STHD_FLAG控制。
3.IO 线程:独立完成数据页读写 IO,避免阻塞工作线程;数量由IO_THR_GROUPS配置,优先使用异步 IO。
4.调度线程:每秒轮询,负责触发定时任务、清理缓存、动态伸缩缓冲池、自动执行检查点、会话超时检测等。
5.日志 FLUSH 线程:负责 REDO 日志刷盘;实时归档场景下同步发送日志至备库,刷盘前合并日志减少 IO。
6.日志归档线程:处理本地归档、异步远程归档,与 FLUSH 线程分离,防止归档拖慢事务提交。
7.日志 APPLY 线程:数据守护备库专用,重演主库 REDO 日志,实现主备数据同步。
8.定时器线程:负责作业调度、逻辑日志异步归档等定时任务;默认不启动,设置TIMER_INI=1开启。
9.MAL 相关线程:集群、数据守护内部通信线程,依托 MAL 高速通信框架。
10.其他线程:回滚段清理、审计写入等专用后台线程。
•VTHREADS:查看活动线程信息
•VLATCHES:查看等待线程信息
•V$PROCESS:查看服务进程信息
文章
阅读量
获赞
