达梦数据库的组成
达梦数据库由数据库和实例组成,数据库指的是磁盘上存放在DM数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等,实例是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。
数据库与实例的区别在于,数据库存储在服务器的磁盘上,而实例则存储于服务器的内存中。
数据库与实例的关系如下图所示,数据库的存储结构可以划分为逻辑结构和物理结构。物理结构是对应的操作系统上具体的文件,用来保存和管理数据。逻辑结构则是数据库对象分配的逻辑空间,存放在数据文件中。例如当test用户在数据库中创建了一个名为test的表空间,那么用户操作所产生的数据就可以存放在这一个test表空间中,而test表空间在物理结构上,就是用户指定目录下的test.dbf文件。
数据库的存储结构
物理存储结构
(1)数据库的配置文件,即以.ini结尾的文件
数据库参数的管理
--查看参数:
select para_name,para_value,PARA_TYPE from v$dm_ini;
参数分为以下几种类型:
SESSION :会话级,针对当前会话有效
SYS :系统级动态参数,即改即生效
INFILE:静态参数,需要重启数据库实例生效
READ ONLY:只读参数,需要重启数据库实例生效
--修改参数:
sp_set_para_value(参数类型,'参数名',参数值);
参数类型为 1,代表动态参数
参数类型为 2,带表静态参数
修改动态参数:
修改动态参数,会同时修改内存和配置文件中的值,不需要重启数据库,即改即
生效。
sp_set_para_value(1,'CTL_BAK_NUM',9);
alter system set 'CTL_BAK_NUM' = 10 BOTH;
修改静态参数:
修改静态参数,只会修改配置文件中的值,需要重启数据库实例才能生效。
(2)控制文件
每个 DM 数据库都有一个名为 dm.ctl 的控制文件。控制文件是一个二进制文件,它记录了数据库必要的初始信息,其中主要包含以下内容:
1. 数据库名称;
2. 数据库服务器模式;
3. OGUID 唯一标识;
4. 数据库服务器版本;
5. 数据文件版本;
6. 数据库的启动次数;
7. 数据库最近一次启动时间;
8. 表空间信息,包括表空间名,表空间物理文件路径等,记录了所有数据库中使用的表空间,数组的方式保存起来;
9. 控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手工修改。在服务器运行期间,执行表空间的 DDL 等操作后,服务器内部需要同步修改控制文件内容。如果在修改过程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内部会执行备份操作。
控制文件的管理
--查看控制文件帮助手册:
./dmctlcvt help
--将控制文件转换为文本文件:
./dmctlcvt type=1 src=/dm8/data/DAMENG/dm.ctl dest=/home/dmdba/dmctl.txt
(3)重做日志文件
重做日志文件记录的是数据库发生变化的信息。达梦数据库默认有两个重做日志文件。重做日志文件具有循环写、可覆盖的特点。需要注意的是,重做日志文件只能添加,不能删除;只能扩大,不能缩小。
重做日志的管理
--查看重做日志的信息
select * from v$rlogfile;
select * from v$rlog;
--添加重做日志文件
alter database ADD LOGFILE '/dm8/data/DAMENG/DAMENG03.log' SIZE 300;
--resize 重做日志文件大小
alter database RESIZE LOGFILE '/dm8/data/DAMENG/DAMENG01.log' to 300;
alter database RESIZE LOGFILE '/dm8/data/DAMENG/DAMENG02.log' to 300;
(4)数据文件,即以.DBF 结尾的文件
数据文件的管理
--查看数据文件的信息
select * from DBA_DATA_FILES;
select * from v$datafile;
(5)归档日志文件
归档日志文件是重做日志文件的副本。在重做日志文件覆盖前,会拷贝重做日志文件的内容到归档路径下做副本。
逻辑存储结构
DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在 DM 数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。
表空间、数据文件、段、簇、页的关系如下图所示
由关系图可知,数据库从逻辑结构的角度来看,它可以由一个或多个表空间组成,每个表空间可以由一个或多个数据文件组成,而每个数据文件由一个或多个簇组成,段是簇的上级逻辑单元,簇由连续的页组成,页是数据库中最小的分配单元。
实例
实例由一组正在运行的达梦数据库后台进程/线程以及一个大型的共享内存组成,是用来访问数据库的内存结构以及后台进程的集合。实例的结构组成如下图所示,
内存结构
内存池
达梦数据库的内存池包括共享内存池和其他一些运行时内存池。
共享内存池是数据库在启动时从操作系统申请的内存,当系统运行时如果其他的缓冲区不够用,就可以在共享内存池中申请,使用完再释放,归还给共享内存池。
参数:MEMORY_POOL,单位:M
select para_name,para_value,para_type from v$dm_ini where para_name='MEMORY_POOL';
运行时内存池在需要时被创建,使用完自动销毁,比如会话内存池、虚拟机内存池、排序区、hash 区。
缓冲区
达梦数据库的缓冲区有以下四种类型,
1. 数据缓冲区:在数据库将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页会缓存在此处。数据缓冲区和共享内存没有关系,当数据库缓冲区满会淘汰 LRU 链表上很少被使用到的数据页。
修改数据缓冲区大小:
sp_set_para_value(2,'BUFFER',800);
2. 重做日志缓冲区重做日志缓冲区缓存的是重做日志信息。重做日志缓冲区和共享内存没有关系,当重做日志缓冲区不够用时,会向服务器申请内存。
参数:RLOG_BUF_SIZE
select para_name,para_value,para_type from v$dm_ini where para_name='RLOG_BUF_SIZE';
3. 字典缓冲区:字典缓冲区缓存的是数据字典的信息。当字典缓冲区不够用时,会向共享内存池申请内存
参数:DICT_BUF_SIZE
单位:M
select para_name,para_value,para_type from v$dm_ini where para_name='DICT_BUF_SIZE';
4. SQL 缓冲区:SQL 缓冲区缓存的是结果集、执行计划等信息。当 SQL 类别比较多,SQL没有绑定变量,可以将 SQL 缓冲区调大。当 SQL 缓冲区不够用时,会向共享内存池申请内存。
参数:CACHE_POOL_SIZE
select para_name,para_value,para_type from v$dm_ini where para_name='CACHE_POOL_SIZE';
排序区
排序缓冲区提供数据排序所需要的内存空间。当用户执行 SQL 语句时,常常需要进行排序,所使用的内存就是排序缓冲区提供的。在每次排序过程中,都首先申请内存,排序结束后再释放内存。
哈希区
哈希缓冲区是达梦数据库为哈希连接而设定的虚拟缓冲区,在进行哈希连接时,对排序的数据量进行计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希操作。
线程结构
相关的视图
查看线程:
select * from v$threads;
查看进程:
select * from v$process;
监听线程
主要任务是在服务器端口上进行循环监听来自客户端的请求。工作过程为数据库启动时监听线程就会启动,当监听到客户端发来的请求之后,监听线程会被唤醒并生成会话申请,之后进入到工作线程队列中,等待工作线程的处理,监听线程会随着数据库的关闭而关闭。
IO 线程
主要的工作有:将磁盘上的数据页加载到数据缓冲区中;将数据缓冲区中的脏页在一定机制下(数据库正常关闭、缓冲区满和触发检查点)更新到磁盘上的数据文件中。
日志刷新线程
将重做日志缓冲区中的记录在一定机制下(事务提交,执行检查点)刷盘到重做日志文件中。
日志归档线程
重做日志文件在覆盖前,日志归档线程将重做日志文件内容拷贝到归档路径下做副本。
日志重做线程
主要用于数据库实例恢复,会根据REDO日志进行并行故障恢复
调度线程
检查系统级的时间触发器;
清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点;
会话超时检测;
必要时执行数据更新页刷盘;
唤醒等待的工作线程;
工作线程
内核的工作线程机制包括普通内核线程和用户态线程两种,普通内核线程的切换完全由操作系统决定,但操作系统无法了解进程内部的运行机制,只能采取通用的调度策略来管理各个内核线程;用户态线程在内核线程内部自主调度,有效减少上下文切换
数据库的管理
数据库的创建
在建数据库之前,需要规划数据库,如数据库名、实例名、端口、文件路径、簇大小、页大小、日志文件大小、SYSDBA 和 SYSAUDITOR 等系统用户的密码,需要注意的是,有4个参数是只能在数据库初始化时设置的,后续不能更改。
- 簇大小,簇是每次申请的页数,表存满了以后会一次性连续申请(参数设置)个页的空间。
- 页大小,影响每一行能存储的最大值,和查询效率。
- 字符集,影响所用的字符集后期是否支持对应的生僻字等。
- 大小写敏感,影响 SQL 编写,对小写对象是否需要添加双引号。
执行创建数据库的命令时,安装程序会先确认数据库的版本,检查数据库的授权文件有没有指定,没有的话就默认是一年的有效期,根据执行的参数来设置要初始化的数据库并记录到dm.ini文件中,之后会自动创建 4 个表空间(SYSTEM、ROLL、MAIN和TEMP)以及2个redo日志(dmdb01.log和dmdb02.log),最后将完整的过程记录在dminit.log中,一次数据库的初始化就完成了。
启动过程
数据库在启动时,会对license进行检查,确认是否还在有效期内,之后会去读取配置文件 (.ini),根据参数的值来分配数据库内存的大小,然后读取控制文件 (dm.ctl),获取数据库的初始信息,比如数据库的名称和模式、数据文件的名称和存放路径、数据库的版本等,最后再读取重做日志文件 ().log) 和 数据文件 (*.DBF),创建监听线程。
关闭过程
数据库关闭时,会先将全部的会话进行关闭,检查点开始工作,把系统缓冲区中的部分或者全部脏数据页写入磁盘,之后停止归档和redo的写入,最后释放内存空间,关闭监听线程。
更多详细的内容可在达梦数据库官网中查阅