达梦DM8数据库体系结构

一、数据类型

        登录DM数据库,执行SELECT * FROM SYS.SYSTYPEINFOS;可以查询DM支持的全部数据类型及精度说明等信息。主要包含如下数据类型:

1、数值数据类型

1.NUMERIC[精度,标度]:用于存储零、正负定点数。精度范围1至38

2.NUMBER类型:跟NUMERIC相同

3.DECIMAL/DEC类型:跟NUMERIC相似

4.BIT类型:用于存储整数数据1、0或null

5.INTEGER/INT类型:用于存储有符号整数,精度为10

6.PLS_INTEGER类型:与INTEGER相同

7.BIGINT类型:用于存储有符号整数,精度为19,标度为0

8.TINYINT类型:用于存储有符号整数,精度为3,标度为0。取值范围为:-128~+127。

9.BYTE类型:与TINYINT相似,精度为3,标度为0。

10.SMALLINT类型:用于存储有符号整数,精度为5,标度为0。

11.BINARY类型:指定定长二进制数据。

12.VARBINARY类型:指定变长二进制数据。用法类似BINARY数据类型。

13.REAL类型:带二进制的浮点数。

14.FLOAT类型:二进制精度的浮点数,精度最大不超过53。

15.DOUBLE类型:同FLOAT相似,精度最大不超过53。

16.DOUBLE PRECISION类型:该类型指明双精度浮点数,其二进制精度为53,十进制精度为15。

2、字符数据类型

1.CHAR/CHARACTER类型:定长字符串,最大长度由数据库页面大小决定。

2.VARCHAR类型:可变长字符串,最大长度由数据库页面大小决定。

3、多媒体数据类型

1.TEXT/LONGVARCHAR类型:变长字符串类型,其字符串的长度最大为2G-1,可用于存储长的文本串。

2.IMAGE/LONGVARBINARY类型:可用于存储多媒体信息中的图像类型。

3.BLOB类型:用于指明变长的字符串,长度最大为2G-1字节。

4.CLOB类型:用于指明变长的字符串,长度最大为2G-1字节。

5.BFILE类型:用于指明存储在操作系统中的二进制文件。

4、日期时间数据类型

1.DATE类型:包括年、月、日信息,定义了‘-4712-01-01’和‘9999-12-31’之间任何一个有效的格里高利日期。

2.TIME类型:包括时、分、秒信息。

3.TIMESTAMP/DATATIME:包括年、月、日、时、分、秒信息。

4.TIME WITH TIME ZONE类型:描述一个带时区的TIME值。

5.TIMESTAMP WITH TIME ZONE类型。

6.TIMESTAMP WITH LOCAL TIME ZONE类型:描述一个本地时区的TIMESTAMP值。

7.BOOL/BOOLEAN数据类型:布尔数据类型TRUE和FALSE。

二、进程结构

      首先DM数据库进程管理方式类似于Mysql,属于单进程多线程模式。

操作系统层查看进程:

数据库层查看进程:

达梦DM8数据库体系结构_第1张图片

线程:

 操作系统层查看线程:top -p 11718 -H

达梦DM8数据库体系结构_第2张图片

 数据库层查看线程:

达梦DM8数据库体系结构_第3张图片

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

  • 1、监听线程,dm_lsnr_thd

        主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接时系统具有较短的响应时间,监听线程比普通线程优先级更高。

  • 2、工作线程,dm_tskwrk_thd和dm_wrkgrp_thd 

        工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。

        DM8的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。

  • 3、IO线程,dm_io_thd、dm_hio_thd,默认情况下,IO线程的个数是2个。

        当事务需要的数据页不在缓冲区中时,如果在工作线程中直接对那些数据页进行读写,将会使系统性能变得非常糟糕,而把IO操作从工作线程中分离出来是明智的做法。IO线程的职责就是处理这些IO操作。通常情况下,DM Server需要进行IO操作的时机主要有以下三种。

(1)需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区。

