一、存储文件
数据库里存储的一般是用户数据、数据字典、保证ACID及数据安全的数据、用于故障及错误分析的数据和服务功能配置。而存储文件主要有配置文件、控制文件、数据文件、重做日志文件和事件日志文件及跟踪日志文件。
DM新初始化的库的文件情况
- 配置文件是DM数据库用来设置功能选项的一些文本文件,其以ini为扩展名,用户可以通过修改其中的某些参数取值来启用/禁用特定功能或对系统运行环境设置更优的参数值以提升系统性能。
- 控制文件是一个二进制文件,主要记录数据库必要的初始信息(包括数据库名称、数据库服务器模式、OGUID唯一标识、服务器版本、数据文件版本、启动次数及最后一次启动时间、表空间信息、控制文件校验码)。控制文件可以通过dmctlcvt来进行ctl文件和文本文件之间的转化。在服务器运行期间,执行表空间的DDL等操作后,服务器内部需要同步修改控制文件内容,如果在修改过程中服务器故障,可能会导致控制文件损坏,为了避免出现这种情况,在修改控制文件时系统内容会执行备份操作。
- 数据文件也是二进制文件,以dbf为扩展名,在逻辑上有与之对应的表空间,大致有行存储数据文件、列存储数据文件、回滚数据文件以及临时数据文件。
- 行存储数据文件对应系统自带的系统表空间SYSTEM、默认用户表空间MAIN以及用户自定义的行存数据表空间。它可以用来存储以行存储方式组织的B树、堆表以及位图索引的数据,逻辑上是采用段、簇、页分层的方式进行管理。
- 列存储数据文件对应系统自创的列存目录HMAIN以及用户自定义表空间列存目录。它用来存储列存数据,逻辑上采用数据分片的方式进行管理。
- 回滚数据文件对应系统自创的回滚表空间ROLL。它用来保存系统的回滚记录。
- 临时数据文件对应系统自创的临时数据表空间TEMP。它用于存储临时表数据以及缓存不足时转存到磁盘的临时数据。
- 重做日志文件(也可以称为联机日志文件)一样也是二进制文件,以log为扩展名(但不是所有以log为扩展名的都是重做日志文件),其主要记录在DM数据库中添加、删除、修改对象,或者改变数据等操作,此外也存储了数据库的事务日志,以便系统出现故障时能够进行故障恢复。每个DM数据库实例必须至少会有2个重做日志文件(默认为DAMENG01.log和DAMENG02.log)来循环使用。最后还有一个日志归档,会对重做日志文件进行归档,归档日志文件以归档时间命名,扩展名为log。重做日志归档是一些数据库高级功能,在归档模式下运行会更安全,当出现故障时其丢失数据的可能性更小。
- 事件日志文件以及跟踪日志文件是记录服务器运行期间信息的文本文件,用于分析定位系统错误,常用的有服务器事件日志和SQL跟踪日志。
二、存储结构
DM目前只要使用表空间对数据文件在逻辑上进行管理,所有的数据文件组合在一起被划分到一个或者多个表空间中。表空间划分为段、簇、页,可以使得DM数据库能够更加高效地控制磁盘空间的利用率。
- 数据页是DM数据库中最小的数据存储单元,页的大小对应物理存储空间上特定数量的存储字节(默认大小为8KB),一旦创建好了数据库,则在该库的整个生命周期内,页的大小都不能够改变。数据页的结构图如下:
- 簇是数据页的上级逻辑单元,由同一个数据文件中16、32或64个连续的数据页组成,是数据库对象分配存储空间的基本单位。簇的大小由用户在创建数据库时指定(默认大小为16),同样也是一旦创建好数据库后,该数据库的簇的大小就不能够改变。根据簇内数据页的使用情况可以将簇分为空闲簇、半满簇和全满簇。簇的结构图如下:
- 段是簇的上级逻辑单元,是按照数据库对象及数据类型划分的簇的逻辑集合。DM按照数据的使用类型将段分为数据段和回滚段两种类型。数据段可以被定义成特定对象的数据结构,如表数据段、索引数据段、LOB数据段等,表中的数据以表数据段结构存储,索引中的数据以索引数据段结构存储;回滚段保存了对象在事务中操作的信息,所有对象的回滚段都在回滚表空间中,用于回滚还原数据以及保证多事务并发时的读一致性。段的结构图如下:
对于簇和段我们通过一个页来描述,称为簇描述页和段描述页,结构图分别为:
一个段只能属于一个表空间,可以跨多个数据文件;簇则是由磁盘上连续的页组成,一个簇只能在一个数据文件中(也可以说每个数据文件可以由一个或多个簇组成);页则是数据库中最小的分配单元,也是数据库中使用的最小的IO单元。
- 组织方式
在数据文件中有行存储数据文件和列存储数据文件,两者的组织方式有很大不同。
行列存储对比
行存储的表又有B树和堆表这两种组织方式,B树是随广泛的存储形式,其数据是按B树索引组织的(普通表、分区表、B树索引的物理存储格式都是B树),其使用的逻辑是ROWID(从1开始递增),B树索引的数据按照用户指定的聚簇key进行排序,当未指定聚集key时,使用逻辑ROWID作为聚集key;而堆表是指采用了物理ROWID形式的表,即使用文件号、页号、页内偏移而得到ROWID值。
- B树的每个节点都是一个数据页,而实际数据则全部存储在叶子节点上,中间节点(也称为B树内节点)仅用来存放B树的分支信息,其中每个记录都指向下一个下级节点,B树还有两个数据段内节点段和叶子段,分别存放内节点数据和叶子节点数据。对于B树的根页,它记录着叶子节点段和内节点段的段头信息,根页的下一页则作为B树的控制页,存放B树的行数、NEXT_ROWID等控制。
B树的存储结构
- 堆表的数据是以挂链形式存储的(一般情况下,支持最多128个链表,每个链表都使用一个独立的数据段),其实可以将堆表的链表看作成“扁平B树”,在系统中描述其的内存结构就是B树的描述结构,链表中的数据页都是叶子数据页。
堆表的存储结构
列存数据表是根据固定的记录行数将数据划分为不同的数据区,而数据区的大小是在创建列存表时指定,区的大小必须是2的多少次方(默认值为65536行)。数据区内并没有该区内数据的描述,其描述是通过行存辅助表来存储的。列存表有两种分别为事务型和非事务型,通过建表存储参数指定,两者对数据的组织方式有所不同。
- 事务型列存有4个辅助表:$AUX、$RAUX、$DAUX、$UAUX分别存放数据区信息、插入的未满区的数据、删除的数据、更新的数据。在插入新数据时,如果当前插入的数据未满一个区,则先插入到RAUX表中,待后续插入填满后再移到列存文件中;修改和删除数据时则直接将信息记录到UAUX和DAUX表中,不直接修改列存文件的数据,当管理员数据重整时才会将修改同步到列存文件中。
- 非事务型列存只有一个辅助表$AUX用来存储数据区信息,每次修改时都直接修改列存储数据文件。