体系结构概览
DM8 数据库是由数据库和实例构成
数据库:DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合
实例:实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成
DM 存储结构
表空间是 DM 数据库的最大存储单元,所有数据都存储在表空间中。
表空间采用段(
segment)、簇(extent)和页(page,对应 block)的方式管理。
一个表空间可以包含一个或多个数据文件。一个数据文件仅能归属于一个表空间。
DM 物理文件包含:配置文件、控制文件、数据文件、联机日志(此四个文件必不可少,缺少 一个将无法正常启动)。
配置文件包括(服务配置 dm.ini,守护配置,复制配置,审计配置)
控制文件,数据文件,重做日志文件,备份文件,归档日志文件,跟踪日志文件等
配置参数文件 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 控制台工具
图形化界面方式修改,不管修改什么类型参数都需要重启数据库才能生效。 或函数修改,但需要重启数据库才能生效。
(2) 直接修改 dm.ini 配置文件,不管修改什么类型参数都需要重启数据库才能生效。
(3) 系统函数修改(可以用来修改静态和动态参数,但静态参数修改后需要重启数据库才能生效)。
SP_SET_PARA_VALUE:修改整型参数。
SP_SET_PARA_DOUBLE_VALUE:修改浮点型参数:
SP_SET_PARA_STRING_VALUE:修改字符型参数:
参数说明:
SCOPE:修改范围(0:memory;1:both;2:spfile)
修改静态参数:
修改动态参数:
(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;
举例,修改 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、数据库状态、数据库名称、最后启动时间等、表空间信息、数据文件信息、联机日志文件信息等。
控制文件的备份路径不要和控制文件本身存放在一个磁盘上,避免磁盘损坏,控制文件和备份文件同时损坏的情况。
数据文件
数据文件用来存放数据:
[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');
修改数据缓冲区大小为500M:
alter system set 'BUFFER'= 500 spfile;
DM 默认读 1 页,可以开启读多页(依赖业务场景),有参数 MULTI_PAGE_GET_NUM 指定。
重做日志缓冲区
重做日志是数据库与磁盘间的一层缓存,将随机的磁盘写转换成顺序写,日志缓冲区是数据库和日志间的缓存对应 INI 参数 RLOG_BUF_SIZE
什么情况下会做重做日志的刷盘:执行 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 缓冲区。
动态 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';
主内存池(共享内存池)
当其他内存池(比如运行时内存池:虚拟内存池 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%';
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.
Sql 执行会占用会话池或虚拟池。
DM 线程
DM 是单进程多线程对称服务器架构。Oracle 是多进程架构。
查看数据库进程:
[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 资源占用:
动态视图:
select * from V$process; --进程
select * from v$threads; --线程
监听线程
用于在服务器端口上进行循环监听,有来自客户的连接请求,监听线程被唤醒并生成一个会话线程,将申请的任务加入工作线程的任务队列,等待工作线程进行处理。
会话线程 dm_sql_thd
每个会话 session 对应一个会话线程,会话多时该线程会多,会话对应的线程 id 可以在 v$sessions 中查询。
工作线程
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