注册
【与达梦同行】达梦数据库之逻辑结构简介
技术分享/ 文章详情 /

【与达梦同行】达梦数据库之逻辑结构简介

尚雷 2022/12/28 3046 2 1

要想学好一个数据库,首先就需要了解其结构,在学习达梦数据库,我也抽了时间,学习了下达梦数据库的逻辑结构,并和我所熟悉的Oracle数据库做了一些对比学习。

一、存储结构

DM 数据库为数据库中的所有对象分配逻辑空间,并存放在数据文件中。在 DM 数据库内部,所有的数据文件组合在一起被划分到一个或者多个表空间中,所有的数据库内部对象都存放在这些表空间中。同时,表空间被进一步划分为段、簇和页(也称块)。

DM 数据库实例定义也和Oracle相同,是由一组正在运行的 DM 后台进程/线程以及一个大型的共享内存组成。单机环境下,一个实例对应一个数据库,DM 共享存储集群(DMDSC)类似于Oracle RAC ,可以多个实例对应一个数据库。

DM 数据库类同Oracle数据库,是由 数据文件、日志文件、控制文件以及临时数据文件等组成。

image.png

如上图:DM8的存储结构如下:

数据库由一个或多个表空间组成;
每个表空间由一个或多个数据文件组成;
每个数据文件由一个或多个簇组成;
段是簇的上级逻辑单元,一个段可以跨多个数据文件;
簇由磁盘上连续的页组成,一个簇总是在一个数据文件中;
页是数据库中最小的分配单元,也是数据库中使用的最小的 IO 单元

1.1 表空间

DM数据库表空间分为普通表空间及混合表空间,普通表空间不能存储 HUGE 表,而混合表空间可以同时存储普通(非 HUGE)表和 HUGE 表,其中 HUGE 数据文件存储在混合表空间定义中指定的 HUGE 数据文件路径下。

可以通过为普通表空间增加指定 HUGE 数据文件路径将普通表空间升级为混合表空间。在创建 DM 数据库时,会自动创建 4 个表空间:SYSTEM 表空间、ROLL 表空间、MAIN 表空间和 TEMP 表空间,其中ROLL表空间类似Oracle的UNDO表空间,MAIN表空间类似Oracle的User表空间。DM的4个初始表空间含义如下:

SYSTEM 表空间存放了有关 DM 数据库的字典信息,用户不能在 SYSTEM 表空间创建表和索引;

ROLL 表空间完全由 DM 数据库自动维护,用户无需干预。该表空间用来存放事务运行过程中执行 DML 操作之前的值,从而为访问该表的其他用户提供表数据的读一致性视图;

MAIN 表空间在初始化库的时候,就会自动创建一个大小为 128M 的数据文件 MAIN.DBF,以及一个 HMAIN 目录作为 HUGE 数据文件路径,因此 MAIN 表空间为混合表空间。在创建用户时,如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间;

TEMP 表空间完全由 DM 数据库自动维护。当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP 表空间;

每个用户都有一默认表空间,对于 SYS、SYSSSO、SYSAUDITOR 系统用户,默认的用户表空间是 SYSTEM,SYSDBA 的默认表空间为 MAIN,新创建的用户如果没有指定默认表空间,则系统自动指定 MAIN 表空间为用户默认的表空间(多像Oracle)

可以通过 select * from v$tablespace;

select * from dba_tablespaces;来查询表空间的一些使用信息。
展开源码
[dmdba@openstack HMAIN]$ disql
disql V8
用户名:sysdba
密码:

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.341(ms)
SQL>
SQL> select * from v$tablespace;

行号 ID NAME CACHE TYPE$ STATUS$ MAX_SIZE TOTAL_SIZE FILE_NUM ENCRYPT_NAME ENCRYPTED_KEY COPY_NUM SIZE_MODE OPT_NODE USED_SIZE

