注册
达梦的体系结构学习体会
培训园地/ 文章详情 /

达梦的体系结构学习体会

听觉盛宴 2022/11/03 1026 2 0

一、DM 的体系结构
⚫ 体系结构概览
DM8 数据库是由数据库和实例构成
数据库:DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合
实例:实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成
image.png

⚫ DM 存储结构
image.png
表空间是 DM 数据库的最大存储单元,所有数据都存储在表空间中。
表空间采用段(segment)、簇(extent)和页(page,对应 block)的方式管理。
一个表空间可以包含一个或多个数据文件。一个数据文件仅能归属于一个表空间。
DM 物理文件包含:配置文件、控制文件、数据文件、联机日志(此四个文件必不可少,缺少一个将无法正常启动)。
配置文件包括(服务配置 dm.ini,守护配置,复制配置,审计配置)
控制文件,数据文件,重做日志文件,备份文件,归档日志文件,跟踪日志文件等
image.png

配置参数文件 dm.ini
DM 数据库参数的类型:
READ ONLY:手动参数,不能通过 SQL 命令或函数修改;只能通过修改 dm.ini 文本文件修改此参数(需要重启数据库才能生效)。
SYS:动态(系统级)参数。数据库运行中可以直接修改,可以即可以修改内存中的值,也可以修改参数文件中的值。可以通过 SQL 命令或系统函数修改。
SESSION:动态(会话级)参数,数据库运行中可以直接修改,可以即可以修改内存中的值,也可以修改参数文件中的值,还可以只修改当前会话的值。可以通过 SQL 命令或函数修改,且可以只针对当前会话生效。
IN FILE:静态参数,不能修改内存中的值,只能修改参数文件中的值,可以通过 SQL 命令或函数修改,但需要重启数据库才能生效。
静态参数在数据库运行期间不能修改内存中的值,动态参数在数据库运行期间可以修改内存中的值(修改后立即生效)。
SQL> select distinct para_type from v$dm_ini;
行号 PARA_TYPE


1 READ ONLY
2 SYS
3 IN FILE
4 SESSION
image.png
数据库参数的修改方法:
(1) console 控制台工具
图形化界面方式修改,不管修改什么类型参数都需要重启数据库才能生效。
image.png
(2) 直接修改 dm.ini 配置文件,不管修改什么类型参数都需要重启数据库才能生效。
(3) 系统函数修改(可以用来修改静态和动态参数,但静态参数修改后需要重启数据库才能生效)。
image.png
SP_SET_PARA_VALUE:修改整型参数。
SP_SET_PARA_DOUBLE_VALUE:修改浮点型参数:
SP_SET_PARA_STRING_VALUE:修改字符型参数:

参数说明:
SCOPE:修改范围(0:memory;1:both;2:spfile)
修改静态参数:
sp_set_para_value(2,‘COMPATIBLE_MODE’,0);
修改动态参数:
sp_set_para_value(1,‘LIST_TABLE’,0);
image.png
(4) 使用 alter system set 语句修改(可以用来修改静态和动态参数,但静态参数修改后需要重启数据库才能生效)。
image.png

举例:修改数据库兼容性参数(静态参数),由于此参数是静态参数,所以不能修改内存中的值,只能修改参数文件中的值,并且需要重启数据库才能生效。
alter system set ‘COMPATIBLE_MODE’ =2 spfile;

举例,修改 LIST_TABLE(会话级动态参数),如果不指定修改参数范围,默认是 memory:
alter system set ‘LIST_TABLE’ =1 both|memory|spfile;

both:表示对内存中和参数文件都修改;
memory:修改内存中的值;
spfile:修改参数文件中的值。

对于会话级动态参数,可以只针对当前会话生效:
alter session set ‘LIST_TABLE’ = 0;

