达梦数据库学习(三、体系结构)
达梦数据库学习(三、体系结构)
上期内容:
本篇说实在的有些我也没太弄明白,大概就是知其然不知其所以然吧。
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;
该操作并不是执行日志切换
个人理解该操作的实际意义是立即进行了归档写
检查点线程 触发增量检查点和完全检查点(触发完全检查点会写脏数据到磁盘,增量检查点不一定会写脏数据到磁盘)。
总结:
注:该图直接拷贝授课老师教材,感谢。