1.数据库和实例
1.1.数据库
DM数据库指的是磁盘上存放在达梦数据库中的数据的集合,一般包括,数据文件、日志文件、控制文件、临时文件等
1.2.实例
实例一般是由一组DM后台进程/线程以及一个大型的的共享内存组成。
DM实例存储在服务器的内存中,一般一个实例只能与一个数据库进行关联,大多情况下一个数据库也只能和一个实例进行关联。
在DSC集群中多个实例可以同时装载并打开一个数据库(位于一组由多台服务器共享的磁盘)
2.DM 逻辑存储结构
逻辑存储结构是数据库向用户展现出的一种抽象的数据存储的结构,用于描述数据的逻辑关系.
存储用户数据、系统数据的表空间为数据表空间。
数据表空间分为普通表空间、混合表空间。
混合表空间可以同时存储普通表和HUGE表,其中HUGE数据存储在混合表空间定义指定的的HUGE数据文件路径下。普通表空间不能存储HUGE表。
普通表空间升级混合表空间,可为普通表空间增加指定HUGE数据文件路径。
存储数据库内各类的操作产生的日志信息的表空间为日志表空间。
创建系统时,自动创建5个表空间
1.SYSTEM 表空间:存放 DM 数据库的数据字典信息。用户不能在该表空间中创建表和索引。
2.ROLL 表空间:由 DM 数据库自动维护,用户无需干预。用于保存事务执行 DML 操作前的旧数据,为并发查询提供一致性视图,实现读写互不阻塞。
3.MAIN 表空间:初始化数据库时自动创建,默认包含一个 128 MB 的 MAIN.DBF 数据文件和 HUGE 目录(用于存放 HUGE 数据文件)。MAIN 为混合表空间;创建用户时若未指定表空间,则默认使用 MAIN 作为该用户的默认表空间。
4.TEMP 表空间:由 DM 数据库自动维护。当 SQL 执行需要磁盘空间时,DM 会从 TEMP 表空间分配临时段,例如创建索引、无法在内存中完成的排序、SQL 中间结果集以及用户创建的临时表等。
5.RLOG 表空间:数据库初始化完成后会自动生成两个 .log 日志文件,用于存放重做日志。用户可新增或扩展日志文件。日志文件分为当前活动日志和非活动日志;当前活动日志写满后会自动切换到下一个日志文件,并循环使用。
2.1.数据表空间
表空间划分为段、簇、页(也可称为块)。
1.数据库由一个或多个表空间组成;
2.每个表空间对应一个或多个文件;
3.每个数据文件由一个或多个簇组成;
4.段是簇的上级逻辑单元,一个段可以跨多个数据文件;
5.簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
6.页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元
2.1.1.记录
数据库表中的每一行都是记录。除了HUGE表,其他表都是在数据页中按记录来存储数据的。记录不是存储单位,不能跨页存储,受数据页的大小限制,每条数据的记录长度不可超过页面大小的一半
2.1.2.页
数据页是DM数据库的最小存储单元。默认大小8k,创建数据库指定默认大小后,整个生命周期内都不能修改大小。
页头控制信息包含了页类型、页地址等信息。页中部存放数据。行偏移数组存放在尾部,标识页的空间占用情况。
FILLFACTOR是数据页存储参数。创建表或索引时进行指定,指定可用空间百分比(FILLFACTOR)和可扩展空间百分比(100-FILLFACTOR)。当插入的数据占据的数据页空间百分比低于 FILLFACTOR 时,允许数据插入该页,否则将当前数据页中的数据分为两部分,一部分保留在当前数据页中,另一部分存入一个新页中。(这里保留、存入的意思是指一段完整的记录保留在当前的数据页中,或存入新页中,不是把一段记录拆分存放)
2.1.3.簇
簇是数据页的上级逻辑单元。由同一个数据文件中 16 个或 32 个或 64 个连续的数据页组成。
分配数据簇
三种分配情况
1.创建表或索引时,DM 数据库至少会分配 1 个簇,并自动生成相应数量的数据页供后续使用。若初始分配的簇已用完,或因插入/更新数据需要更多空间,DM 数据库会自动分配新簇。默认情况下初始分配 1 个簇(可通过参数指定数量),用完后再自动扩展。
2.当 DM 数据库的表空间为新簇分配空闲空间时,首先按数据文件从小到大的顺序,在各数据文件中查找可用的空闲簇,找到后即进行分配。
3.若各数据文件均无空闲簇,则继续在各数据文件中查找空闲空间足够的数据文件;找到后,先将所需空间格式化,再进行分配。若各文件的空闲空间均不足,则选择一个数据文件进行扩充。
释放数据簇
1.只做表记录/索引对象的删除,该表对应的数据段会至少保留1个簇不被回收到表空间中,通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用
2.当用户删除了所有记录时,DM 数据库仍然会为该表保留 1-2 个簇供后续使用
3.当使用DROP语句删除表/索引对象,对应的段以及簇都会全部收回,并给存储在此表空间的其他模式对象使用
4.对于临时表空间,DM 数据库会自动释放在执行 SQL 过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。
5.对于回滚表空间,DM 数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇
2.1.4.段
段由一组簇组成,包含的簇可以跨越不同的文件,而一个簇以及该簇所包含的数据页则只能来自一个文件。
1.数据段
表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储。
DM 以簇为单位给每个数据段分配空间,当数据段的簇空间用完时,DM 数据库就给该段重新分配簇,段的分配和释放完全由 DM 数据库自动完成,可以在创建表/索引时设置存储参数来决定数据段的簇如何分配。
2.临时段
在 DM 数据库中,所有的临时段都创建在临时表空间中,这样可以分流磁盘设备的 I/O,也可以减少由于在 SYSTEM 或其他表空间内频繁创建临时数据段而造成的碎片
当处理一个查询时,经常需要为 SQL 语句的解析与执行的中间结果准备临时空间。DM 数据库会自动地分配临时段的磁盘空间
DM 在进行排序操作时就可能需要使用临时段,当排序操作可以在内存中执行,或设法利用索引就可以执行时,就不必创建临时段
对于临时表及其索引,DM 数据库也会为它们分配临时段
3.回滚段
DM 数据库在回滚表空间的回滚段中保存了用于恢复数据库操作的信息。
a.对于未提交事务,当执行回滚语句时,回滚记录被用来做回滚变更。
b.在数据库恢复阶段,回滚记录被用来做所有未提交变更的回滚。
c.在多个并发事务运行期间,回滚段还为用户提供读一致性,所有正在读取受影响行的用户将不会看到行中的任何变动,直到他们事务提交后发出新的查询。
此外,系统将尽可能保存回滚信息,来满足用户查询回滚信息的需要。
自己的理解就是:
该会话的长查询结束,只是让这部分回滚信息解除了‘必须保留’的硬锁定。但具体什么时候物理清除,还要看系统参数 UNDO_RETENTION 设置的保留时长,以及系统中是否还存在比它更老的活跃查询。
DM 数据库会收集回滚信息的使用情况,并根据统计结果对回滚信息保存周期进行调整,数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长。
拆分理解:
数据库将回滚信息保存周期设为比系统中活动的最长的查询时间稍长
理解:长查询的开始时间 → 长查询的结束时间(即该查询的总执行时长)
延迟段分配(参数:DEFERRED_SEGMENT_CREATION=1)
该功能可以有效改善创建分区表时,分区数较多导致初始为空的分区表分配过多空间的问题。
1.在创建表或索引时先暂时不申请存储空间,当对表中插入数据时,才尝试申请存储空间
2.对于已延迟段分配的表创建二级索引时,新建的索引同样也会延迟段分配(这个环境下插入数据,则同时申请存储空间)
对表或索引进行延迟段分配,可能存在以下特殊场景:
1.对已延迟段分配的表进行查询插入,即便查询空表不会插入任何数据,目标表也会申请段。 因此需要注意,在启用 DDL 相关优化如 ALTER_TABLE_OPT 参数时,DM 可能会选择使用查询插入的方式来加速 DDL 执行,此时即便目标表已延迟段分配,该 DDL 的执行会导致目标表申请段。
2.表指定了自增列起始边界,即便建表时指定了延迟段分配也会被忽略。
3.重建已延迟段分配的索引将导致该索引申请段。
2.1.5.日志表空间
与数据库中存储的数据不同的是,日志信息是不由用户进行维护的,而是由系统自动产生并进行自动管理,用户仅可查看并应用相关信息。
因此,该表空间的存储管理方法略有不同:
1.系统对每一个修改物理数据页的动作生成一个 REDO 记录(RREC-指的记录动作的记录)
2.多个有逻辑关联的 REDO 记录组合成一个物理事务(PTX),与数据库管理系统中事务(Transaction)概念相对应
3.一个或多个连续的物理事务组合成为一个 REDO 日志包(RLOG_PKG),刷盘后系统将日志包存储到日志表空间中
2.1.6.REDO 记录
REDO 记录是日志记录过程中的最小单元,根据记录内容的不同,又分为物理 RREC 和逻辑 RREC。
物理 RREC:记录的是数据页的变化情况,有操作类型、修改数据页地址、页内偏移、数据页上的修改内容;变长类型的 Redo 记录,在 RREC 记录头有两字节的长度信息。(记录数据位置的二进制数据,恢复时直接覆盖到二进制记录数据的位置)
逻辑 RREC:记录的是一些数据库逻辑操作步骤,主要包括:事务启动、事务提交、事务回滚、字典封锁、事务封锁、B 树封锁、字典淘汰等。逻辑 RREC 记录是专门为数据守护增加的记录类型,解决备库重演与用户访问备库的并发冲突,以及主库 DDL 后主备字典缓存不一致;备库解析后生成事务、封锁对象、淘汰过期字典。逻辑 RREC 一般在 PRIMARY 模式下才产生。
为什么做区分:为了平衡速度和正确性。堆表数据用物理日志追求极速恢复,索引维护用逻辑日志保证恢复后索引结构不会出错
2.1.7.物理事务
物理事务(PTX)是数据库内部一系列修改物理数据页操作的集合,对应通常说的事务,具有原子性、有序性、无法撤销。系统用 LSN 维护它。LSN 是 BIGINT,自动递增、全局唯一,一个 LSN 代表一个 PTX。
数据库完成一个事务但未提交时,该事务中所有修改物理数据页的操作对应的 RREC,组合成一个 PTX。系统给新 PTX 分配 LSN,存在 PTX 头里。此时修改还没刷盘,写不进联机日志,先暂存在日志包中,等合适时机再刷入日志表空间。
2.1.8.日志包
RLOG_PKG 是 DM 批量保存物理事务产生的 Redo 日志的数据单元,以 PTX 为单位,一个包内可连续保存一个或多个 PTX。每个日志包都有包序号 PKG SEQNO;单节点下包序号唯一且连续递增,相邻日志包的 LSN 总体递增,可用来校验归档日志的连续性。
日志包自描述,大小不固定,采用固定包头 + 可变包头,包头记录类型、长度、包序号、LSN 等控制信息。数据守护中,主库以 RLOG_PKG 为最小单位发送 Redo 日志到备库。
生成时系统先给日志包分配包序号,PTX 写入后据此修改包头;事务提交或日志包写满时触发刷盘,刷盘线程将日志包写入联机日志文件,即加入日志表空间。加入后,日志表空间根据包头信息修改一系列变量,可通过 V$RLOG 查看。
https://eco.dameng.com
文章
阅读量
获赞