控制文件 dm.ctl
DM 控制文件 dm.ctl 为二进制文件,无法直接打开,可以用 dmctlcvt 工具转换为文本文件。 控制文件中包含了 OGUID、数据库状态、数据库名称、最后启动时间等、表空间信息、数据 文件信息、联机日志文件信息等。
控制文件的备份路径不要和控制文件本身存放在一个磁盘上,避免磁盘损坏,控制文件和备份文件同时损坏的情况。
image.png
数据文件
数据文件用来存放数据:
image.png

联机日志
用来存放 redo 重做日志信息,联机日志循环使用。
image.png

其他
如果数据库开启归档,则会生成归档日志文件(用于保存重做日志信息)。
如果做了备份,会生成备份集文件。

⚫ DM 内存结构
数据缓冲区
用于缓存数据文件中的数据页。BUFFER 是从磁盘读出的数据页在内存中的镜像,包含四个类型,分别是 normal、fast、recycle、keep,由 INI 配置中的 BUFFER、FAST_POOL_PAGES、RECYCLE、KEEP 等确定大小,不同类型的缓冲区主要表现为淘汰机制不同。
数据缓冲区的大小影响数据库的读写性能,OLTP 数据缓冲区占内存 40-60%,OLAP 可以稍大;系统应尽量减少物理读,提高逻辑读。
当数据库执行检查点时会做数据缓冲区的刷盘,检查点将数据缓冲区中的脏页写入对应数据文件。
从磁盘的数据文件中读取数据—物理读
从内存(数据缓冲区)读取数据—逻辑读
select * from v$bufferpool; --数据缓冲区

image.png
select * from SYS.“V$PARAMETER” t WHERE name in (‘BUFFER’,‘FAST_POOL_PAGES’,‘RECYCLE’,‘KEEP’);
image.png

修改数据缓冲区大小为500M:
alter system set ‘BUFFER’= 500 spfile;
image.png

DM 默认读 1 页,可以开启读多页(依赖业务场景),有参数 MULTI_PAGE_GET_NUM 指定。
image.png

重做日志缓冲区
重做日志是数据库与磁盘间的一层缓存,将随机的磁盘写转换成顺序写,日志缓冲区是数据库和日志间的缓存对应 INI 参数 RLOG_BUF_SIZE
image.png

什么情况下会做重做日志的刷盘:执行 commit,日志缓冲区满做日志的刷盘。
当执行 commit 的时候,是否会做重做日志的刷盘? --是
当执行 commit 的时候,是否会做数据缓冲区的刷盘(将数据缓冲区中的数据,写入数据文件)?–否
减少 commit 次数,可以提高性能。
create table t_test(id int, name varchar(50));
–5 W, 46秒 179毫秒.
begin
for i in 1…50000 loop
insert into t_test(id, name) values(i, DBMS_RANDOM.string(‘A’, 20));
commit;
end loop;
end;
–5 W, 3秒 82毫秒
truncate table TEST.T_TEST;
begin
for i in 1…100000 loop
insert into t_test(id, name) values(i, DBMS_RANDOM.string(‘A’, 20));
end loop;
commit;
end;

SQL 缓冲区
缓存 sql 语句、对应的执行计划、缓存结果集(需要开启结果集缓存,默认不开启)
SQL CACHE POOL,简称 SCP,对应 INI 参数 CACHE_POOL_SIZE,是用来存储包信息(PACKAGE)、执行计划、结果集缓存的一片专用缓存区域,对于 SQL 类别比较多,或者 PKG比较多、复杂的系统,建议将该参数调大。
参数为 USE_PLN_POOL,是否启动计划重用;为 0 时禁止计划重用,1 表示启动,默认为 1。RS_CAN_CACHE,是否启动结果集缓存,默认为 0,不启用。
对应参数 CACHE_POOL_SIZE,如果 sql 较多、结果集缓存,可以适当调大 sql 缓冲区。
image.png

动态 SQL 测试
–5w数据 14秒 784毫秒
begin
for i in 1…50000 loop
execute IMMEDIATE ‘insert into t_test(id, name) values(’||i||‘,’‘’||DBMS_RANDOM.string(‘A’, 20)||‘’‘)’;
end loop;
commit;
end;

