首页 > 其他分享 >DM 的体系结构

DM 的体系结构

时间:2022-11-20 14:31:54浏览次数:30  
标签:00 DM dm 线程 体系结构 缓冲区 thd 1750

体系结构概览

DM8 数据库是由数据库和实例构成

数据库:DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合

实例:实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成

DM 的体系结构_数据

DM 存储结构

DM 的体系结构_数据库_02

表空间是 DM 数据库的最大存储单元,所有数据都存储在表空间中。

表空间采用段(

segment)、簇(extent)和页(page,对应 block)的方式管理。

一个表空间可以包含一个或多个数据文件。一个数据文件仅能归属于一个表空间。

DM 物理文件包含:配置文件、控制文件、数据文件、联机日志(此四个文件必不可少,缺少 一个将无法正常启动)。

配置文件包括(服务配置 dm.ini,守护配置,复制配置,审计配置)

控制文件,数据文件,重做日志文件,备份文件,归档日志文件,跟踪日志文件等

DM 的体系结构_数据库_03

配置参数文件 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

数据库参数的修改方法:

(1) console 控制台工具

图形化界面方式修改,不管修改什么类型参数都需要重启数据库才能生效。 或函数修改,但需要重启数据库才能生效。

DM 的体系结构_sql_04

(2) 直接修改 dm.ini 配置文件,不管修改什么类型参数都需要重启数据库才能生效。

(3) 系统函数修改(可以用来修改静态和动态参数,但静态参数修改后需要重启数据库才能生效)。

DM 的体系结构_sql_05

SP_SET_PARA_VALUE:修改整型参数。

SP_SET_PARA_DOUBLE_VALUE:修改浮点型参数:

SP_SET_PARA_STRING_VALUE:修改字符型参数:

DM 的体系结构_sql_06

参数说明:

SCOPE:修改范围(0:memory;1:both;2:spfile)

修改静态参数:

DM 的体系结构_数据库_07

修改动态参数:

DM 的体系结构_数据_08

(4) 使用 alter system set 语句修改(可以用来修改静态和动态参数,但静态参数修改后需要重启数据库才能生效)。

COMPAT工BLE_MODE

0

静态

是否兼容其他数据库模式。

0:不兼容,

1:兼容SQL.92标准,

2:部分兼容ORACLE,

3:部分兼容MS sQL SERVER,

4:部分兼容MYSQL,

5:兼容DM6,

6:部分兼容TERADATA

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

alter system set 'COMPATIBLE_MODE' =2 spfile;

DM 的体系结构_数据库_09

DM 的体系结构_数据库_10

举例,修改 LIST_TABLE(会话级动态参数),如果不指定修改参数范围,默认是 memory:

alter system set 'LIST_TABLE' =1 both|memory|spfile;

both:表示对内存中和参数文件都修改;

memory:修改内存中的值;

spfile:修改参数文件中的值。

对于会话级动态参数,可以只针对当前会话生效:

alter session set 'LIST_TABLE' = 0;

DM 的体系结构_数据库_11

控制文件 dm.ctl

DM 控制文件 dm.ctl 为二进制文件,无法直接打开,可以用 dmctlcvt 工具转换为文本文件。

控制文件中包含了 OGUID、数据库状态、数据库名称、最后启动时间等、表空间信息、数据文件信息、联机日志文件信息等。

控制文件的备份路径不要和控制文件本身存放在一个磁盘上,避免磁盘损坏,控制文件和备份文件同时损坏的情况。

DM 的体系结构_数据_12

DM 的体系结构_数据_13

数据文件

数据文件用来存放数据:

[dmdba@KylinDCA03 DM]$ ll *.DBF

-rw-r--r-- 1 dmdba dinstall 134217728 12 月 20 19:54 DMHR.DBF

-rw-r--r-- 1 dmdba dinstall 134217728 12 月 21 00:25 MAIN.DBF

-rw-r--r-- 1 dmdba dinstall 134217728 12 月 21 10:58 ROLL.DBF

-rw-r--r-- 1 dmdba dinstall 24117248 12 月 21 10:38 SYSTEM.DBF

-rw-r--r-- 1 dmdba dinstall 10485760 12 月 21 10:33 TEMP.DBF

联机日志

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

[dmdba@KylinDCA03 DM]$ ll DM*.log

-rw-r--r-- 1 dmdba dinstall 268435456 12 月 21 10:58 DM01.log

-rw-r--r-- 1 dmdba dinstall 268435456 12 月 21 10:33 DM02.log

其他

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

如果做了备份,会生成备份集文件。

⚫ DM 内存结构

数据缓冲区

用于缓存数据文件中的数据页。BUFFER 是从磁盘读出的数据页在内存中的镜像,包含四个类型,分别是 normal、fast、recycle、keep,由 INI 配置中的 BUFFER、FAST_POOL_PAGES、RECYCLE、KEEP 等确定大小,不同类型的缓冲区主要表现为淘汰机制不同。

