达梦数据库:体系结构

DMServer=客户端+服务器 (典型的C/S架构)


而服务器=数据库+实例


一、database数据库(存放到磁盘的文件)

         文件分类

1、数据文件

         存放用户的真实的数据(物理备份时备份的就是这些文件)

2、重做日志文件

         (注:达梦数据库没有日志组的概念,达梦不支持手动切换日志)

         存放的是改变的数据信息(这个最怕出问题,重做日志文件丢失可能会丢失数据,因此需要对重做日志做归档)

         查看文件路径

         SQL>select path from v$rlogfile;

行号     PATH                        

---------- -----------------------------

1          /dm8/data/DAMENG/DAMENG01.log

2          /dm8/data/DAMENG/DAMENG02.log

      1)、如何调整日志文件大小(达梦限制只能调大不能调小) 大小范围:64M-2G

         查看日志文件的大小:

         SQL>select path,rlog_size/1024/1024 from v$rlogfile;

行号     PATH                          RLOG_SIZE/1024/1024

---------- ----------------------------- --------------------

1          /dm8/data/DAMENG/DAMENG01.log 256

2          /dm8/data/DAMENG/DAMENG02.log 256

         调整大小:

         SQL> alter database resize logfile '/dm8/data/DAMENG/DAMENG01.log' to 257

         SQL> alter database resize logfile '/dm8/data/DAMENG/DAMENG02.log' to 257

         注意:所有的日志文件大小要一致(我没试过不一致会怎样)

         特点:循环写,重复写

      2)、如何增加一个日志文件(达梦只支持增加,不支持删除)

         SQL> alter database add logfile '/dm8/data/DAMENG/DAMENG03.log' size 257;

3、控制文件

         Oracle数据库的控制文件内容:SCN、归档信息、RMAN备份的元数据

         数据库的物理架构v$controlfile

         达梦数据库的控制文件内容:数据库的物理架构、版本信息、创建时间、OGUID等

         查找控制文件的路径:

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

行号     PARA_NAME PARA_VALUE            

---------- --------- -----------------------

1          CTL_PATH  /dm8/data/DAMENG/dm.ctl

         达梦对控制文件的保护:控制文件很重要,所以要避免该文件丢失或损坏,在Oracle中可以进行复制,使用多个位置存放控制文件,那么在达梦里面,达梦进行了自动备份。

         自动备份(备份路径,备份的个数)

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

行号     PARA_NAME    PARA_VALUE

---------- ------------ ------------------------

1          CTL_BAK_PATH /dm8/data/DAMENG/ctl_bak

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

行号     PARA_NAME   PARA_VALUE

---------- ----------- ----------

1          CTL_BAK_NUM 10

 比较奇怪的是这里写的备份数量是10,但实际查看路径下有11个文件



         查看备份文件的内容:

         把控制文件转成文本文件:

         $ ./dmctlcvt type=1 src=/dm8/data/DAMENG/dm.ctl dest=/tmp/dm.txt

         vi /tmp/dm.txt



4、配置文件

         配置文件多数以.ini结尾

         比如dm.ini就是很典型的参数配置文件

         参数的类型:SYS、session、read only、in file(以上参数类型不明白啥意思)上网查了一下:

         read only:手动参数,表示服务器运行过程中不可修改;

         infile:静态参数,只可修改ini文件

         SYS及session:动态参数,ini文件和内存同时可修改,其中SYS是系统级参数


         手动:不能被动态修改,必须手动修改dm.ini参数文件,然后重启才能生效。

         静态:可以被动态修改,修改后重启服务器才能生效。

         动态:可以被动态修改,修改后即时生效。动态参数又分为会话级和系统级两种。会话级参数被修改后,新参数值只会影响新创建的会话,之前创建的会话不受影响;系统级参数的修改则会影响所有的会话。


参考网址:

https://blog.csdn.net/weixin_50334974/article/details/108776379

         修改参数:sp_set_para_value(修改范围,参数名,参数值)

         修改范围:1=内存+参数文件,2=参数文件

         查看参数类型:

         SQL>select para_name,para_value from v$dm_ini where para_name=’BUFFER’;

         SQL>sp_set_para_value(2,’BUFFER’,’500’);--两种方式之一

         SQL>alter system set ‘BUFFER’=500 spfile;--两种方式之二

         配置文件示例:dmarchar.ini(配置归档)、dmmal.ini(MAL链路通讯)、dmmpp.ini(MPP配置)

5、其他文件

         如备份文件、追踪文件等

