Oracle体系结构和物理结构

下面咱们就具体了解一下Oracle的逻辑结构和物理结构:

一、Oracle逻辑结构 

其他关系的逻辑结构,我感觉都是抽象的,但是,Oracle的逻辑结构不抽象,它是一种层次结构,主要由:表空间(Tablespace),段(segment),区(extents)和数据块(blocks)等概念组成,具体如下图所示:

Oracle体系结构和物理结构_第1张图片

1.1数据块

数据块是Oracle最小的存储单位,Oracle的数据放在数据块中,但是此”数据块“非操作系统的”系统块“,这两个要区分开,一般Oracle数据块的大小是操作系统系统块的整数倍。Oracle每次请求数据的时候,都是以数据块为单位,也就是说,每次请求的数据是块的整数倍,如果请求的数据量不到一块,那么Oracle也会读取整个数据块。

数据块大小是由初始化参数DB_BLOCK_SIZE指定的,符合标准的就是标准块,不符合标准的就是不标准块

SYS@ zxy>col name for a20
SYS@ zxy>col value for a10
SYS@ zxy>select name,value from v$parameter where name='db_block_size';

NAME                 VALUE
-------------------- ----------
db_block_size        8192

SYS@ zxy>

一般情况下:Oracle默认都是8192B,而操作系统的系统块是2048B,Oracle的数据块是由4个操作系统块构成。

数据块中存放数据、索引数据和簇数据等,无论存放那种数据,其结构都是一样的,都是由块头、表目录、行目录、空余空间(又叫做自由空间)、行数据等5部分组成,如下图所示: 

Oracle体系结构和物理结构_第2张图片

数据块中各个组成部分介绍如下:

  • 块头:存放数据块的基本信息,如块的物理地址、块所属的段的类型(索引段还是数据段) 
  • 表目录:存放表的信息,如果数据块中存放的是表数据,则表目录中存储有关的表信息
  • 行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行的地址等
  • 空余空间:空余空间是一个块中未使用的区域,这片区域中用于新行的插入和已经存在行的更新
  • 行数据:用于存放表数据和索引数据,这些空间被数据行所占用

通常把块头、表目录、行目录这三部分组合起来成为头部信息区,头部信息区不存放数据,它存放整个块的引导信息,起到引导系统读取数据的作用,如果头部信息区遭到破坏,则oracle系统无法读取这部分数据。空余空间和行数据用于存储真正的数据。

补充:空余空间,这部分非常重要,经常所说的行链接和行迁移就发生在此:无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。

当往数据库中插入(INSERT)数据的时候,块中的自由空间会减少,当对块中已经存在的行进行修改(UPDATE)的时候(使记录长度增加),块中的自由空间也会减少。DELETE语句和UPDATE语句会使块中的自由空间增加。当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的。通常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作,却找不到连续的自由空间的时候,Oracle才会主动的合并数据块中不连续的自由空间。

