第1章 数据库启动
1.1 DM8
mount阶段
1.先读入ctl,检查system.dbf,不存在则报错退出;如果system.dbf文件为空,则提示不能分配内存,报错退出;
2.查找dm_service.prikey,如果不存在就报Server key decrypt failed!!退出;如果存在,就读取内容与system.dbf中的内容比较,如果不一致就报Server key decrypt failed!!退出;
3.查看ROLL.DBF是否存在,如果不存在就报错退出;
4.然后检查TEMP.DBF是否存在,如果不存在就自动创建temp;
5.读取redolog,比较db_magic, permanent_magic是否与system.dbf中的一致,如果不一致,报错退出;如果一致,读取redolog内容,然后将数据库mount(说明db_magic, permanent_magic记录在system.dbf和redolog中)。
Open 阶段
1. 读取ROLL.DBF,如果有异常,报Fail to find file in current system. tsid:1, fileid:1203 退出。
2. 检查是否有崩溃的事务,如有进行回滚,然后将数据库open
1.2ORACLE
nomount阶段
1.读取spfile,如果不存在,则读取pfile
2.根据参数文件分配内存,启动后台进程
mount阶段
读取控制文件,获取数据文件位置,检查点信息
open阶段
1.根据控制文件内容读取数据文件
2.比较数据文件头信息是否与控制文件的一致,如果不一致,进行前滚与回滚。
1.3MYSQL
读取参数文件,分配内存,启动进程,打开数据文件、日志文件。
第2章逻辑存储结构
2.1DM8

与oracle的类似,页对应block,簇对应extent,段对应segment。
系统默认创建5个表空间, 分别对应oracle 的system、undo、temp、user表空间。hmain属于 HTS 表空间,当用户在创建 HUGE 表时,未指定 HTS 表空间的情况下,充当默认 HTS 表空间。
与oracle相比,SYSTEM 表空间不允许关闭自动扩展,且不允许限制空间大小;缺少一个sysaux辅助表空间;roll表空间只能有一个,可以增加数据文件,但是文件只能加大,不能使用resize的方式缩小,需要使用SP_TRUNC_TS_FILE (ts_id ,file_id, to_size)来调整大小。
2.2ORACLE

默认表空间:system、sysaux、undo、temp、user
2.3MYSQL
默认表空间:ibdata、undo、temp
第3章物理存储结构
3.1DM8

参数文件
dm.ini、dmarch.ini dmmal.ini dm_svc.conf sqllog.ini
控制文件
dm.ctl --可以通过dmctlcvt将它在二进制和文本格式之间进行转换,达到修改数据文件位置的目的;也可以修改DB_NAME;
数据文件
SYSTEM.DBF ROLL.DBF TEMP.DBF MAIN.DBF
注:
1.SYSTEM 表空间不允许关闭自动扩展,且不允许限制空间大小
2.数据文件只能增大,不能通过alter tablespace resize的方式缩小;roll和temp的文件可以通过sp_trunc_ts_file(ts_id,file_id,to_size)进行截断,前提是被截断的部分没有数据;
3.HMAIN表空间没有对应的数据文件,它对应一个目录
重做日志文件
$DB_NAME01.log $DB_NAME02.log
注:文件只可以增大、添加,不能进行缩小和删除。
归档日志文件
数据库的操作写完redo就接着写到archive,而不是等到整个redo日志文件写完才写归档。
逻辑日志文件(数据复制使用)、物理逻辑日志、备份文件、跟踪日志文件、事件日志文件、数据重演文件
3.2ORACLE

参数文件
spfilexxx.ora
控制文件
可以通过在sqlplus里执行alter database backup controlfile to trace导出文本内容,一般用来重建控制文件
数据文件
system.dbf sysaux.dbf undotbs.dbf temp.dbf user.dbf
在线日志文件
可以有多组,每组可以有多个;可以增大或缩小;可以添加或删除;
归档日志文件
一组在线日志写满后,才会启动归档进程写归档日志文件。
其它日志文件,如:alert、 listener等
3.3MYSQL

