当前位置:文档之家› Oracle体系结构研究

Oracle体系结构研究

Oracle体系结构研究摘要:阐述了Oracle数据库的基本架构和Oracle数据库理论中的主要概念。

Oracle体系结构由存储结构、内存结构和进程结构组成,其中,存储结构由物理存储结构及逻辑存储结构组成;内存结构由SGA和PGA组成;进程结构由用户进程和Oracle进程组成。

关键词:ORACLE体系结构;存储结构;内存结构;进程结构1 Oracle的存储结构Oracle的存储结构分为物理存储结构和逻辑存储结构。

1.1 物理存储结构主要由数据文件、控制文件、联机日志文件及数据库实例构成。

Oracle数据库中有许多初始化参数,这些参数用于对整个数据库进行设置或调整,如设置数据库名、数据库块大小、控制文件的名称和位置、数据库实例数等信息。

Oracle 把这些参数存放在一个文件中,这个文件就叫初始化参数文件。

启动数据库时,Oracle会读取参数文件中的值,并根据这些值对数据库实例(instance)进行设置。

具体说是Oracle先从初始化参数文件中获得控制文件的名称及位置,打开控制文件,然后再从控制文件中读取数据文件和联机日志文件的名称和位置,打开它们,因为表、索引等对象的数据就存放在数据文件中,从而就打开了数据库。

1.1.1 控制文件Oracle启动数据库时会访问控制文件,控制文件是在创建数据库的时候创建的,它是一个很小的二进制文件,记录了数据库的名称、创建数据库的时间、数据文件的名称和位置、联机日志文件的名称和位置及表空间等信息。

所以说一个数据库的控制文件是相当重要的,一旦被损坏,数据库将不能正常启动和运行。

所以DBA应该镜像控制文件,把每个镜像的控制文件分布到不同的物理磁盘上,发生灾难时既使其中一个控制文件被损坏,也不会使整个数据库限于瘫痪。

1.1.2 数据文件当用户在Oracle中创建数据库的时候,就创建了一个或多个数据文件,表和索引等对象的数据就物理地存放在数据文件中。

一个表的数据可能会存储在多个数据文件中,但一个数据文件只能属于一个数据库。

用户查询一个表时,如果所需数据不在内存中,Oracle会读取该表所在的数据文件,并把数据调入内存中,也就是说访问表实际上就是对数据文件进行读写操作。

创建数据文件时可以指定其初始大小,当其空间耗尽时,也可自动或手动扩展其大小。

1.1.3 联机日志文件当用户在内存中对数据库做了修改时(如插入、删除、修改),如果数据还没有来得及写入数据文件中就发生断电,用户的修改就会丢失。

为了防止这种情况的发生,Oracle运行过程中会在内存中产生日志条目,这些日志条目反应了用户所做的修改,并每隔一段时间把日志条目写到物理的联机日志文件中。

重启数据库时,Oracle会从联机日志文件中找回丢失的修改数据并重新把它写到数据文件中。

由此可见,联机日志文件主要用于对数据库实例(Instance)的恢复。

当用户提交一个事务或每隔3秒钟或日志缓冲区被填满1/3时,产生的日志信息就会被写到联机日志文件中。

1.2 逻辑存储结构Oracle 的逻辑存储结构由数据块、区、段和表空间构成。

1.2.1 表空间一个数据库被分成一个个的逻辑单元,这些逻辑单元叫“表空间”。

表空间用于在逻辑上存放数据库对象如表、索引等。

一个数据库逻辑上由一个或多个表空间组成。

表空间又由一个或多个数据文件物理地支持着,表空间中的数据库对象(如表)的数据实际上是存储在数据文件中的。

表空间的大小是组成表空间的所有数据文件的大小之和。

但表和数据文件却不是一一对应的,一个表的数据可以存放在一个或多个数据文件中。

每个数据库用户都要有一个默认表空间,当用户创建对象(如表)时,如果没有指定这个对象放在哪个表空间中,则这个对象将被存放在默认表空间中。

1.2.2 数据块数据块简称块,是Oracle存取数据的最小单位。

Oracle数据存放在块中,一个块占用一定的磁盘空间。

这里的“块”是Oracle 的数据块,而不是操作系统的“块”。

Oracle每次读写数据的时候都以块为单位,如果读写的数据不到一块,Oracle也会读写整个块。

Oracle块的大小一般是操作系统块大小(512bytes)的整数倍,如2k,4k。

块大小由初始化参数文件中的DB_BLOCK_SIZE 参数指定。

1.2.3 区区是数据库中的一个逻辑存储单元,由连续的数据块组成。

特别强调的是区是一段连续的存储空间。

当段中的空间耗尽时,Oracle会分配一个新区给这个段。

段由一系列的区组成,也是存放数据的逻辑单元。

表由段组成,一个表由一个或多个段组成。

普通表由一个段组成,分区表由多个段组成。

创建表的时候实际上就创建了段,Oracle会给表的段分配一个初始区。

随着数据的插入,初始区被填满,Oracle会再分配一个新区给表的数据段,这个区叫做“递增区”。

如果递增区用完,Oracle还会分配另外的递增区。

1.2.4 段段由一系列的区组成,也是存放数据的逻辑单元。

表由段组成,一个表由一个或多个段组成。

普通表由一个段组成,分区表由多个段组成。

创建表的时候实际上就创建了段,Oracle会给表的段分配一个初始区。

随着数据的插入,初始区被填满,Oracle 会再分配一个新区给表的数据段,这个区叫做“递增区”。