动态 SQL 使用绑定变量测试
–5 W, 2秒 363毫秒
begin
for i in 1…50000 loop
execute IMMEDIATE ‘insert into t_test(id, name) values(?,?)’ using i,DBMS_RANDOM.string(‘A’, 20);
end loop;
commit;
end;

静态 sql 测试
–5w, 1秒 215毫秒
begin
for i in 1…50000 loop
insert into t_test(id, name) values(i, DBMS_RANDOM.string(‘A’, 20));
end loop;
commit;
end;

相关数据字典:
select * from v$cacheitem;

select * from v$cachesql;

select * from v$cachepln;

select * from v$cachers;

DM 支持执行计划的清理和绑定:
select * from v$ifun t where name like ‘%PLN%’;
select t.name, b.* from v$ifun t, SYS.“V$IFUN_ARG” B
where t.name like ‘%SP_CLEAR_PLAN_CACHE%’
and t.id = b.id;

SP_CLEAR_PLAN_CACHE(PLAN_ID); --清理执行计划
–SP_SET_PLN_BINDED --绑定执行计划

字典缓冲区
字典缓冲区是存在数据库对象的一片缓冲区,对应 INI 参数 DICT_BUF_SIZE,DM8 里面数据对象其实对应的是系统表上的一些信息,内存中的数据对象是通过将系统表上的信息取出并解析出来得到的,该缓冲区一是避免了频繁向磁盘请求获取系统表信息,二是可以减少系统表信息解析开销。
select * from v$dynamic_tables t where T.NAME like ‘%DICT%’;

select * from V$DICT_CACHE_ITEM;

select * from v$dict_cache;

select name,type,value,sys_value,file_value from v$parameter t where name like ‘DICT_BUF_SIZE’;

image.png

主内存池(共享内存池)
当其他内存池(比如运行时内存池:虚拟内存池 vm pool 和会话池 session pool 等)不够时,会先向主内存池申请空间。
服务器启动时从操作系统申请的一大片内存,后续服务器运行过程中,一般情况下,很多需要内存分配的地方都是从该池分配,如果需要的内存大于配置值(MEMORY_POOL),共享内存池也可进行自动扩展,INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小,参数 MEMORY_TARGET 则指定了共享内存池能扩展到的最大大小。

select * from v$mem_pool;

select name, type, value, sys_value, file_value from v$parameter t
where name like ‘MEMORY%’;

MEMORY_POOL:初始大小
MEMORY_EXTENT_SIZE:扩展大小
MEMORY_TARGET:目标大小
MEMORY_N_POOL:共享内存池个数,默认为 1,高并发时可设置多个。
MAX_OS_MEMORY:内存占用操作系统内存的比例,默认 100,建议调整到 80-90%。

运行时的内存池
特点:使用时申请,用完即释放。包含:虚拟内存池 vm pool、会话池 session pool、排序区、HASH 区等。
排序区和 HASH 区
排序区:SORT_BUF_SIZE
少量的数据排序,优先在内存中排序,此时占用排序区;
大量的数据排序,内存中放不下,占用临时表空间排序。
如果业务经常有排序,可以适当调大排序区,提高效率。
select name, type, value, sys_value, file_value from v$parameter t where name like ‘SORT%’;
image.png

HASH 区:HJ_BUF_SIZE
HASH 连接、HASH 分区占用哈希区。如果业务 hash 连接较多,可以调大哈希区。
select name, type, value, sys_value, file_value from v$parameter t where name like ‘HJ%’;