(2)缓冲区满或系统关闭时,需要将部分脏数据页写入磁盘。

(3)检查点到来时,需要将所有脏数据页写入磁盘。

        IO线程的个数是可配置的,可以通过设置dm.ini文件中的IO_THR_GROUPS参数来设置,默认情况下,IO线程的个数是两个。同时,IO线程处理IO的策略根据操作系统平台的不同会有很大差别,一般情况下,IO线程使用异步的IO将数据页写入磁盘,此时,系统将所有的IO请求直接递交给操作系统,操作系统在完成这些请求后才通知IO线程,这种异步IO的方式使得IO线程需要直接处理的任务很简单,即完成IO后的一些收尾处理并发出IO完成通知,如果操作系统不支持异步IO,此时IO线程需要完成实际的IO操作。

  • 4、调度线程,dm_sched_thd 调度线程

        调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒轮询一次,负责的任务有以下一些。

(1)检查系统级的时间触发器,如果满足触发条件,则生成任务加到工作线程的任务队列中并由工作线程执行。

(2)清理SQL缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项。

(3)检查数据重演捕获持续时间是否到期,到期则自动停止捕获。

(4)执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池。

(5)自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据INI参数设置的自动检查点执行间隔定期执行检查点操作。

(6)会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接。

(7)必要时执行数据更新页刷盘。

(8)唤醒等待的工作线程。

  • 5、日志FLUSH线程,dm_redolog_thd          

        任何数据库的修改,都会产生重做(REDO)日志,为了保证数据故障恢复的一致性,REDO日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的REDO日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知FLUSH线程进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散IO写入效率更高,因此,日志FLUSH线程和IO线程分开,能获得更快的响应速度,保证整体的性能。DM的日志FLUSH线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了IO次数,进一步提高了性能。如果系统配置了实时归档,在FLUSH线程日志刷盘前,会直接将日志通过网络发送到实时备机。如果配置了本地归档或者远程同步归档,则生成归档任务,通过日志归档线程完成。

  • 6、日志归档线程,dm_rsyswrk_thd

        日志归档线程包含同步归档线程和异步归档线程,前者负责本地归档和远程同步归档任务,后者负责远程异步归档任务。如果配置了非实时归档,由日志FLUSH线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。将日志FLUSH线程和日志归档线程分开的目的是减少不必要的效率损失,除了远程实时归档外,本地归档、远程同步归档、远程异步归档都可以脱离FLUSH线程来做,如果放在FLUSH线程中一起做,则会严重影响系统性能。

   1.本地逻辑日志归档线程

        本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。

   2.远程逻辑日志归档线程

        远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。任务的类型包括同步发送和异步发送。

  • 7 、日志APPLY线程

         在配置了数据守护的系统中,创建了一个日志APPLY线程。当服务器作为备库时,每次接收到主库的物理REDO日志生成一个APPLY任务加入到任务队列,APPLY线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。

  • 8 、定时器线程

        在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。

通常情况下,DM Server需要进行定时操作的事件主要有以下几种:

  1. 逻辑日志异步归档;

  2. 异步归档日志发送(只有在PRIMARY模式下,且是OPEN状态下);

  3. 作业调度。

        定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务,如逻辑日志异步归档等。

        默认情况下,达梦服务器启动的时候,定时器线程是不启动的。用户可以设置dm.ini中的TIMER_INI参数为1来设置定时器线程在系统启动时启动。

  • 9、 MAL系统相关线程

        MAL系统是DM内部高速通信系统,基于TCP/IP协议实现。服务器的很多重要功能都是通过MAL系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL系统内部包含一系列线程,有MAL监听线程、MAL发送工作线程、MAL接收工作线程等。

  • 10、其他线程。

dm_sql_thd 用户线程
dm_quit_thd  执行正常关闭数据库的线程
dm_purge_thd  purge线程 主要负责回滚段清理
dm_trctsk_thd 日志信息记录线程,主要负责数据库告警跟踪信息写入告警日志文件中
dm_audit_thd  审计线程,主要负责审计日志记录与更新
dm_chkpnt_thd  检查点线程,主要负责CKPT_LSN的管理
dm_sqllog_thd  写 dmsql dmserver。