如果递增区用完,Oracle还会分配另外的递增区。

2 内存结构在Oracle中,“数据库”是指物理地存储在磁盘上的数据库文件。

而数据库的启动和运行,是需要一定的内存空间和后台进程的,我们把这些内存空间和后台进程称为Oracle数据库实例(Instance).也就是说一个数据库实例是由一块大的内存空间和一系列的后台进程构成。

对于第一次接触“实例”这个概念的朋友来说,容易把“实例”和“数据库”这两个概念混淆。

实例是“内存”和“后台进程”的总称,“数据库”是数据的物理存储。

一个数据库可以由一个或多个实例驱动,二者之间的关系是一对多的关系。

数据库实例所占用的内存空间分为两部分,一部分叫系统全局区(SGA),另一部分叫程序全局区(PGA)。

2.1 系统全局区(SGA)系统全局区是一组共享的内存结构,这块内存结构用于存放数据和数据库实例的控制信息。

多个用户可以同时连接到同一个实例(Instance),这些用户可以共享该实例的SGA中的数据,因此,系统全局区又叫“共享全局区”。

当启动一个实例时,Oracle 会分配SGA给这个实例,关闭实例时它的SGA又被回收,每个数据库实例都有一个SGA。

SGA主要由以下几部分构成:数据库高速缓冲区(Database Buffer Cache)、重做日志缓冲区(Redo Log Buffer)、共享池(Shared Pool)、Java池(Java Pool) 、大池(Large Pool) 、流池(Streams Pool)。

SGA的每部分结构都是为了满足不同的需求。

(1)数据库高速缓冲区(DataBase Buffer Cache)。

数据库高速缓冲区是SGA的重要组成部分,用于存放从数据文件中读取的数据或者存放用户对数据库所做的修改,所有连接到相同实例的用户都可以共享这些数据。

数据库高速缓冲区中的缓冲器被组织成两个列表:一个是写列表(Write List),一个是最近最少使用列表(Least Recently Used List,LRU)。

最近最少使用列表LRU存放三种缓冲器:自由缓冲器(Free Buffers)、正在被访问的缓冲器(Pinned Buffers)和脏缓冲器(Dirty Buffers )。

写列表存放那些被修改了,但还没有写到磁盘上的脏数据。

当用户查询数据时,Oracle 首先在数据库高速缓冲区(DataBase Buffer Cache)中的正在被访问的缓冲器(Pinned Buffers)中进行查找,如果找到,则把数据返回给用户;如果未找到,Oracle则从数据文件中读取所需数据到自由缓冲器(Free Buffers)中,自由缓冲器就变成了Pinned Buffers,并把该缓冲器排放到最近最少使用列表(LRU)的末尾,然后把Pinned Buffers 中的内容返回给用户。

当用户修改数据库时,直接修改的是Pinned Buffers 中的内容,Pinned Buffers则变成了脏缓冲器(Dirty Buffers)。

当LRU 中不再有自由缓冲器可用时,Oracle会把位于LRU头部(最近最少使用的)的脏缓冲器中的内容(用户的修改)移动到写列表中,而该脏缓冲器又变成了自由缓冲器,LRU中的缓冲器就是这样被周而复始地循环使用的。

写列表中的数据最终要被写入磁盘上的数据文件中。

(2)重做日志缓冲区(Redo Log Buffer)。

重做日志缓冲区是SGA的组成部分,它是一个循环使用的缓冲区,用于存放日志条目,日志条目可实现数据库实例的恢复。

当用户对数据库进行修改(insert,update,delete,create,alter,drop)等操作时,一旦发生断电等意外,用户所做的修改还没有来得及写入数据文件就丢失了。

为了防止这种情况的发生,在数据库运行过程中Oracle会把用户的修改以日志条目的形式记载在SGA的重做日志缓冲区中,并每隔3秒钟或用户提交一个事务时由日志写进程LGWR把日志条目写入磁盘上的联机日志文件。

也就是说Oracle为了以防万一会在数据库运行过程中对还没来得及写入数据文件的用户修改做一物理备份。

当数据库重新启动时,Oracle会从联机日志文件中读取反映用户修改的日志条目,读入日志缓冲区中,再根据日志缓冲区中的日志条目恢复用户先前对SGA中的数据库高速缓冲区所做的修改,最终把用户的修改写入数据文件,从而恢复数据库实例。

初始化参数LOG_BUFFER用于设置日志缓冲区的大小。

比较大的日志缓冲区能够减少联机日志文件的磁盘I/O。

如果一个系统中经常有大的、长时间运行的事务,应该增大LOG_BUFFER 的值。

(3)共享池(Shared Pool)。

共享池也是SGA的重要组成部分,用于存放SQL语句、PL/SQL程序代码、数据字典等信息。

共享池主要包含库缓冲区和数据字典缓冲区。

初始化参数SHARED_POOL_SIZE用于控制共享池的大小。

在默认情况下,32位的平台,SHARED_POOL_SIZE的值是8M,64位的平台,SHARED_POOL_SIZE的值是64M。

库缓冲区存放解析并执行过的SQL语句和PL/SQL程序代码。

当用户发送一条SQL语句或PL/SQL程序代码到数据库时,Oracle首先对这条语句进行语法解析,然后将解析结果(解析树和执行计划)保存到库缓冲区中。

如果不同的用户执行相同的SQL语句,他们可以共享这些解析结果,这会加快SQL语句的执行。

库缓冲区主要包含共享SQL区、私有SQL区、PL/SQL过程和包等。

相关主题