行链接和行迁移(Row Chaining and Migrating)

  • 行链接(Row Chaining):如果我们往数据库中插入(INSERT)一行数据,这行数据很大,以至于一个数据块存不下一整行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row Chaining)。如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。
  • 行迁移(Row Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。

对于块中的自由空间,Oracle提供两种管理方式:自动管理,手动管理

自动管理:Oracle使用位图(bitmap)来管理和跟踪数据块,这种块的空间管理方式叫“自动管理”。自动管理有下面的好处:

  • 易于使用
  • 更好地利用空间
  • 可以对空间进行实时调整

手动管理:用户可以通过PCTFREE, PCTUSED来调整块中空间的使用,这种管理方式叫手动管理。相对于自动管理,手动管理方式比较麻烦,不容易掌握,容易造成块中空间的浪费。

PCTUSED也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。

PCTFREE参数用于指定块中必须保留的最小空闲空间百分例,默认值为10。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配一个新的块,这会产生行迁移(Row Migrating)。

简单来说:

pctused表示数据所占最低百分比,如果达到pctused时不能插入数据,delete后如果达到pctused才可以用来insert。

pctfree表示用于保留更新操作的百分比,如果超过该值就不能插入数据。

例如,假定在Create table语句中指定了pctfree为20,则说明在该表的数据段内每个数据块的20%被作为可利用的空闲空间,用于更新已在数据块内存在的数据行其余80%是用于插入新的数据行,直到达到80%为止。显然,pctfree值越小,则为现存行更新所预留的空间越少。因此,如果pctfree设置得太高,则在全表扫描期间增加I/O,浪费磁盘空间;如果pctfree设置得太低,则会导致行迁移。 

pctused参数设置了数据块是否是空闲的界限。当数据块的使用空间低于pctused的值时,此数据块标志为空闲,该空闲空间仅用于插入新的行。如果数据块已经达到了由pctused所确定的上边界时,Oracle就认为此数据块已经无法再插入新的行。例如,假定在Create table语句中指定pctused为40,则当小于或等于39时,该数据块才是可用的。所以,可将数据块填得更满,这样可节省空间,但却增加了处理开销,因为数据块的空闲空间总是要被更新的行占据,所以对数据块需要频繁地进行重新组织。比较低的pctused增加了数据库的空闲空间,但减少了更新操作的处理开销。所以,如果pctused设置过高,则会降低磁盘的利用率导致行迁移;若pctused设置过低,则浪费磁盘空间,增加全表扫描时的I/O输出。pctused是与pctfree相对的参数。 

那么,如何选择pctfree和pctused的值呢?有个公式可供参考。显然,pctfree和pctused的之和不能超过100。若两者之和低于100,则空间的利用与系统的I/O之间的最佳平衡点是:pctfree与pctused之和等于100%减去一行的大小占块空间大小的百分比。例如,如果块大小为2048字节,则它需要100个字节的开销,而行大小是390字节(为可用块的20%)。为了充分利用空间,pctfree与pctused之和最好为80%。 

那么,怎样确定数据块大小呢?有两个因素需要考虑: 

一是数据库环境类型。例如,是DSS环境还是OLTP环境?在数据仓库环境(OLAP或DSS)下,用户需要进行许多运行时间很长的查询,所以应当使用大的数据块。在OLTP系统中,用户处理大量的小型事务,采用较小数据块能够获得更好的效果。 

二是SGA的大小。数据库缓冲区的大小由数据块大小和初始化文件的db_block_buffers参数决定。最好设为操作系统I/O的整数倍。

1.2 数据区(extent)

数据区是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

1.3 数据段(segment)

段是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件。使用段的目的是用来保存特定对象。 

一个Oracle数据库有4种类型的段: 

  1. 数据段:数据段也称为表段,它包含数据并且与表和簇相关。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。 
  2. 索引段:包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段
  3. 回滚段:包含了回滚信息,并在数据库恢复期间使用,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。 
  4. 临时段:它是Oracle在运行过程中自行创建的段。当一个SQL语句需要临时工作区时,由Oracle建立临时段。一旦语句执行完毕,临时段的区间便退回给系统。

1.4 表空间(tablespace)

任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间(system tablespace),表空间的大小等于所有从属于它的数据文件大小的总和。下面说几个数据库不可获缺的表空间:

  1. System 表空间 :系统表空间是每个Oracle数据库都具备的,存储着诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。 系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。
  2. SYSAUX 表空间:sysaux表空间是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷
  3. Temp 表空间:临时表空间存储Oracle数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间
  4. Undo 表空间:Undo表空间用于存储Oracle数据库的撤销信息,用于回滚
  5. Users表空间:用户表空间,用于存放永久性用户对象的数据和私有信息。每个数据块都应该有一个用户表空间,以便在创建用户是将其分配给用户

OK,以上内容为Oracle的逻辑结构,下面就是Oracle的物理结构啦!

二、物理结构

物理结构包含了数据文件、日志文件和控制文件

  1. data 文件:每个Oracle数据都有一个或多个物理的数据文件,数据库的所有数据都是存储在数据文件上
  2. redo 文件:每个数据库都有两个或多个日志文件组,每个日志文件组根据需要,可以指定几个成员。每个日志组用于收集数据库日志,而日志的主要功能是记录对数据所作的修改,在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。日志文件主要是保护数据,防止数据丢失。为了防止日志文件本身的故障,ORACLE允许镜象日志(mirrored redo log),以致可在不同磁盘上维护两个或多个日志副本。 日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。然而任何丢失的数据在下一次数据库打开时,ORACLE自动地应用日志文件中的信息来恢复数据库数据文件。
  3. 控制文件:每一ORACLE数据库有一个控制文件(control file),它记录数据库的物理结构,包含下列信息类型: 

    数据库名、数据库数据文件、日志文件的名字和位置、数据库建立日期。为了安全起见,允许控制文件被镜象。每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。

  4. 参数文件:除了构成Oracle数据库物理结构的三类主要文件外,Oracle数据库还具有另外一种重要的文件:参数文件。参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等

你可能感兴趣的:(Oracle)