Oracle 体系结构 - 逻辑和物理存储结构之间的关系
2019/04/21 09:16:48 来源:Linux社区 作者:zhaochunyi

Oracle数据库从物理存储中完全抽象出逻辑存储。逻辑数据存储采用“段”的形式。段的类型有很多种:典型的段是“表”。这些段以物理形式存储在数据文件中。通过表空间将逻辑存储从物理存储中抽象出来。逻辑结构和物理结构及其定义之间的关联在数据字典中定义。

物理数据库结构

Oracle数据库包括三类文件,以及其他几种数据库之外(或者说是可选的)的文件。必需的文件是控制文件(control file)、联机重做日志文件(online redo

log file)和数据文件(data file)。通常所说的外部文件(还有一些事高级选项需要的)是初始化文件、口令文件、归档重做日志文件以及日志和追踪文件。

控制文件

控制文件包含指向数据库其余部分的指针:联机重做日志文件和数据文件的位置,以及更新的归档日志文件(如果数据库处于归档日志模式)的位置。它还存储这维护数据库完整性所需的信息:例如各种重要的序列号和时间戳。例如,如果将恢复管理器工具用于备份,则控制文件也将存储这些备份的详细信息。控制文件的大小通常不过数MB,却起着至关重要的作用。

不必考虑使控制文件的多路副本保持同步,Oracle将做好这一切。维护工作将自动完成,只需要控制要制作多少副本,以及要将副本放于何处即可。如果创建数据库时设置的副本数量或位置有误,就可以在后期添加或删除副本,或移动它们,但要注意,执行任何此类工作都需要停机,因此,最好还是一开始就设置好。如果任何控制文件副本受损,数据库实例将立即终止。Oracle不允许使用控制文件数量低于要求的数据库。

联机重做日志文件

重做日志按时间顺序存储应用于数据库的一连串的变更向量。其中仅包含重建(或重做)所有已完成工作的最少限度的信息。如果数据文件(或整个数据库)受损,则可以将这些变更向量应用于数据文件备份来重做工作,将它们恢复到发生故障的那一刻前的状态。重做日志包含两类文件:联机重做日志文件(必需的)和归档日志文件(可选的)。

每个数据库至少有两个联机重做日志文件,但与控制文件一样,优秀的DBA总是为每个联机重做日志文件创建多个副本。联机重做日志包含多组联机重做日志文件,每个文件都称为一个成员。Oracle数据库至少需要两个组,其中每个组知道有一个成员在运行。处于性能考虑,可以创建两个以上的组,出于安全起见,每组要有多个成员。

其中一个组是当前组:LGWR将更改写入当前联机重做日志文件。当用户会话更新数据库缓冲区缓存中的数据时,也将尽可能少的变更向量写出到重做日志缓冲区。LGWR将此缓冲区不断转储到当前联机重做日志文件组中的文件。日志文件的大小固定不变,因此,当前组中文件最终会被写满。此时,LGWR将执行称为“日志切换”的操作。这使第二个组称为当前组,并开始执行写入。如果数据库配置得当ARCn进程将归档(实际上是备份)第一个组中的日志文件成员。当第二个组变满时,LGWR将再切换回第一个组,使第一个组成为当前组,并重写其内容。ARCn将接着归档第二个组。这样,联机重做日志文件组(及其成员)将被循环使用,而每次日志切换将生成归档重做日志文件。

与控制文件一样,如果每组具有多个成员(事实也应当如此),那么仍然不必担心保持这些成员同步的问题。LGWR能够确保对所有成员进程并行写操作,从而使这些成员完全相同。如果丢失某个组的一个成员,只要还存在其他成员,数据库仍然能够继续运行。

联机重做日志文件组的大小与数量涉及调整问题。通常,我们应当选择与预期活动数相适应的大小。至少为50MB,但某些活动数特别多的数据库需要将此数值提高到数GB,否则,每过几分钟,文件就会变慢。就十分忙碌的数据库而言,每秒钟可生成数MB的重做数据,就基本处于静态的数据库而言,每小时也不过生成数MB的重做数据。每个联机重做日志组的成员数量取决于适当的容错级别,也依照住址标准中的文档记录而定。不过,不必再数据库创建阶段担心这个问题。在稍后的任意时间,都能够移动、添加或删除联机重做日志文件,并且可以任意创建不同大小的联机重做日志文件。上述操作都可以在不停机的情况下“联机”执行,因此对于最终用户来说是透明的。

数据文件

在数据库创建阶段,至少必须创建两个数据文件。一个用于SYSTEM表空间(存储数据字典),一个用于SYSAUX表空间(存储数据字典的辅助数据),一个用于UNDO表空间(存储保护事务所需的撤销段)。