HASH 区和排序区都属于虚拟缓冲区,实际申请时使用虚拟内存池或会话内存池。
虚拟内存池 VM POOL 和会话内存池 SESSION POOL.
相关参数:
VM_POOL_SIZE 64 静态 系统执行时虚拟机内存池大小,在执行过程中用到的内存大部分是从这里申请的,它的空间是从操作系统中直接申请的,有效值范围(32~10241024)
VM_POOL_TARGET
16384 静态 虚拟机内存池能扩充到的最大大小,以 KB
为单位,有效值范围(0~10
10241024),0 表示不限制
SESS_POOL_SIZE 64 动态,系统级 会话缓冲区大小,以 KB 为单位,有效值范围(16~1024
1024)。若所申请的内存超
过实际能申请的大小,则系统将按 16KB 大小重新申请
SESS_POOL_TARGET 16384 动态,系统级 会话缓冲区能扩充到的最大大小,以 KB 为单位,有效值范围(0~1010241024), 0 表示不限制

Sql 执行会占用会话池或虚拟池。

⚫ DM 线程
DM 是单进程多线程对称服务器架构。Oracle 是多进程架构。
image.png
查看数据库进程:
image.png

查看数据库对应的线程:

image.png
top 命令查看达梦数据库 CPU 资源占用:

动态视图:
select * from V$process; --进程
select * from v$threads; --线程

监听线程
用于在服务器端口上进行循环监听,有来自客户的连接请求,监听线程被唤醒并生成一个会话线程,将申请的任务加入工作线程的任务队列,等待工作线程进行处理。

会话线程 dm_sql_thd
每个会话 session 对应一个会话线程,会话多时该线程会多,会话对应的线程 id 可以在 v$sessions 中查询。
image.png

工作线程
DM 的核心线程;默认 16 个工作线程。

IO 线程
用于读写数据
需要处理的数据块不在缓冲区中,此时需要将相关数据块读入缓冲区 -物理读缓冲区满或系统关闭时,此时需要将部分脏数据块写入磁盘 -写脏块检查点到来时,需要将所有脏数据块写入磁盘

日志刷新线程
日志的刷盘。主要用于事务提交或检查点时将日志缓冲区中的 REDO 日志写入到日志文件中。

日志归档线程
完成 redo 日志的归档。

日志重做线程
主要用于系统故障恢复,日志重做线程根据 REDO 日志进行并行的故障恢复

调度线程
用于定时调度任务。
检查系统级的时间触发器;
清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点; 会话超时检测;
必要时执行数据更新页刷盘;
唤醒等待的工作线程;

一个 sql 的执行:
当客户端发起请求,首先到达监听线程,监听线程创建一个会话线程,将任务加入工作线程队列。Sql 语法语义权限解析(字典缓冲区,语法语义校验,权限校验):首先在 sql 缓冲区中查找是否有对应的 sql 语句,如果找到,再查找对应的执行计划,找到执行计划,根据执行计划执行 sql,这个过程称为软解析;如果 sql 缓冲区中没有找到对应 sql 语句,会将该sql 语句加入 sql 缓冲区,并生成对应执行计划,执行计划放入 sql 缓冲区,根据执行计划执行 sql 语句,返回结果集,这个过程称为硬解析)。从系统性能提升来说,要减少硬解析。
查询(读数据,数据缓冲区,如果数据缓冲区中存在数据页,则直接从数据缓冲区中读取数据,称为逻辑读;如果数据缓冲区中不存在该数据页,会话线程调用 IO 线程,IO 线程从磁盘上的数据文件中读取数据页并放入到数据缓冲区,称为物理读。从系统性能考虑,应减少物理读,提高逻辑读),如果查询涉及 HASH 连接等,会占用 HASH 区,如果涉及到排序,少量的数据排序(内存中能排下的)则占用排序区,HASH 区和排序区以会话池或虚拟池的方式申请。
修改(将数据读入数据缓冲区,此过程同上,在数据缓冲区中修改,修改会产生 redo 和 undo,redo 放在日志缓冲区中,undo 写入回滚段; 修改完成后,执行 commit,日志刷新线程将日志缓冲区中的数据写入联机日志文件;当数据库执行检查点时,IO 线程会将脏页写入磁盘数据文件。

image.png

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服