三、内存结构        

        DM 数据库管理系统的内存结构主要包括内存池、缓冲区、排序区、哈希区等。根据系统中子模块的不同功能,对内存进行了上述划分,并采用了不同的管理模式。
1、共享内存
其中0 表示的是不限制,在oracle中:memoroy_target=sga+pga。

查看共享内存大小:

SQL> select para_name,para_value from v$dm_ini where para_name='MEMORY_TARGET';

达梦DM8数据库体系结构_第4张图片

 Memory_pool 表示实例内存池大小,查看方法:

SQL> select para_name,para_value from v$dm_ini where para_name='MEMORY_POOL';

达梦DM8数据库体系结构_第5张图片

 2、数据缓冲区buffer

1、存放的内容:LRU(最小使用算法)链表。

2、状态:free,dirty,clean,pending.

3、如何去设置buffer的大小?

        DM的buffer pool是如何优化冷热数据存储淘汰机制的我也不是特别清楚,应该是跟Mysql相似,这里具体说明Mysql的buffer pool淘汰选择机制:

        实际上,MySQL 在冷热分离的基础上还做了一层优化。当一个缓存页处于热数据区域的时候,我们去访问这个缓存页,这个时候我们真的有必要把它移动到热点数据区域的头部吗?从代码的角度来看,将链表中的数据移动到头部,实际上就是修改元素的指针指向,这个操作是非常快的。但是为了安全起见,在修改链表的时候,我们需要对链表加上锁,否则容易出现并发问题。

        当并发量大的时候,因为要加锁,会存在锁竞争,每次移动显然效率就会下降。因此 MySQL 针对这一点又做了优化,如果一个缓存页处于热数据区域,且在热数据区域的前 1/4 区域(注意是热数据区域的 1/4,不是整个链表的 1/4),那么当访问这个缓存页的时候,就不用把它移动到热数据区域的头部;如果缓存页处于热数据的后 3/4 区域,那么当访问这个缓存页的时候,会把它移动到热数据区域的头部。

查看dm buffer大小:

SQL> select para_name,para_value from v$dm_ini where para_name='BUFFER';--大小

达梦DM8数据库体系结构_第6张图片

 SQL> select para_name,para_value from v$dm_ini where para_name='MAX_BUFFER';--最大值

达梦DM8数据库体系结构_第7张图片 

建议:
OLTP: BUFFER大小设置为整个物理内存的40-60%
OLAP:BUFFER大小设置为整个物理内存的60-80%

如何修改:
ORALCE: alter system set xxx=…;
DM:SP_set_PARA_VALUE(SCOPE,PARA_NAME,PARA_VALUE);

我们可以通过VPARAMETER 和VPARAMETER和VDM_INI视图去查看相关参数的值。

当然并不是所有的参数都可以通过这种方式修改,dm的参数分为以下几类:

  • Sys/session 动态参数,同时修改内存和配置文件
  • Read only 数据库运行状态下,不能修改。
  • In file 静态参数,修改配置文件。

SQL> sp_set_para_value(2,'BUFFER',1500);

其中参数2表示只修改配置文件,1表示修改配置文件和内存。

另外需要注意的是,在oracle中Recycle(快速回收池)和Keep(保留池)存放的是表,而在DM中存放的是表空间。

3、字典缓冲区

达梦DM8数据库体系结构_第8张图片

DICT_BUF_SIZE -----大小
PLN_DICT_HASH_THRESHOLD ----关联登记
当cache_pool_size的值大于等于该值的时候,记录执行计划中关联的数据字典。

