DM物理存储结构及内存结构
1.DM物理存储结构
1.1.配置文件
DM数据库使用了磁盘上大量的物理存储结构来保存和管理用户数据。包括:
用于进行功能设置的配置文件;用户记录文件分布的控制文件;用于保存用户实际数据的数据文件、重做日志文件、归档日志文件、备份文件;用来进行问题跟踪的跟踪日志文件等。
服务器的配置文件以INI为扩展名,用户可以通过修改其中的某些参数取值来启用/禁用服务器特定功能项;
客户端的配置文件为dm_svc.conf,用户可以在该文件中为JDBC等接口以及Disql等工具配置连接参数,或者启用/禁用客户端特定功能项。
1.1.1.服务器配置文件
每创建一个DM数据库,就会自动生成dm.ini参数文件。dm.ini是DM数据库启动所必须的配置文件,主要的配置模块包括:控制文件相关、实例名、内存相关、线程相关等。
参数属性分为三种:手动、静态和动态。
手动,不能被动态修改,必须手动修改dm.ini参数文件,然后重启才能生效。
静态,可以被动态修改,修改后重启服务器才能生效。
动态,可以被动态修改,修改后即时生效。
1.1.2.客户端配置文件
dm_svc.conf是一个客户端配置文件,它包含了DM各接口和客户端工具所需要配置的一些参数。它必须和接口/客户端工具位于同一台机器上才能生效。
可以通过设置操作系统环境变量DM_SVC_PATH来修改dm_svc.conf文件路径。
1.2.控制文件
每个DM数据库都拥有两个控制文件,即dmctl和dmtemp.ctl控制文件。创建数据库时,按照CTL_PATH参数自动创建dm.ctl控制文件,首次启动数据库时自动在dm.ctl所在目录下创建dmtemp.ctl控制文件。
dm.ctl用于记录数据库必要的初始信息,主要包含:
数据库名称
数据库服务器模式
OGUID唯一标识
数据库服务器版本
数据文件版本
数据库的启动次数
数据库最近一次启动时间
表空间信息
控制文件校验码
dmtemp.ctl用于记录临时表空间信息,主要包括临时表空间名以及临时表空间物理文件路径等。
1.3.数据文件
数据文件以DBF为扩展名,它是数据库中最重要的文件类型,一个DM数据文件对应磁盘上的一个物理文件或者达梦分布式数据库中的一个逻辑文件,数据文件是真实数据存储的地方。
当DM的数据文件空间用完时,它可以自动扩展。通过MAXSIZE参数进行扩展量的限制,最终大小受物理磁盘大小的限制。
数据文件按数据组织形式,可以分为如下几种:
B树数据
行存储常用B树来存数据,B树分内节点和叶子段,靠指针联系;要是表没聚集索引,系统会自动生成唯一的ROWID来标识每一行。
堆表数据
堆表数据像多条链子(最多128条,每条是一个存储段),插入时会有提前确定的唯一编号,能同时插入很多数据,效率高。还不用额外存这个编号,省空间。
列存储数据
列存储是把数据按列分开存,每列有自己的文件,还有辅助表记列的信息;读列数据时只扫对应文件和辅助表,有些场景下比行存储快很多。
位图索引
位图索引与B树索引不同,每个索引条目不是指向一行数据,而是指向多行数据。每个索引项保存的是一定范围内所有行与当前索引键值映射关系的位图。
1.4.重做日志文件
重做日志文件即REDO日志,在DM数据库中添加、删除、修改对象或者改变数据,DM都会按照特定的格式,将这些操作执行的结果写入到当前的重做日志文件中。每个DM数据库必须至少有2个重做日志文件,默认为DAMENG01.log、DAMENG02.log,两个文件循环使用。
重做日志文件因为是数据库正在使用的日志文件,因此被称为联机日志文件。
1.5.归档日志文件
日志文件分为联机日志文件和归档日志文件。DM数据库可以在归档模式和非归档模式下运行。归档模式下,数据库会同时将重做日志写入联机日志文件和归档日志文件分别进行存储。
采用归档模式会对系统的性能产生影响,然而系统在归档模式下运行会更安全,当出现故障时其丢失数据的可能性更小,这是因为一旦出现介质故障,如磁盘损坏时,利用归档日志,系统可被恢复至故障发生的前一刻,也可以还原到指定的时间点,而如果没有归档日志文件,则只能利用备份进行恢复。
1.6.物理逻辑日志文件
物理逻辑日志,是按照特定的格式存储的服务器的逻辑操作,专门用于 DBMS_LOGMNR 包挖掘获取数据库系统的历史执行语句。当开启记录物理逻辑日志的功能时,这部分日志内容会被存储在重做日志文件中。
1.7.备份文件
备份文件以 bak 为扩展名,当系统正常运行时,备份文件不会起任何作用,它也不是数据库必须有的联机文件类型之一。然而,当数据库不幸出现故障时,备份文件就显得特别重要。
1.8.SQL日志文件
SQL日志是在配置文件中配置后开启的纯文本文件,名字和存放位置有规矩,里面记着用户执行的SQL、错误等信息,用来差错和调优。开日志会影响性能,一般需要时才开启。
1.9.事件日志文件
事件日志记录数据库运行的关键事,用来定位严重问题,会一直存在。
2.DM内存结构
内存结构主要包括内存池、缓冲区、排序区、哈希区等。
2.1.内存池
共享内存池是DM Server在启动时从操作系统申请的一大片内存。
在 DM Server 的运行期间,经常会申请与释放小片内存,而直接向操作系统申请和释放内存时需要发出系统调用,此时可能会引起线程切换,降低系统运行效率。于是 DM 采用共享内存池的方式:一次向操作系统申请一片较大内存,作为共享内存池。当系统在运行过程中需要申请小片内存时,可在共享内存池内进行申请,当用完该内存时,再释放掉,即归还给共享内存池。
DM 系统管理员可以通过 DM Server 的配置文件dm.ini来对共享内存池的大小进行设置,共享池大小的参数为 MEMORY_POOL,缺省大小为 500MB。如果在运行时所需内存大于配置值,共享内存池也可进行自动扩展,INI 参数 MEMORY_EXTENT_SIZE 指定了共享内存池每次扩展的大小。
除了共享内存池,DM Server 的一些功能模块在运行时还会使用自己的运行时内存池。这些运行时内存池是从操作系统申请一片内存作为本功能模块的内存池来使用,如会话内存池、虚拟机内存池等。
2.2.缓冲区
2.2.1.数据缓冲区
数据缓冲区是DM Server在将数据页写入磁盘之前以及从磁盘上读取数据页之后,数据页所存储的地方。将其设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁;将其设定得太大,又会导致操作系统内存本身不够用,大小设置很关键。
2.2.2.日志缓冲区
日志缓冲区是用于存放重做日志的内存缓冲区。为了避免由于直接的磁盘 IO 而使系统性能受到影响,系统在运行过程中产生的日志并不会立即被写入磁盘,而是和数据页一样,先将其放置到日志缓冲区中。
2.2.3.字典缓冲区
字典缓冲区是内存里存放数据字典信息(比如表、列这些信息)的地方,操作数据库都要用到,放这里可以快很多,不然得读磁盘;它只加载常用的字典信息,用 LRU 算法管理,大小由参数控制(默认 50MB)。
2.2.4.SQL缓冲区
SQL 缓冲区是执行 SQL 时用的内存,存着语句、执行计划和结果集;重复执行相同 SQL 时,缓存能重用计划加快速度,是否启用和大小可通过参数调;
2.3.排序区
排序区是内存里专门给数据排序用的地方,执行 SQL 时需要排序就用这里的内存,用完后会释放;有个叫 SORT_BUF_SIZE 的参数能设置它的大小,默认 20MB,建议用默认值就行。
2.4.哈希区
哈希连接缓冲区其实不是真的划出一块固定内存,而是虚拟的。用的时候先算需要处理的数据量。如果数据量没超过设定的大小,就用内存处理;超了就用硬盘(外存)来弄。
有个叫 HJ_BUF_SIZE 的参数能调这个 “虚拟大小”,建议别改默认值,或者调大些;还有个参数HAGR_HASH_SIZE管处理某些数据时的哈希表数量,也建议用默认的。