1 0 SYSTEM 1 0 0 3168 1 NULL NULL NULL NULL NULL 2032
2 1 ROLL 1 0 0 7904 1 NULL NULL NULL NULL NULL 6864
3 3 TEMP 2 0 3276800 32768 1 NULL NULL NULL NULL NULL 32
4 4 MAIN 1 0 0 4096 1 NULL NULL NULL NULL NULL 288
5 5 BOOKSHOP NORMAL 1 0 0 4800 1 NULL NULL NULL NULL NULL 1072
6 6 DMHR NORMAL 1 0 0 4096 1 NULL NULL NULL NULL NULL 16

6 rows got

已用时间: 5.292(毫秒). 执行号:2100.

1.2 记录

数据库表中的每一行是一条记录。在 DM 中,除了 HUGE 表,其他的表都是在数据页中按记录存储数据的。也就是说,记录是存储在数据页中的,记录并不是 DM 数据库的存储单位,页才是。

由于记录不能跨页存储,这样记录的长度就受到数据页大小的限制。数据页中还包含了页头控制信息等空间,因此 DM 规定每条记录的总长度不能超过页面大小的一半

1.3 页

数据页(也称数据块)是 DM 数据库中最小的数据存储单元。页的大小对应物理存储空间上特定数量的存储字节,在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,则在该库的整个生命周期内,页大小都不能够改变

1.4 簇

簇是数据页的上级逻辑单元,由同一个数据文件中 16 个或 32 个或 64 个连续的数据页组成。在 DM 数据库中,簇的大小由用户在创建数据库时指定,默认大小为 16。假定某个数据文件大小为 32MB,页大小为 8KB,则共有 32MB/8KB/16=256 个簇,每个簇的大小为 8K*16=128K。和数据页的大小一样,一旦创建好数据库,此后该数据库的簇的大小就不能够改变。 可以创建数据簇也可以释放数据簇。

分配数据簇

当创建一个表/索引的时候,DM 为表/索引的数据段分配至少一个簇,同时数据库会自动生成对应数量的空闲数据页,供后续操作使用。如果初始分配的簇中所有数据页都已经用完,或者新插入/更新数据需要更多的空间,DM 数据库将自动分配新的簇。在缺省情况下,DM 数据库在创建表/索引时,初始分配 1 个簇,当初始分配的空间用完时,DM 数据库会自动扩展。

当 DM 数据库的表空间为新的簇分配空闲空间时,首先在表空间按文件从小到大的顺序在各个数据文件中查找可用的空闲簇,找到后进行分配;如果各数据文件都没有空闲簇,则在各数据文件中查找空闲空间足够的,将需要的空间先进行格式化,然后进行分配;如果各文件的空闲空间也不够,则选一个数据文件进行扩充。

释放数据簇

对于用户数据表空间,在用户将一个数据段对应的表/索引对象 DROP 之前,该表对应的数据段会保留至少 1 个簇不被回收到表空间中。在删除表/索引对象中的记录的时候,DM 数据库通过修改数据文件中的位图来释放簇,释放后的簇被视为空闲簇,可以供其他对象使用。当用户删除了表中所有记录时,DM 数据库仍然会为该表保留 1-2 个簇供后续使用。若用户使用 DROP 语句来删除表/索引对象,则此表/索引对应的段以及段中包含的簇全部收回,并供存储于此表空间的其他模式对象使用。

对于临时表空间,DM 数据库会自动释放在执行 SQL 过程中产生的临时段,并将属于此临时段的簇空间还给临时表空间。

对于回滚表空间,DM 数据库将定期检查回滚段,并确定是否需要从回滚段中释放一个或多个簇。

1.5 段

段是簇的上级逻辑分区单元,它由一组簇组成。在同一个表空间中,段可以包含来自不同文件的簇,即一个段可以跨越不同的文件。而一个簇以及该簇所包含的数据页则只能来自一个文件,是连续的 16 或者 32 个数据页。由于簇的数量是按需分配的,数据段中的不同簇在磁盘上不一定连续。

段可分为如下类型;

  • 数据段
  • 临时段
  • 回滚段

以上是达梦数据库的一些逻辑结构的知识,要想深入了解,还需通过理论结合实践,后面,我也将会通过一些实际操作结合理论来更详细的理解达梦数据库。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服