4、Sql缓冲区
介绍sql缓冲区之前,我们首先需要明白一条sql在dm数据库中的执行过程,大致为:
1、语法义分析。
2、语义分析(存放数据的数据字典表,产生物理读)
3、权限判断
4、查找数据块是否内存(在内存,逻辑读,不在内存,把数据块从磁盘读到buffer)
5、找是否有可用的执行计划。有的直接按照执行计划把结果展示出来。如果没有,生成执行计划,再把数据展示出来。
而Sql缓冲区中存放的就是:最近使用的sql,DMSQL代码,执行计划和最近查询的结果集),用来减少硬解析。
查看方式:
 USE_PLN_POOL表示执行计划是否重用:0 关闭, 1,2,3重用。

达梦DM8数据库体系结构_第9张图片

5、日志缓冲区
        日志缓冲区是用于存放重做日志的内存缓冲区,dm中数据每3s写一次或是commit。这里其实跟Oracle相似,LGWR将redo entry写入联机日志文件每3秒LGWR启动一次。

达梦DM8数据库体系结构_第10张图片

RLOG_BUF_SIZE ----- 日志缓冲区的大小 单位:page 设置成2的幂。
RLOG_POOL_SIZE ----最大日志缓冲区的大小 单位:MB

6、排序区
对数据进行排序,如果内存排序无法完成,把部分排序转到磁盘(temp)
SORT_BUF_SIZE —大小,值要结合你的业务。

7、HASH区
HJ_BUF_SIZE

SQL> select para_name,para_value from v$dm_ini where para_name like '%HJ%';

达梦DM8数据库体系结构_第11张图片

3.8、重做日志文件的管理
–查看日志文件:

达梦DM8数据库体系结构_第12张图片

增加一个日志文件:

SQL>  alter database add logfile '/data/dmdata/dm/dm03.log' size 256;

达梦DM8数据库体系结构_第13张图片

 –修改日志文件的大小:

SQL> alter database resize logfile '/data/dmdata/dm/dm03.log' to 512;

 达梦DM8数据库体系结构_第14张图片

 需要注意:所有日志文件大小要一致!这也是规范,redo切换不一致可能会有额外问题。

四、存储结构

 1、 逻辑结构

         DM数据库的逻辑单元从大到小依次为:数据库–>表空间–>数据文件–>段–>簇(区)–>页。到页就没有了,由此看出页是最小的逻辑单元,是数据库最小的分配单位。数据库由一个或多个表空间组成。每一个表空间有一个或多个数据文件组成,每一个数据文件由一个或多个簇组成,段是簇的上级逻辑单位,一段可以跨多个数据文件,簇是磁盘上连续的页组成的。一个簇总在一个数据文件中。大体结构如下所示:

达梦DM8数据库体系结构_第15张图片

页:数据块,最小的数据IO单元。页的大小可以设置为4K,8k,16k,32k,默认8k。
数据页包含4个部分:页头控制信息,数据,空闲空间,行偏移数组。

簇:是由16或32个连续的数据页组成。默认16。比如:数据文件 大小为32m ,页大小是8k,则共有 32M/8K/16=256个簇。每个簇的大小,8k*16=128k。

段:由表空间中的一组簇组成,数据文件可以由不同的簇来组成。一个段包含多少区:256个区?

 2、 物理结构

1、配置文件以.ini结尾:

达梦DM8数据库体系结构_第16张图片

2、控制文件

        控制文件是一个二进制文件,以ctl结尾。

 3、数据文件        

        以dbf结尾的文件

        在DM数据库中,表空间由一个或者多个数据文件组成。DM数据库中的所有对象在逻辑上都存放在表空间中,而物理上都存储在所属表空间的数据文件中。

