作者: 何致亿 美商甲骨文公司台湾分公司特约顾问
上一期我为大家介绍了Oraclei服务器架构并探讨Oraclei 执行个体之组成要素与其运作原理本期将把重点放在Oraclei数据库实体结构
Oraclei数据库结构
谈及Oracle数据库结构时我们应该从两个角度来探讨分别是数据库的「逻辑层面」与「实体组成」简单的说「逻辑层面」是由数据库内部观看其组成要素包括资料表空间(tablespaces)区段(segments)延伸区块(extents)资料区块(data block)以及纲要对象(Schema objects)(注[])而「实体组成」则是从操作系统角度来看 Oraclei 数据库的实体构成项目包括数据文件(Data files)重置日志文件(redo log files)控制文件(control files)密码文件(password)起始参数档(initialization parameter files)…等等如果您有心成为一个顶尖的 Oracle DBA那么不仅要对以上各项如数家珍般熟悉还要了解其内部运作与相互关系才行首先我们就先从「逻辑层面」探访Oraclei数据库!
数据库之逻辑组成
无论是任何规模的企业在管理数据库系统时DBA都应该依据实际系统需求或是未来可能的管理方式规划出一个或多个资料储存区域重点是希望将资料分门别类地妥善存放譬如您可能会希望将公司内会计系统的帐务资料与产品销售纪录分开存放
Oraclei数据库允许DBA自行规划各种用途的资料表空间(Tablespace)以便存放不同型态的资料与数据库对象举例来说存放Oracle系统信息的「资料辞典」(data dictionary)可放在 SYSTEM 资料表空间应用系统资料可存放在 USER 资料表空间而所有数据表的索引(Index)则可单独存放在INDX 数据表空间内(注[])
一般来说Oraclei数据库至少应规划出五个以上的资料表空间如下图一所示
图一Oraclei数据库之资料表空间
那么先从资料的最小储存单位 — 「资料区块」谈起
何谓「资料区块」?
许多初次接触数据库的读者最好奇的一点是 资料究竟是如何存放在数据库呢?其实Oraclei 数据库有几种资料储存体其中最小的储存单元就称为「数据区块」(data block)资料区块大小是由起始参数档的 DB_BLOCK_SIZE 参数所决定且在新建Oraclei数据库之前就必须明确地定义实际上资料区块大小与操作系统的磁盘读写区块(OS blocks)也有关系所以您必须将 DB_BLOCK_SIZE 设定为 OS blocks的整数倍附带一提Oraclei在存取资料时是以data block为最小读取单位而不是以OS block为单位
从 Oraclei 开始数据库内可以设定多种资料区块大小换句话说Oraclei数据库内分为「标准资料区块」与「非标准资料区块」预设情况下 SYSTEM 资料表空间就是以「标准资料区块」建立而成
何谓「延伸区块」?
除了资料区块之外Oraclei数据库还有所谓的「延伸区块」(extents)虽然资料区块是Oraclei最小的资料读写单位但值得注意的是Oraclei 在配置储存空间时并不是以资料区块为单位而是改采「延伸区块」的方式来配置空间那么使用「延伸区块」究竟有何好处呢?当您执行DDL指令建立数据库对象时(例如CREATE TABLE 指令)Oraclei会先配置出一连串的资料区块直到这些资料区块全部存满资料后下次再配置一连串的资料区块这些连续的资料区块就统称为「延伸区块」
举例来说假定您准备在Oraclei数据库内存放 KB的资料Oraclei可以先配置一个「延伸区块」其大小可为资料区块( KB)的倍然后视实际需要再配置第二个「延伸区块」(大小还是 KB)如此一来只要两次的空间配置动作就可以存放 KB的资料了!试想如果Oraclei每次只配置 KB的「资料区块」让您存放资料总共需要次空间配置动作才能放满 KB的资料是不是比较没有效率呢?由此可见「延伸区块」的确有其存在的必要性
何谓「区段」?
依照不同的数据处理性质您可能需要在资料表空间内划分出不同区域以存放不同资料我们将这些区域称之为「区段」(segment)例如存放数据的称为「数据区段」存放数据的称为「索引区段」而「区段」其实就是由许多「延伸区块」组合而成除了上述两种「区段」以外Oraclei数据库内还有另外两种区段结构分别是「暂时性区段」(temporary segment)与「退回区段」(rollback segment)下图二说明了Oraclei数据库内各逻辑组成要件之间的阶层关系
图二TablespaceSegmentExtentBlock之间的关系
所以从Oraclei数据库的「逻辑层面」来看我们知道
n资料是存放在每个「资料区块」内资料读写动作也将以「资料区块」为单位
n空间配置的动作则是引用「延伸区块」的概念一个「延伸区块」由一连串的「资料区块」所构成
n依实际资料量多寡资料(或数据库对象)由多个「延伸区块」所组成
n「资料表空间」内可划分不同的「区段」而每个「区段」内又包含许多「延伸区块」
n在每个Oraclei数据库内可规划不同的「资料表空间」用以存放不同型态的资料
截至目前为止无论是资料区块延伸区块区段甚至数据表空间都只是逻辑上的数据储存概念实际上Oraclei数据库是藉由数个操作系统内实体档案来维系数据库系统之正常运作接下来我们将从操作系统角度来探讨Oraclei的实体组成要素
数据库之实体组成
还记得上一期文章中我们曾经综览Oraclei 服务器基本架构吗?如果从操作系统的观点来看Oraclei 数据库的实体组成要素就是操作系统内各式档案最重要的有数据文件重置日志文件控制文件起始参数档…等下图三描述了Oraclei 数据库的基本架构
图三Oraclei 数据库基本架构
数据文件
每个 Oraclei 数据库都包含为数不等的实体「数据文件」数据库内所有逻辑数据库对象都是存放在数据文件内如数据表索引…等
一但数据文件被建立后系统就会在磁盘上配置出适当空间给数据文件但尚未存放任何使用者资料等到未来使用者将资料存入数据库时Oraclei 才会在数据文件内配置出「数据区段」以存放数据而这些动作都是由 Oraclei 自动完成的
当然了如果数据文件剩余空间不足您就必须调整数据文件大小或增加新的数据文件所以在 Oraclei 数据库内一个数据库对象有可能横跨多个数据文件 (数据文件相关的管理与维护动作将在未来专栏内容中详细探讨)
如前所述Oraclei 数据库内可规划一个以上的「资料表空间」但如果由操作系统角度来看「资料表空间」其实是由一个或数个实体「数据文件」所组成换句话说数据库的所有资料就是位于操作系统的各「数据文件」内
所以
n一个「数据文件」只能对应的一个「资料表空间」
n一个「资料表空间」可包含多个「数据文件」
如下图四所示SYSTEM 「资料表空间」对应到操作系统的 systemora 「数据文件」(注[])USER 「资料表空间」则是包含 userora 与 userora 两个「数据文件」
图四资料表空间与数据文件之对应
重置日志文件
除了「数据文件」外最重要的Oraclei数据库实体档案就是「重置日志文件」(redo log files)也就是大家俗称的「交易日志」(transaction log)虽然它与「数据文件」不同但是彼此间却有密不可分的关系!简单的说Oraclei 重置日志文件会负责纪录数据库内任何数据处理情况(注[])当资料被异动时所有异动纪录会先保留在内存的重置纪录缓沖区并在适当时机由LGWR背景处理程序负责写入至硬盘上重置日志文件(注[])如此一来所有资料异动情况都会完整地保留下来万一您的 Oraclei 数据库不小心当机或是遭遇毁损Oraclei 将凭借重置日志文件内相关纪录将资料复原至最完整的状态—这个动作我们又称为『Roll Forward』
重置日志文件的配置方式
请注意Oraclei数据库正常运作的先决条件是至少配置两个(组)重置日志文件!
假定目前Oraclei数据库拥有两个重置日志文件分别是redoora与redoora因为重置日志文件是以循环方式使用所以当redoora写满后就会轮到redoora — 这个动作称为「日志切换」(log switch)理论上当redoora写满后应该会立刻从redoora重新开始写入动作但实际上并非如此 — Oraclei 会等到redoora内纪录的资料异动情况真正反应在数据文件之后(记得我们曾经提过的CKPT处理程序吗?)才会覆写redoora的资料在一个大型线上交易(OLTP)系统下如果资料交易量十分频繁建议您不妨配置五个以上重置日志文件以免Oraclei进行「日志切换」时