二、实例

         实例=共享内存+后台的进程或者线程

     1、共享内存 为了减少物理IO

           设置共享内存大小

                   SQL>select para_name,para_value from v$dm_ini where para_name=’MEMEROY_TARGET’;

         BUFFER  数据缓冲区

                   作用:存放最近使用的数据块(读,修改)

                   查看大小:

                   SQL>select para_name,para_value from v$dm_ini where para_name=’BUFFER’;

                   区域的大小设置:OLTP系统建议是物理内存的40%-60%.

                   LRU链表上,数据库是有以下状态的(脏、干净、空闲、正在使用)

                   要把磁盘的数据库块读到BUFFER,找LRU链表,遇到干净的和空闲的直接使用,遇到脏数据块,把它放到检查点队列上,遇到在使用的直接跳过。

如何判断数据是否在内存中:通过HASH链表。不懂

 Oracle:keep 和recycle存放的是表。达梦存放的是表空间。

                   keep(保留池)

                   RECYCLE(回收池)


           REDO LOG BUFFER 重做日志缓冲区

                   作用:存放修改的数据块

                   查看大小:

                   SQL>select para_name,para_value from v$dm_ini where para_name=’RLOG_BUF_SIZE’;

                   单位:page,调整大小建议是2的幂(如2的6次方)。

                   对于redo log buffer 的数据,3秒会自动写磁盘,事务提交的时候也会写磁盘(因此调整这个REDO LOG BUFFER大小就没有太大意义,实际会很少调这个大小)


           字典缓冲区

                   作用:存放最近使用的数据字典(system),减少物理读(减少物理IO)

                   查看大小:

                   SQL>select para_name,para_value from v$dm_ini where para_name=’DICT_BUF_SIZE’;


           SQL缓冲区

                   作用:存放最近使用SQL语句(hash或者SQLid)、执行计划、最近的查询结果集

                   查看大小:

                   SQL>select para_name,para_value from v$dm_ini where para_name=’CACHE_POOL_SIZE’;

                   对应找缓存SQL的话有两个视图:v$sql_history、v$sqltext


           执行计划:是否重用

                   SQL>select para_name,para_value from v$dm_ini where para_name=’USE_PLN_POOL’;

                   0       不重用

                   1       重用,默认是1 减少执行计划的解析



           排序区

                   作用:用作排序

                   查看大小:

                   SQL>select para_name,para_value from v$dm_ini where para_name=’SORT_BUF_SIZE’;

                   注意:如果排序区无法完成所有的排序,会把部分排序的动作放到磁盘,会放在临时表空间。


           HASH区

                   作用:缓存hash值,两张表做hash join,其中一张表产生hash值,把hash值放到该区域。

                   查看大小:

                   SQL>select para_name,para_value from v$dm_ini where para_name=’HJ_BUF_SIZE’;


         了解一条SQL语句的执行过程:

         1、语法分析

         2、语义分析(数据字典,常用的数据字典缓存到字典缓存区)

         3、权限判断(字典缓冲区)

         4、找执行计划(SQL缓冲区),(有则调到第5步,无则把数据读到内存(数据缓冲区),如果修改,把修改的数据放到重做日志缓冲区。生成SQL的执行计划(SQL缓冲区))

         5、运行执行计划

         6、返回结果(SQL缓冲区)


2、后台进程或者线程

      1、利用操作系统

                   找到数据库的进程号:

                   #ps -ef | grep dmsever



A、top -p 进程号 -H



B、/proc/进程编号

这个不懂啥意思。

2、利用数据库的动态性能视图

SQL>select name,thread _desc from v$threads;

也不懂啥意思。



监听线程 默认监听端口5236 检测外部连接


IO线程 刷脏数据(把检查点队列的数据写到磁盘)


工作线程 执行任务(调度分配的任务)


调度线程 分配任务给工作线程,唤醒工作线程,垃圾回收(回收失效的段等)


日志刷新线程         把重做日志缓冲区的数据写到重做日志中


日志重做线程         数据库异常关闭,下次启动的时候,会把重做日志的一些未写磁盘的脏数据重构(Oracle实例恢复)


日志归档         把重做日志写到归档文件(Orale归档---日志切换,达梦是同时写重做日志和归档)(个人理解达梦的同时写并不是真正的同时,还是有延时的)

SQL>alter system switch logfile;

该操作并不是执行日志切换

个人理解该操作的实际意义是立即进行了归档写


检查点线程     触发增量检查点和完全检查点(触发完全检查点会写脏数据到磁盘,增量检查点不一定会写脏数据到磁盘)。


总结:


 注:该图直接拷贝授课老师教材,感谢。

你可能感兴趣的:(达梦数据库:体系结构)