数据文件是数据的存储仓库。数据文件的大小与数量实际上是不受限制。其大小只受操作系统和硬件功能的限制。

数据文件是系统管理员可以看见的物理结构。从逻辑上讲,它们是段(包含编程人员可以看到的用户数据的段,以及构成数据字典的段)的储存库。“段(segment)”是数据的存储结构,典型的段是表和索引。在数据库的生命周期内,可以随时重命名、移动、添加或删除数据文件,也可以重设其大小。对某些数据文件执行某些操作时,将产生停机时间。

在操作系统级别看,数据文件由多个操作系统块组成。在内部,将数据文件的格式设置为Oracle“块(block)”。在每个数据文件中,这些块连续编号。在创建数据文件时,块大小固定不变,在大多数环境中,整个数据库的块大小都是一样的。块大小设计调整问题,大小范围是2KB到32KB(收到平台的限制)。Oracle块大小与操作系统的块大小不存在任何关联。

块中存在头部分和数据区域,还可能有一些空闲空间。头部分包含诸如行目录的信息,行目录列出块中行数据区域中的位置(如果将相应的块用于表段),还包含行锁定信息(如果有事务或几个事务正在处理块中的行)。数据区域包含行本身,如行(如果是表段的一部分)或索引键(如果块是索引段的一部分)。

服务器进程对数据文件执行读操作,而DBWn对数据文件执行写操作。

其他数据库文件

这些文件位于数据库之外。在实际中,它们都是必需的,但雅阁地将,它们并不是数据库的一部分。

逻辑数据库结构

Oracle使用术语“段”来描述任何包含数据的结构。典型的段是包含数据行的表,但是Oracle数据库包含十多种段类型。其中最引人关注的表段、索引段和撤销段。Oracle通过表空间(tablespace)方式,将逻辑存储从物理存储中抽象出来。表空间在逻辑上是一个或多个段的集合,在物理上是一个或多个数据文件的集合。如果使用“关系分析”术语,则段和数据文件之间存在多对多关系:可以将一个表分布在多个数据文件中,而一个数据文件也可能包含多个表的一部分。Oracle通过在段和文件之间插入表空间实体,解决这种多对多关系的问题。

必须在创建数据库时创建SYSAUX表空间。如果未予指定,将创建默认的SYSAUX表空间。

段由多个块组成。数据文件的格式被设置为多个块,随着块的增加,这些块被分配给段。由于每次管理一个块的空间过于耗时,又将块分组为区间(extent)。区间是数据文件中编号连续的一系列块,通过为段新添区间,段将扩大。这些区间不必相邻,即使在同一数据文件中,也是如此。它们可以来自作为段所在表空间一部分的任何数据文件。

从逻辑上讲,一个表空间可以包含多个段,每个段可以包含多个区间。区间是一组Oracle块。从物理上界量,数据文件由多个操作系统块(由操作系统正在使用的文件系统所分配)组成。连接模型的两端的关系显示一个表空间可以包含多个数据文件,从最低级别看,一个Oracle块将包含多个操作系统块。

 数据字典

数据字典包含从逻辑上和物理上描述数据库及其内容的元数据。用户定义、安全信息、完整性约束和性能监视信息都是数据字典的一部分。元数据作为一组段存储在SYSTEM和SYSAUX表空间中。

从很多方面讲,构成数据字典的段与其他的段很相似。关键区别在于:数据字典表在创建数据库时生成,你无权直接访问它们。Oracle提供了一组视图来查询字典。视图有四种形式:带有前缀CDB_、DBA_、ALL_和USER_。任何带有前缀USER_的视图将描述查询视图的用户拥有的对象。任何带有前缀ALL_的视图将显示描述您有权访问的对象的行。因此ALL_TABLES将显示描述你的表的行,以及描述已经授权你查看的任何人的表的行。任何带有前缀DBA_的视图将显示数据库中每个对象的行,因此,DBA_TABLES拥有数据库中每个表对应的行。CDB视图与DBA视图相同,除非在多租户数据库中工作。在创建数据库的过程中,将创建这些视图,还会创建大量由Oracle提供的PL/SQL包来帮助数据库管理员管理数据库,帮助编程人员开发应用程序。PL/SQL代码也存储在数据字典中。

表空间和数据文件之间的关联在数据库控制文件中维护。其中列出多有数据文件,致命其所属的表空间。如果没有控制文件,实例就无法找到数据文件,然后识别组成SYSTEM表空间的文件。只有打开SYSTEM表空间时,实例才可能访问数据字典,才可能打开数据库。

更多Oracle相关信息见Oracle 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=12

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2019-04/158208.htm


7

本栏最新