• 达梦数据库学习(三、体系结构)


    达梦数据库学习(三、体系结构)

    上期内容:

    达梦数据库学习(一、linux操作系统安装及数据库安装)

    达梦数据库学习(二、管理数据库实例)

     

    本篇说实在的有些我也没太弄明白,大概就是知其然不知其所以然吧。

    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;

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

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

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

    总结:

     

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

  • 相关阅读:
    luogu 2962 [USACO09NOV]灯Lights
    bzoj 1923
    bzoj 1013
    bzoj 3513
    bzoj 4259
    bzoj 4503
    CF 632E
    bzoj 3527
    bzoj 3160
    bzoj 2179
  • 原文地址:https://www.cnblogs.com/moonliu/p/14266135.html
Copyright © 2020-2023  润新知