数据缓冲区的大小影响数据库的读写性能,OLTP 数据缓冲区占内存 40-60%,OLAP 可以稍大;系统应尽量减少物理读,提高逻辑读。

当数据库执行检查点时会做数据缓冲区的刷盘,检查点将数据缓冲区中的脏页写入对应数据文件。

从磁盘的数据文件中读取数据—物理读

从内存(数据缓冲区)读取数据—逻辑读

select * from v$bufferpool; --数据缓冲区

select * from SYS."V$PARAMETER" t

WHERE name in ('BUFFER','FAST_POOL_PAGES','RECYCLE','KEEP');

DM 的体系结构_数据库_14

修改数据缓冲区大小为500M:

alter system set 'BUFFER'= 500 spfile;

DM 的体系结构_数据_15

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

DM 的体系结构_数据库_16

重做日志缓冲区

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

DM 的体系结构_数据_17

什么情况下会做重做日志的刷盘:执行 commit,日志缓冲区满做日志的刷盘。

当执行 commit 的时候,是否会做重做日志的刷盘? --是

当执行 commit 的时候,是否会做数据缓冲区的刷盘(将数据缓冲区中的数据,写入数据文件)?--否

减少 commit 次数,可以提高性能。

create table t_test(id int, name varchar(50));

--5 W, 11秒 604毫秒.

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, 664毫秒

begin

for i in 1..100000 loop