在创建DM数据库时,会自动创建5个表空间:SYSTEM表空间、ROLL表空间、MAIN表空间、TEMP表空间和HMAIN表空间。

  1. SYSTEM表空间存放了有关DM数据库的字典信息,用户不能在SYSTEM表空间创建表和索引。

  2. ROLL表空间完全由DM数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行DML操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。

  3. MAIN表空间在初始化库的时候,就会自动创建一个大小为128M的数据文件MAIN.DBF。在创建用户时,如果没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间。

  4. TEMP表空间完全由DM数据库自动维护。当用户的SQL语句需要磁盘空间来完成某个操作时,DM数据库会从TEMP表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL语句中间结果集以及用户创建的临时表等都会使用到TEMP表空间。

  5. HMAIN表空间属于HTS表空间,完全由DM数据库自动维护,用户无需干涉。当用户在创建HUGE表时,未指定HTS表空间的情况下,充当默认HTS表空间。

每一个用户都有一个默认的表空间。对于SYS、SYSSSO、SYSAUDITOR系统用户,默认的用户表空间是SYSTEM,SYSDBA的默认表空间为MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定MAIN表空间为用户默认的表空间。如果用户在创建表的时候,指定了存储表空间A,并且和当前用户的默认表空间B不一致时,表存储在用户指定的表空间A中,并且默认情况下,在这张表上面建立的索引也将存储在A中,但是用户的默认表空间是不变的,仍为B。

一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间MAIN中。

用户可以通过执行如下语句来查看表空间相关信息。

SYSTEM、ROLL、MAIN和TEMP表空间查看语句:

SELECT * FROM V$TABLESPACE;

HMAIN表空间查看语句:

SELECT * FROM V$HUGE_TABLESPACE;

达梦DM8数据库体系结构_第17张图片
数据文件的大小范围:4096页大小 -------2147483647页大小
达梦数据库页大小:4K 8K 16K 32K 默认8k
表空间中数据文件的总数不超过256个。

4、重做日志文件redo

5、备份文件

        以bak为扩展名的文件,还一个.meta元数据文件

6、归档日志文件

        利用归档日志,将系统恢复至故障发生的前一刻,也可以还原指定的时间点,如果没有归档日志,则只能利用备份来进行恢复。归档参数文件: dmarch.ini

7、跟踪文件

        跟踪日志文件记录了系统各会话执行的sql语句,错误信息,主要错误和性能问题。启动跟踪日志,对系统性能有较大的影响,默认情况下跟踪日志是关闭的。dm.ini svr_log 参数改为1就打开中跟踪日志。

8、事件日志文件

        记录了数据库运行期间的关键事件,如启动,关闭,内存申请失败,io错误等一些致命的错误。存放在DM_HOME/log目录下。命名格式:dm_实例名_日期。

五、实例管理

DM数据库的模式
1、普通模式(normal):用户可以正常访问数据库,操作没有限制。

2、主库模式(primary):用户正常访问数据库,所以对数据库对象的修改强制生成redo日志,在归档有效的时候,发送redo日志到备库。

3、备库模式(standby):接收主库发送过来的redo日志并重做日志,数据对用户只读。

数据库的状态
1、配置状态(mount):不允许访问数据库对象,只能进行控制文件,参数文件的维护,归档配置,数据库模式的修改等操作。

2、打开状态(open):不能进行控制文件维护,归档配置等操作,可以访问数据库对象,对外提供正常的数据库服务。

3、挂起状态(suspend):与open状态唯一的区别:限制磁盘写入功能。一旦修改数据页,触发redo日志,数据页刷盘,当前用户被挂起。

4、关闭状态:shutdown。

状态切换
Shutdown —mount          
#分配共享内,启动后台的进程或是线程,打开控制文件。
Shutdown—open             #根据控制文件,打开所有的数据文件和重做日志文件。
Open ----mount          这里Oracle单向的不可逆,不能从open打到mount状态。Oracle多了一个nomount状态,还是有区别的。
Mount----open;

        凡所过往,皆为序章,坚信达梦DM数据库会越来越好,在国产数据库中成为佼佼者,汲取Oracle和Mysql的优点,抛弃缺点,走向全世界。

DM 武汉达梦数据库股份有限公司    24小时免费服务热线:400 991 6599
达梦技术社区:https://eco.dameng.com

你可能感兴趣的:(达梦数据库,数据库,database)