参数文件、数据文件、Binlong、在线日志文件、日志文件、慢查询日志
Redo/redo Log 是属于InnoDB存储引擎所特有的日志,属于物理日志,记录该数据页更新状态内容,作为服务器异常宕机后事务数据自动恢复使用。
Binlog是属于MySQL Server自带功能,记录所有数据库表结构变更以及表数据修改的二进制日志,不会记录SELECT和SHOW这类操作。Binlog日志是以事件形式记录,还包含语句所执行的消耗时间。作为主从复制和数据恢复使用。Binlog没有自动crash-safe能力。
注:没有控制文件
第4章内存结构
4.1DM8
内存池
1)共享内存池:是DM Server在启动时从操作系统申请的一大片内存。默认大小是200M,可在dm.ini修改参数MEMORY_POOL调整大小,MEMORY_EXTENT_SIZE指定共享内存池每次扩展的大小,MEMORY_TARGET 指定共享内存池能扩展到的最大值。
2)运行时内存池:是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
缓冲区
1)数据缓冲区:DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。dm.ini 文件中 BUFFER(100MB)、KEEP(8MB)、RECYCLE(64MB)、FAST_POOL_PAGES(3000)值(括号中为默认值),这些值分别对应是 NORMAL 缓冲区大小、 KEEP 缓冲区大小、RECYCLE 缓冲区大小、FAST 缓冲区数据页总数。
2)日志缓冲区:存放重做日志的内存缓冲区。RLOG_BUF_SIZE 对日志缓冲区大小进行控制,日志缓冲区所占用的内存是从共享内存池中申请的,单位为页数量,且大小必须为 2 的 N 次方,否则采用系统默认大小 512 页。
3)字典缓冲区:主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。DICT_BUF_SIZE,默认的配置大小为 5M
4)sql缓冲区:提供在执行SQL语句过程中所需要的内存,包括计划、SQL语句和结果集缓存。USE_PLN_POOL参数来支持是否需要计划重用,当指定为非 0 时,则启动计划重用;为 0 时禁止计划重用。参数 CACHE_POOL_SIZE(单位为 MB)指定 SQL 缓冲区大小,默认值为 20M。
排序区
供数据排序所需要的内存空间,SORT_BUF_SIZE,默认20M。
哈希区
为哈希连接而设定的缓冲区,是个虚拟缓冲区。因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。如果计算出的数据量大小超过了哈希缓冲区的大小,则使用 DM8 创新的外存哈希方式;如果没有超过哈希缓冲区的大小,实际上还是使用内存池来进行哈希
操作。 使用参数 HJ_BUF_SIZE 来进行控制,建议保持默认值,或设置为更大的值。 HAGR_HASH_SIZE 表示处理聚集函数时创建哈希表的个数,建议保持默认值 100000。
4.2ORACLE

SGA
Database buffer cache、shared pool、large pool、java pool、streams pool、redo log buffer、fixed sga
PGA
指定分配给一个操作系统进程或线程的内存,这个操作系统进程或线程是一个独立的不与其它操作系统进程或线程共享的。
Sql work area:sort area、hash area、bitmap merge area
Session memory
Private sql area:persistent area、runtime area
UGA
存放会话参数的内存,如:登录信息、数据库会话需要的其它信息
4.3MYSQL

buffer pool
data page、index page、change buffer page、adaptive hash index、lock info、data dictionary
additional memory pool
double write
redo log buffer
第5章进程或线程
5.1DM8
DM 服务器使用“对称服务器构架”的单进程、多线程结构,线程通过一定的同步机制对数据结构进行并发访问和处理。

