1.数据库与实例
数据库:DM 数据库指的是磁盘上存放在 DM 数据库中的数据的集合,一般包括:数据文件、日志文件、控制文件以及临时数据文件等
实例:实例一般是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成
2.DM逻辑存储结构
逻辑存储结构图如下
- 数据库由一个或多个表空间组成
- 每个表空间由一个或多个表空间组成
- 每个数据文件由一个或多个簇组成
- 段是簇的上级逻辑单元,一个段可以跨多个数据文件
- 簇是由磁盘上连续的页组成,一个簇总是在一个数据文件里
- 页是数据库中最小的分配单元,也是数据库中使用的最小io单元
2.1表空间
DM 数据库中的表空间可以分为普通表空间和混合表空间。普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通(非 HUGE)表和 HUGE 表,其中 HUGE 数据文件存储在混合表空间定义中指定的 HUGE 数据文件路径下。可以通过为普通表空间增加指定 HUGE 数据文件路径将普通表空间升级为混合表空间。
在创建 DM 数据库时,会自动创建 4 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间和 TEMP 表空间。
- SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引。SYSTEM 表空间又称为系统表空间。
- ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图。
- MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径,因此 MAIN 表空间为混合表空间。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间。
- TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间。
系统用户sysdba默认表空间为main,syssso,sysauditor默认表空间为system,如果新建用户没有指定表空间,默认是main表空间。
一般情况下,建议用户自己创建一个表空间来存放业务数据,或者将数据存放在默认的用户表空间 MAIN 中。
可以通过如下语句查看表空间信息:
SELECT * FROM V$TABLESPACE; |
2.2记录
数据库表中的每一行是一条记录。在 DM 中,除了 HUGE 表,其他的表都是在数据页中按记录存储数据的。由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此 DM 规定每条记录的总长度不能超过页面大小的一半。
2.3页
数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变。下图显示了 DM 数据库页的典型格式。
2.4簇
簇是数据页的上级逻辑单元,由同一个数据文件中 16 个或 32 个或 64 个连续的数据页组成。在 DM 数据库中,簇的大小由用户在创建数据库时指定,默认大小为 16。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。
- 分配数据簇
当创建一个表/索引的时候,DM 为表/索引的数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,供后续操作使用。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,DM 数据库将自动分配新的簇。在缺省情况下,DM 数据库在创建表/索引时,初始分配 1 个簇,当初始分配的空间用完时,DM 数据库会自动扩展。
当 DM 数据库的表空间为新的簇分配空闲空间时,首先在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配;如果各数据文件都没有空闲簇,则在各数据文件中查找空闲空间足够的,将需要的空间先进行格式化,然后进行分配;如果各文件的空闲空间也不够,则选一个数据文件进行扩充。
- 释放数据簇
对于用户数据表空间,在用户将一个数据段对应的表/索引对象 DROP 之前,该表对应的数据段会保留至少 1 个簇不被回收到表空间中。在删除表/索引对象中的记录的时候,DM 数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用。当用户删除了表中所有记录时,DM 数据库仍然会为该表保留 1-2 个簇供后续使用。若用户使用 DROP 语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。
临时表空间:dm会自动删除语句执行过程中产生的临时段。
回滚表空间:dm会定期检查回滚段使用情况。
2.5段
段时簇的上级逻辑分区单元,它由一组簇组成。
- 数据段:表数据段,索引数据段
- 临时段:所有的临时段存储在临时表空间中
- 回滚段:保存在回滚表空间中,用做数据库的一致性读和实例恢复
二、物理结构
物理文件包括配置文件,控制文件,数据文件,重做日志文件,归档日志文件,备份文件,跟踪日志文件,结构图如下
1.配置文件:配置文件以ini为扩展名,可以通过修改里面的参数值达到一下两个目的:
(1)启用/禁用特定功能选项
(2)根据系统运行情况设置参数值,提升系统性能
2.控制文件:控制文件名为dm.ctl,是一个二进制文件,主要包含以下内容:
(1)数据库名称
(2)数据库服务器模式
(3)OGUID唯一标识
(4)数据库服务器版本
(5)数据文件版本
(6)数据库的启动次数
(7)数据库最近一次启动时间
(8)表空间信息
(9)控制文件校验码
3.数据文件:以dbf为扩展名,用来存放数据,不指定maxsize,数据文件大小会无限增长,但最终还会受系统磁盘空间影响。
4.重做日志文件:在数据库中执行增删改操作的时候,数据库会以特定的格式记录下这些操作至重做日志文件中,可以避免因为数据库意外宕机,电源断电导致的数据丢失,数据库进行实例恢复来保证数据的一致性。在归档模式下,需要等到日志所记录的脏数据全部写入数据文件和重做日志都被归档,此重做日志才可以被覆盖。
5.归档日志:开启归档模式后,数据库会将重做日志文件拷贝至归档文件中,如果需要数据恢复的时候可以利用归档文件结合数据文件备份来尽可能的将数据还原到最近的时间点。
6.逻辑日志文件:如果在 DM 数据库上配置了复制功能,复制源就会产生逻辑日志文件。逻辑日志文件是一个流式的文件,它有自己的格式,且不在第一章所述的页,簇和段的管理之下。逻辑日志文件内部存储按照复制记录的格式,一条记录紧接着一条记录,存储着复制源端的各种逻辑操作。用于发送给复制目的端。
7.物理逻辑日志文件:按照特定的格式存储的服务器的逻辑操作,专门用于dbms_logmnr包挖掘数据库历史执行语句,开启物理逻辑复制功能,此部分日志会记录在重做日志文件中。
要开启物理逻辑日志的功能,需要满足下面两个条件:
(1)设置 RLOG_APPEND_LOGIC 为 1、2、3 或者 4;
(2)通过设置参数 RLOG_IGNORE_TABLE_SET=1 或者建表(或修改表)时指定 ADD LOGIC LOG 开启。如果需要记录所有表的物理逻辑日志,设置 INI 参数 RLOG_IGNORE_TABLE_SET 为 1 即可;如果只需要记录某些表的物理逻辑日志,设置 INI 参数 RLOG_IGNORE_TABLE_SET 为 0,并在建表或者修改表的语法中使用 ADD LOGIC LOG。
8.备份文件:备份文件以bak为扩展名。
9.sql日志文件:用户在 dm.ini 中配置 SVR_LOG 参数后就会打开 SQL 日志。SQL 日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,基于跟踪日志可以对系统运行状态有一个分析,比如,可以挑出系统现在执行速度较慢的 SQL 语句,进而对其进行优化。
10.事件日志文件:事件日志文件记录了 DM 数据库运行时的关键事件。例如:系统启动、关闭、内存申请失败、IO 错误等一些致命错误;数据库运行过程中的日志信息;备份还原过程中备份还原操作的阶段性信息等。事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志简称 ELOG。事件日志文件随着 DM 数据库服务的运行一直存在。
三、内存结构
- 内存池:分为共享内存池和运行是内存池,可以通过v$MEM_POOL来查看内存使用情况
1.1共享内存池:dm数据库启动时从操作系统申请的一大片内存,共享池的参数为memory_pool,默认为500m,如果运行时超过了此内存大小,会根据参数MEMORY_EXTENT_SIZE 自动进行扩展,memory_target指定共享池超过此大小后,在空闲的时候会收缩到的大小。
1.2运行时内存池:除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
2.缓冲区
2.1数据缓冲区
数据缓冲区是 DM Server 在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。
2.2日志缓冲区
日志缓冲区是用于存放重做日志的内存缓冲区。
2.3字典缓冲区
字典缓冲区主要存储一些数据字典信息,如模式信息、表信息、列信息、触发器信息等。
2.4SQL缓冲区
SQL 缓冲区提供在执行 SQL 语句过程中所需要的内存,包括计划、SQL 语句和结果集缓存。
2.5排序区
排序缓冲区提供数据排序所需要的内存空间。
2.6哈希区
DM8 提供了为哈希连接而设定的缓冲区,不过该缓冲区是个虚拟缓冲区。之所以说是虚拟缓冲,是因为系统没有真正创建特定属于哈希缓冲区的内存,而是在进行哈希连接时,对排序的数据量进行了计算。
四、DM线程
1.监听线程
监听线程主要的任务是在服务器端口上进行循环监听,一旦有来自客户的连接请求,监听线程被唤醒并生成一个会话申请任务,加入工作线程的任务队列,等待工作线程进行处理。它在系统启动完成后才启动,并且在系统关闭时首先被关闭。
2.工作线程
工作线程是 DM 服务器的核心线程,它从任务队列中取出任务,并根据任务的类型进行相应的处理,负责所有实际的数据相关操作。
3.io线程
3.1需要处理的数据页不在缓冲区中,此时需要将相关数据页读入缓冲区;
3.2缓冲区满或系统关闭时,此时需要将部分脏数据页写入磁盘;
3.3检查点到来时,需要将所有脏数据页写入磁盘。
4.调度线程
调度线程用于接管系统中所有需要定时调度的任务。调度线程每秒钟轮询一次,负责的任务有以下一些:
检查系统级的时间触发器,如果满足触发条件则生成任务加到工作线程的任务队列由工作线程执行;
清理 SQL 缓存、计划缓存中失效的项,或者超出缓存限制后淘汰不常用的缓存项;
执行动态缓冲区检查。根据需要动态扩展或动态收缩系统缓冲池;
自动执行检查点。为了保证日志的及时刷盘,减少系统故障时恢复时间,根据 INI 参数设置的自动检查点执行间隔定期执行检查点操作;
会话超时检测。当客户连接设置了连接超时时,定期检测是否超时,如果超时则自动断开连接;
必要时执行数据更新页刷盘;
唤醒等待的工作线程。
5.日志flush线程
任何数据库的修改,都会产生重做 REDO 日志,为了保证数据故障恢复的一致性,REDO 日志的刷盘必须在数据页刷盘之前进行。
6.日志归档线程
日志归档线程包含异步归档线程,负责远程异步归档任务。如果配置了非实时归档,由日志 FLUSH 线程产生的任务会分别加入日志归档线程,日志归档线程负责从任务队列中取出任务,按照归档类型做相应归档处理。
将日志 FLUSH 线程和日志归档线程分开的目的是为了减少不必要的效率损失,除了远程实时归档外,本地归档、远程异步归档都可以脱离 FLUSH 线程来做,如果放在 FLUSH 线程中一起做会严重影响系统性能。
7.日志apply线程
在配置了数据守护的系统中,创建了一个日志 APPLY 线程。当服务器作为备库时,每次接收到主库的物理 REDO 日志生成一个 APPLY 任务加入到任务队列,APPLY 线程从任务队列中取出一个任务在备库上将日志重做,并生成自己的日志,保持和主库数据的同步或一致,作为主库的一个镜像。备库数据对用户只读,可承担报表、查询等任务,均衡主库的负载。
8.定时器线程
在数据库的各种活动中,用户常常需要数据库完成在某个时间点开始进行某种操作,如备份;或者是在某个时间段内反复进行某种操作等。定时器线程就是为这种需求而设计的。
9.逻辑日志归档线程
逻辑日志归档用于 DM8 的数据复制中,目的是为了加快异地访问的响应速度,包含本地逻辑日志归档线程和远程逻辑日志归档线程。当配置了数据复制,系统才会创建这两个线程。
10.MAL系统相关线程
MAL 系统是 DM 内部高速通信系统,基于 TCP/IP 协议实现。服务器的很多重要功能都是通过 MAL 系统实现通信的,例如数据守护、数据复制、MPP、远程日志归档等。MAL 系统内部包含一系列线程,有 MAL 监听线程、MAL 发送工作线程、MAL 接收工作线程等。
11.其他线程
事实上,DM 数据库系统中还不止以上这些线程,在一些特定的功能中会有不同的线程,例如回滚段清理 PURGE 线程、审计写文件线程等。
12.与线程有关的视图
V$LATCHES:记录当前正在等待的线程信息
V$threads:记录当前系统中活动线程的信息
V$process:记录服务器进程信息
五、事务特性
- 原子性:事务的原子性保证事务包含的一组更新操作是原子不可分的,也就是说这些更新操作是一个整体,对数据库而言全做或者全不做,不能部分地完成。
- 一致性:数据一致性是指表示客观世界同一事务状态的数据,不管出现在何时何处都是一致的、正确的、完整的。
- 隔离性:事务是隔离的,意味着每个事务的执行效果与系统中只有该事务的执行效果一样,某个并发事务所做的修改必须与任何其他的并发事务所做的修改相互隔离。
- 持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
六、多版本并发控制
DM 数据库的多版本实现完全消除了行锁对系统资源的消耗,查询永远不会被阻塞也不需要上行锁,并通过 TID 锁机制消除了插入、删除、更新操作的行锁。数据库的读操作与写操作不会相互阻塞,并发度大幅度提高。
DM 数据库基于物理记录和回滚记录实现行级多版本支持,数据页中只保留物理记录的最新版本,通过回滚记录维护历史版本,所有事务针对特定的版本进行操作。