insert into t_test02(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 缓冲区。

DM 的体系结构_数据_18

动态 SQL 测试

--5 W, 8秒 383毫秒

--50W,45秒 368毫秒

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, 992毫秒

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, 637毫秒

--50w, 5秒 851

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';

DM 的体系结构_sql_19

主内存池(共享内存池)

当其他内存池(比如运行时内存池:虚拟内存池 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%';

DM 的体系结构_sql_20

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%';

DM 的体系结构_sql_21

HASH 区:HJ_BUF_SIZE

HASH 连接、HASH 分区占用哈希区。如果业务 hash 连接较多,可以调大哈希区。

select name, type, value, sys_value, file_value from v$parameter t where name like 'HJ%';

DM 的体系结构_数据_22

HASH 区和排序区都属于虚拟缓冲区,实际申请时使用虚拟内存池或会话内存池。

虚拟内存池 VM POOL 和会话内存池 SESSION POOL.

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

DM 的体系结构_数据_23

DM 线程

DM 是单进程多线程对称服务器架构。Oracle 是多进程架构。

DM 的体系结构_sql_24

查看数据库进程:

[dmdba@KylinDCA03 DM]$ ps -ef|grep dmserver

dmdba 1750 1 0 10:33 ? 00:00:03 /dm8/bin/dmserver

/dm8/data/DM/dm.ini -noconsole

dmdba 1756 1 0 10:33 ? 00:00:02 /dm8/bin/dmserver

/dm8/data/DMTEST/dm.ini -noconsole

dmdba 4175 3624 0 11:59 pts/2 00:00:00 grep dmserver

查看数据库对应的线程:

[dmdba@KylinDCA03 DM]$ ps -T -p 1750

PID SPID TTY TIME CMD

1750 1750 ? 00:00:01 dmserver

​1750 1877 ? 00:00:00 dm_quit_thd

1750 1882 ? 00:00:00 dm_io_thd

1750 1883 ? 00:00:00 dm_io_thd

1750 1884 ? 00:00:00 dm_io_thd

1750 1885 ? 00:00:00 dm_io_thd

1750 2070 ? 00:00:00 dm_chkpnt_thd

1750 2071 ? 00:00:00 dm_redolog_thd

1750 2138 ? 00:00:00 dm_hio_thd

1750 2139 ? 00:00:00 dm_hio_thd

1750 2140 ? 00:00:00 dm_hio_thd

1750 2141 ? 00:00:00 dm_hio_thd

1750 2297 ? 00:00:00 dm_sqllog_thd

1750 2298 ? 00:00:00 dm_purge_thd

1750 2299 ? 00:00:00 dmserver

1750 2300 ? 00:00:00 dm_tskwrk_thd

1750 2301 ? 00:00:00 dm_tskwrk_thd

1750 2302 ? 00:00:00 dm_tskwrk_thd

1750 2303 ? 00:00:00 dm_tskwrk_thd

1750 2304 ? 00:00:00 dm_tskwrk_thd

1750 2305 ? 00:00:00 dm_tskwrk_thd

1750 2306 ? 00:00:00 dm_tskwrk_thd

1750 2307 ? 00:00:00 dm_tskwrk_thd

1750 2308 ? 00:00:00 dm_tskwrk_thd

1750 2309 ? 00:00:00 dm_tskwrk_thd

1750 2310 ? 00:00:00 dm_tskwrk_thd

1750 2311 ? 00:00:00 dm_tskwrk_thd

1750 2312 ? 00:00:00 dm_tskwrk_thd

1750 2313 ? 00:00:00 dm_tskwrk_thd

1750 2314 ? 00:00:00 dm_tskwrk_thd

1750 2315 ? 00:00:00 dm_tskwrk_thd

1750 2316 ? 00:00:00 dm_trctsk_thd

1750 2317 ? 00:00:00 dm_wrkgrp_thd

1750 2318 ? 00:00:00 dm_wrkgrp_thd

1750 2319 ? 00:00:00 dm_wrkgrp_thd

1750 2320 ? 00:00:00 dm_wrkgrp_thd

1750 2321 ? 00:00:00 dm_wrkgrp_thd

1750 2322 ? 00:00:00 dm_wrkgrp_thd

1750 2323 ? 00:00:00 dm_wrkgrp_thd

1750 2324 ? 00:00:00 dm_wrkgrp_thd

1750 2325 ? 00:00:00 dm_wrkgrp_thd

1750 2326 ? 00:00:00 dm_wrkgrp_thd

1750 2327 ? 00:00:00 dm_wrkgrp_thd

1750 2328 ? 00:00:00 dm_wrkgrp_thd

1750 2329 ? 00:00:00 dm_wrkgrp_thd

​ 1750 2330 ? 00:00:00 dm_wrkgrp_thd

1750 2331 ? 00:00:00 dm_wrkgrp_thd

1750 2332 ? 00:00:00 dm_wrkgrp_thd

1750 2333 ? 00:00:00 dm_audit_thd

1750 2334 ? 00:00:00 dm_sched_thd

1750 2335 ? 00:00:00 dm_lsnr_thd

1750 3517 ? 00:00:00 dm_sql_thd

1750 3525 ? 00:00:00 dm_sql_thd

1750 3526 ? 00:00:00 dm_sql_thd

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

DM 的体系结构_数据库_25

动态视图:

select * from V$process; --进程

select * from v$threads; --线程

监听线程

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

会话线程 dm_sql_thd

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

DM 的体系结构_sql_26

工作线程

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 线程会将脏页写入磁盘数据文件。

标签:00,DM,dm,线程,体系结构,缓冲区,thd,1750
From: https://blog.51cto.com/u_15130867/5871392

相关文章

  • DM8 开发
    DM支持开发语言的种类DM开发语言接口配置​JDBC连接DM数据库DM8JDBC编程注意事项//定义DMJDBC驱动串StringjdbcString="dm.jdbc.driver.DmDriver";//定......
  • 《xdm,我能推翻欧姆定律了!!!》 回复
    《xdm,我能推翻欧姆定律了!!!》     https://tieba.baidu.com/p/8148835042     11楼说实在的,楼主是正确的,这又是一个大发现。我昨天就想说了。 这......
  • orcale笔记03-DML语句
    insertinto:插入数据全表插入:insertinto表名values(值1,值2...);部分列插入:insertinto表名(列1,列2...)values(值1,值2...)从其他表中复制数据:insertin......
  • kubeadm创建kubernetes集群
    kubeadm创建kubernetes集群参照使用Kubeadm引导集群,进行集群的创建。一、安装kubeadm1.1准备开始这里我准备了3台服务器进行安装,均是通过Vbox创建centos7.6版本的虚......
  • DM8 企业版安装
    达梦数据库介绍收集安装环境查看系统信息[root@dmopt]#cat/proc/versionLinuxversion4.19.90-24.4.v2101.ky10.x86_64([email protected])(gccvers......
  • 【DNN,OFDM检测】基于DNN深度学习网络的OFDM信号检测算法的matlab仿真
    1.软件版本matlab2021a2.部分核心代码      3.部分代码clearvariables;closeall;load('TrainingData.mat');load('ValidationData.mat');%%Definetr......
  • DMSQL
    1、SQL语法分类DML(DataMannipulationLanguage)数据操纵语言:查询、操纵数据表资料行,包含SELECT、INSERT、UPDATE、DELETE,MERGE。默认情况下,DML不自动提交,需要手工提......
  • 开发笔记1.1-配置可视化MySQL工具phpMyAdmin
    配置好phpMyAdmin前提是需要安装http服务器、php、phpMyAdmin1.安装http服务器#安装httpd服务器yuminstallhttpd#开启http服务器并设置开机启动sudosystemctlst......
  • 【Django Admin】多对多情况下,admin显示与筛选当前账号的数据
    多对多字段:  technology_user=fields.ManyToManyField(to="custom_auth.AdminUser",verbose_name="技术",blank=True,null=True)  放到list_display显示......
  • 13.django-admin组件
    Django内置了一个强大的组件叫Admin,提供给网站管理员快速开发运营后台的管理站点,下面通过案例进行操作1.创建模型类模型类如下:fromdjango.dbimportmodels#Crea......