监听线程
在服务器端口上进行循环监听,一旦有来自客户的连接请求,监
听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。 它在系统启动完成后才启动,并且在系统关闭时首先被关闭。为了保证在处理大量客户连接 时系统具有较短的响应时间,监听线程比普通线程优先级更高。-- 对应oracle的listener进程
工作线程
工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。DM8 的初始工作线程个数由配置文件指定,随着会话连接的增加,工作线程也会同步增加,以保持每个会话都有专门的工作线程处理请求。为了保证用户所有请求及时响应,一个 会话上的任务全部由同一个工作线程完成,这样减少了线程切换的代价,提高了系统效率。 当会话连接超过预设的阀值时,工作线程数目不再增加,转而由会话轮询线程接收所有用户请求,加入任务队列,等待工作线程一旦空闲,从任务队列依次摘取请求任务处理。 --对应oracle的SERVER PROCESS
IO线程
IO 操作的时机主要有以下三种:
1. 需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
2. 缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
3. 检查点到来时,需要将所有脏数据页写入磁盘。
IO 线程在启动后,通常都处于睡眠状态,当系统需要进行 IO 时,发出一个 IO 请求时 IO 线程被唤醒以处理该请求,在完成该 IO 操作后继续进入睡眠状态。通过设置 dm.ini 文件中的 IO_THR_GROUPS 参数来设置 IO 线程的个数,默认情况下,IO 线程的个数是 2 个。一般情况下,IO 线程使用异步的 IO 将数据页写入磁盘,此时,系统将所有的 IO 请求直接递交给操作系统,操作系统在完成这些请求后才通知 IO 线程,这种异步 IO 的方式使得 IO 线程需要直接处理的任务很简单,即完成 IO 后的一些收尾处理并发出 IO 完成通知,如果操作系统不支持异步 IO,此时 IO 线程就需要完成实际的 IO 操作。--对应oracle的DBWn进程
调度线程
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
1. 检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
2. 清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
3. 检查数据重演捕获持续时间是否到期,到期则自动停止捕获;
4. 执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
5. 自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
6. 会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
7. 必要时执行数据更新页刷盘;
8. 唤醒等待的工作线程。
日志 FLUSH 线程
任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO 日志的刷盘必须在数据页刷盘之前进行。事务运行时,会把生成的 REDO 日志保留在日志缓冲区中,当事务提交或者执行检查点时,会通知 FLUSH 线程进行日志刷盘。由于日志具备顺序写入的特点,比数据页分散 IO 写入效率更高。日志 FLUSH 线程和 IO 线程分开,能获得更快的响应速度,保证整体的性能。DM8 的日志 FLUSH 线程进行了优化,在刷盘之前,对不同缓冲区内的日志进行合并,减少了 IO 次数,进一步提高了性能。如果系统配置了实时归档,在 FLUSH 线程日志刷盘前,会直接将日志通过网络发送到实时备库。如果配置了本地归档,则生成归档任务,通过日志归档线程完成。 --对应oracle的LGWR进程
日志归档线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。将日志FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线程中一起做会严重影响系统性能。--对应oracle的ARCn进程
日志 APPLY 线程
在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每 次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务 队列中取出一个任务在备库上将日志重做,并生成自己的日志。--在V4.0做了改进,备库在收到主库发送过来的 RLOG_PKG 后,直接将 RLOG_PKG 写入本地的归档日志文件,完整保留主库上的原始日志,备库重演 RLOG_PKG 产生的联机日志不再进行归档。
定时器线程
在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。通常情况下,DM Server 需要进行定时操作的事件主要有以下几种:
1. 逻辑日志异步归档;
2. 异步归档日志发送(只有在 PRIMARY 模式下,且是 OPEN 状态下);
3. 作业调度。
定时器线程启动之后,每秒检测一次定时器链表,查看当前的定时器是否满足触发条件,如果满足,则把执行权交给设置好的任务,如逻辑日志异步归档等。
默认情况下,达梦服务器启动的时候,定时器线程是不启动的。用户可以设置 dm.ini 中的 TIMER_INI 参数为 1 来设置定时器线程在系统启动时启动。 -- 对应oracle的Job Queue Processes (CJQ0 and Jnnn) ?
逻辑日志归档线程
逻辑日志归档用于 DM8 的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。
1. 本地逻辑日志归档线程
本地归档线程从本地归档任务列表中取出一个归档任务,生成到逻辑日志,并将逻辑日志写入到逻辑日志文件中。如果当前逻辑日志的远程归档类型是同步异地归档并且当前的刷盘机制是强制刷盘,那么就生成一个异地归档任务加入到临时列表中。
2. 远程逻辑日志归档线程
远程归档线程从远程归档任务列表中取出一个归档任务,并根据任务的类型进行相应的处理。任务的类型包括同步发送和异步发送。
MAL 系统相关线程
MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
线程信息的查看
V$LATCHES 记录当前正在等待的线程信息
V$THREADS 记录当前系统中活动线程的信息
select name,thread_desc from v$threads; 可以看到每个线程的描述
V$WTHRD_HISTORY 记录自系统启动以来,所有活动过线程的相关历史信息。
V$PROCESS 记录服务器进程信息
查看操作系统线程
ps -T -p xxx(dmserver的进程IP)
新创建的实例,默认有14种进程

打开其它功能,就会新增相应的线程,如:启用归档后,系统新增了三个dm_rsyswrk_thd线程(Asynchronous archiving thread)

5.2Oracle

ORACLE使用多个进程来运行一个Oracle数据库代码中的不同部分以及额外的Oracle进程。在数据库实例中的每一个进程都会执行一个特定的任务。但在oracle12C后,开始出现多线程数据库模式,一些进程会以线程模式运行。
5.3MYSQL


MYSQL也是采用单进程多线程的方式管理数据库。
参考:DM8系统管理员手册 及 其它DBA们的分享
欢迎访问达梦社区:http://eco.dameng.com
4786

被折叠的 条评论
为什么被折叠?



