Oracle体系结构

来源:互联网 发布:mac 照片文件位置 编辑:程序博客网 时间:2024/06/06 09:25

 Oracle体系结构

1 Oracle Server

Oracle server由例程(Instance)和数据库(Database)两部分组成。例程是一组内存结构和后台进程的集合,内存结构主要包括数据高速缓存、重做日志缓冲区和共享池3部分,内存结构总称为SGASystem Global Area);后台进程包括SMONPMONDBWRCKPTLGWRARCH等。数据库是一组OS文件的集合,由数据文件、控制文件和重做日志组成。如下图所示。

 

 

2 SGA

SGASystem Global Area)由一组内存结构组成,它由所有用户进程共享的一块内存区域。启动例程时,Oracle自动分配SGA;关闭例程时,Oracle自动释放SGA占用内存空间。SGA主要包括共享池(Shared Pool)、数据高速缓存(Database Buffer Cache)和重做日志缓冲区(Redo Log Buffer3个部分。

 

 

 

 

 

Oracle9iOracle10g中,允许DBA在数据库运行状态下动态改变数据高速缓存、共享池和大缓冲区的尺寸,但SGA动态尺寸总计不能超过初始化参数SGA_MAX_SIZE的值。

SQL> show parameter sga_max_size;

NAME                   TYPE   VALUE

------------------------------------ ----------- ------------------------------

sga_max_size             big integer 584M

2.1 共享池

    共享池(Shared Pool)用于存放最近执行的SQL语句和数据字典信息,尺寸由初始化参数SHARED_POOL_SIZE定义。

共享池主要由库高速缓存(Library Cache)和数据字典高速缓存(Dictionary Cache)两部分组成。

 

 

 

库高速缓存(Library Cache)用于存放最近执行的SQL语句的信息,包括SQL语句文本、解析代码值及其执行计划。执行计划是Oracle执行SQL语句的内部操作步骤。

库高速缓存包含许多上下文区(Context Area),每个上下文区包含相应SQL语句的执行计划,这些上下文区被称为共享游标。当客户端执行SQL语句时,服务器集成首先检查共享游标是否存在,若存在则按照其执行计划直接执行语句;若不存在则生成SQL语句执行计划,并将执行计划放到相应的上下文区中,然后执行该SQL语句。通过共享游标,可以最小化SQL语句解析次数,从而提高SQL语句的执行性能。

 

 

 

    如上图所示,因为SELECT语句1SELECT语句2文本不同,所以它们将占用不同的上下文区,而对于文本完全相同的SELECT语句1来说,它们可以共享相同的上下文区。

数据字典高速缓存(Dictionary Cache)用于存放数据字典的信息,包括表、列的定义以及权限信息。库高速缓存和数据字典的尺寸是动态变化的

9i开始,DBA可以使用ALTER SYSTEM 命令动态改变共享池的尺寸。示例如下:

SQL> alter system set shared_pool_size=60M;

System altered

SQL> show parameter shared_pool_size;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

shared_pool_size                     big integer 60M

2.2 数据高速缓存

数据高速缓存(Database Buffer Cache)用于存放最近访问的数据块信息,它由许多小缓冲区(缓冲区尺寸=数据块尺寸)组成。Oracle10gDB_CACHE_SIZEDB_nk_CACHE_SIZE来定义数据缓存的尺寸,其中DB_CACHE_SIZE定义标准数据高速缓存的尺寸,DB_nk_CACHE_SIZE定义非标准数据高速缓存的尺寸。

Oracle采用LRULeast Recently Used)算法管理数据高速缓存,类似于排队机制,最先入队的最先出队,最后入队的最后出队。

 

    假定数据高速缓存包括10个缓冲区,数据已经沾满了这10个缓冲区,并且B1是最早访问的缓冲区,B10是最近访问的缓冲区。假定需要执行新的数据访问操作(SELECTDML),并且要访问的数据都不在这10个缓冲区中,那么服务器进程就会清除B1缓冲区数据,将新数据块B11的数据放到该缓冲区中,并且将该缓冲区标识为“最近访问”的缓冲区;如果要访问的数据在缓冲区中已经存在,服务器进程就会直接读取或修改该数据,并将相应缓冲区标识为“最近访问”的缓冲区。

数据高速缓存按照缓冲区使用情况可以将其划分为脏缓冲区(Dirty Buffer)、空闲缓冲区(Free Buffer)、忙缓冲区(Pinned Buffer)三种。脏缓冲区是指内容与相应数据块不一致的缓冲区,当执行DML操作时,服务器进程会修改缓冲区数据,此时缓冲区和数据块内容不一致;空闲缓冲区是指内容与数据块一致或不包含数据的缓冲区,当执行SELECT操作时,缓冲区与数据块内容一致;忙缓冲区是指服务器正在存取的缓冲区。

9i开始,DBA可以使用ALTER SYSTEM命令动态修改数据高速缓存的尺寸。示例如下:

ALTER SYSTEM SET DB_CACHE_SIZE=60M;

ALTER SYSTEM SET DB_4K_CACHE_SIZE=20M;

2.3 重做日志缓冲区

重做日志缓冲区(Redo Log Buffer)用于记载例程变化,其尺寸由初始化参数LOG_BUFFER定义。

当执行DDLDML语句时,服务器进程首先将事务变化记载到重做日志缓冲区,然后才会修改数据高速缓存。重做日志缓冲区由很多重做记录(Redo Record)组成,并且每条重做记录记载了被修改数据块的位置以及变化后的数据。

 

    如上图所示,当执行UPDATE操作时,新数据2000将被放到EMP段所对应的缓冲区B1中,旧数据1000将被放到UNDO段所对应的缓冲区U1中。在修改这两个缓冲区之前,首先将他们的变化写到重做日志缓冲区,然后再修改它们的数据。

3 后台进程

后台进程是指有Oracle Server隐含执行的进程。启动例程时,Oracle不仅会分配SGA,还会启动后台进程;关闭例程时,Oracle不仅释放SGA所占用的内存空间,而且还会释放后台进程所占用的CPU和内存资源。

Oracle提供很多后台进程,常见的有SMONPMONDBWRLGWRCKPTARCH

3.1 SMON

SMONSystem Monitor)用于执行例程恢复、合并空间碎片并释放临时段。假定在数据库运行过程中出现了例程失败(断电、内存故障、后台进程例外等),此时SGA信息尚未被完全写入磁盘(数据文件、重做日志)。当重新打开数据库时,后台进程SMON会按照以下步骤自动执行例程恢复:

REDO:重新应用那些被记载道重做日志,但尚未记载到数据文件中的数据。因为所有被提交的事务已经记载到了重做日志,所以可以确保恢复事务数据。

打开数据库:在打开数据库时,既包含了被提交的数据,也包含了未被提交的数据(加锁)。

UNDO:取消未提交的数据。打开数据库之后,Oracle会自动使用UNDO段回退未提交的数据。

3.2 PMON

PMONProcess Monitor)用于监视服务器进程的执行,并且在服务器进程失败时清除该服务器进程。访问Oracle Server时,Oracle会在服务器端为用户进程分配服务器进程。

3.3 DBWR

DBWRDatabase Writer)用于将数据高速缓存的脏缓冲区数据写入到数据文件中。如下图所示。

默认情况下只有一个DBW0进程,通过设置初始化参数db_writer_processes可以定义最多10DBWR进程。当执行DML操作时,服务器进程就会修改缓冲区,并且将这些缓冲区标识为脏缓冲区,将来这些脏缓冲区会由后台进程DBWR写入到数据文件中。出现以下情况时,DBWR进程会开始工作:

Ø         系统发出检查点(CheckPoint

Ø         服务器进程找不空空闲缓冲区

Ø         删除或截断表

Ø         使表空间脱机

Ø         开始表空间备份

 

 

 

3.4 LGWR

LGWRLog Writter)用于将重做日志缓冲区所记载的全部内容写入到重做日志文件中。

 

 

 

当执行selectdml操作时,服务器进程首先将数据文件读取到数据高速缓存,然后从数据高速缓存提取数据或修改数据高速缓存的数据。Oracle总是“先日志后修改”(先记载变化然后修改数据)。因此,将脏缓冲数据写入到数据文件之前,Oracle先将事务变化写入到重做日志文件,也就是说,在DBWR工作之前,LGWR首先将事务变化写入到重做日志。出现以下情况,LGWR开始工作:

Ø         提交事务(commit

Ø         每隔3秒钟

Ø         当重做信息超过1M

Ø         重做日志缓冲区已经有三分之一填满

Ø         DBWR进程将脏缓冲区写入到数据文件之前

3.5 CKPT

CKPTCheckPoint Process)用于发出检查点(Checpoint),检查点会同步数据库的数据文件、控制文件和重做日志。当发出检查点时,后台进程CKPT将检查点时刻的SCNSystem Change Number)写入到控制文件和数据文件头部。同时促使后台进程DBWR将所有脏缓冲区写入到数据文件中。

当发出检查点时,不仅后台进程CKPTDBWR要开始工作,LGWR也会将重做日志缓冲区写入到重做日志,从而确保数据文件、控制文件和重做日志的一致性。出现以下情况时CKPT会开始工作:

Ø         日志切换

Ø         关闭例程(SHUTDOWN ABORT除外)

Ø         手工检查点操作(ALTER SYSTEM CHECKPOINT

Ø         由初始化参数fast_smart_mttr_targer强制发出检查点

3.6 ARCH

ARCHArchive Process)用于将重做日志的事务变化复制到归档日志中,该后台进程只有在ARCHIVELOG模式下才有意义。默认情况下只有一个ARC0进程,通过初始化参数log_archive_max_processes最多可以定义10个归档进程。在ARCHIVELOG模式下,进行日志切换时会自动生成归档日志。如下图所示。

 

 

 

4 数据库物理结构

4.1 数据文件

数据文件(Data file)用于存储数据库数据,包括系统数据(数据字典)、用户数据(表、索引、簇)、UNDO数据等。当建立数据库或表空间时,数据文件通过DATAFILE选项制定。数据库逻辑上由一个和多个表空间(tablespace)组成,而表空间物理上由一个和多个数据文件组成。

 

 

 

    当建立临时表空间时,使用TEMPFILE选项可以指定临时文件。临时文件(Temperary File)用于存放排序操作产生的临时数据。当执行排序操作时,如果临时数据超过排序区尺寸,服务器进程会将临时数据放到临时表空间中。

4.2 重做日志

重做日志(Redo Log)用于记录数据库变化,当进行例程恢复或介质恢复时需要使用重做日志。当执行DDLDML操作时,事务变化会被写到重做日志缓冲区,在特定时刻LGWR会将重做日志缓冲区内容写入重做日志。数据库至少包含两个重做日志组,并且这些重做日志组是循环使用的。

 

 

 

假定数据库包含三个日志组,初始阶段LGWR会将事务变化写入到日志组一;日志组一写满后,Oracle自动进行日志切换,并且LGWR会将事务变化写入到日志组二;日志组二写满后,LGWR会将事务变化写入到日志组三;日志组三写满后,LGWR会将事务变化写回到日志组一。依次类推。

4.3 控制文件

控制文件(Control File)用于记录和维护数据库的物理结构,并且每个Oracle数据库至少包含一个控制文件。当使用Oracle Server时,一个例程只能访问一个数据库,Oracle通过控制文件在例程和数据库之间建立联系的。当装载数据库时,Oracle会根据初始化参数control_files定位控制文件;打开数据库时,Oracle会根据控制文件记载的信息打开所有数据文件和重做日志。

 

 

 

4.4 归档日志

归档日志(Archive Log)是非活动重做日志的备份。通过使用归档日志,可以保留所有重做历史记录。当数据库出现介质损坏时,使用数据文件副本和重做历史记录可以完全恢复数据库。只有在ARCHIVELOG模式下才能生成归档日志,并且进行日志切换时Oracle可以自动生成归档日志。

4.5 参数文件

参数文件(Parameter File)用于定义启动例程所需要的初始化参数,如参数DB_CACHE_SIZEDB_BLOCK_SIZELOG_BUFFER等都是在参数文件中定义的。参数文件包括文本参数文件(Text Parameter File)和服务器参数文件(Server Parameter File)两种类型。

Windows平台中,参数文件默认位置在%ORACLE_HOME%/database中,文本参数文件的名称格式为init<SID>.ora,服务器参数文件的名称格式为SPFILE<SID>.ora,其中SID为例程名。

5 数据库逻辑结构

数据库数据(表、索引、簇)物理上存放在数据文件中,而逻辑上存放在表空间中,Oracle使用表空间、段、区、数据块等逻辑存储结构管理对象空间的。

 

 

 

5.1 表空间

表空间(Tablespace)时数据库的逻辑组成部分,Oracle建议将不同类型的数据部署到不同表空间,一方面可以提高数据访问性能,另一方面便于数据管理、备份和恢复等操作。

Oracle数据库中应包含SYSTEM表空间、SYSAUX表空间、临时表空间、UNDO表空间、数据表空间和索引表空间等。SYSTEM表空间用于存放系统数据(数据字典信息);SYSAUX表空间时10g的新特征,用于存储数据库辅助系统信息(如OEM资料档案库);数据表空间用于存放表数据;索引表空间用于存放索引数据;临时表空间用于存放临时数据;UNDO表空间用于存放UNDO数据。

5.2

段(Segment)用于存储特定逻辑对象(表、簇、索引等)的所有数据,它由一个或多个区组成。Oracle提供了一些常用段:

Ø         表段:也称数据段,用于存储表的所有数据。例如建立表EMP时,Oracle会分配EMP段(段名=表名)来存放其数据。

Ø         索引段:用于存储索引的所有数据。如果建立索引IND_ENAME时,Oracle会分配IND_ENAME段(段名=索引名)来存放其数据。

Ø         临时段:用于存放排序操作所产生的临时数据。当临时数据量超过排序尺寸时,Oracle会分配临时段,并将临时数据暂时存放到临时段中。

Ø         UNDO段:用于存放非事务所修改数据的旧值。例如,执行UPDATE EMP SET SAL=2000 WHERE ename=’SCOTT’时,2000被存储到表段(EMP),旧数据1000则被存放到UNDO段。

5.3

区(Extent)是Oracle进行空间分配的逻辑单元,它是由相邻数据块组成的。例如当建立EMP表时,Oracle会自动分配标段EMP(假定初始尺寸时1M)。当数据占满1M空间,并且要插入新数据时,Oracle会自动货栈该表段,并且为其分配一个区,以此类推。            

5.4 Oracle

Oracle块也称为数据块,是Oracle在数据文件上执行I/O操作的最小单位,其尺寸应该设置为OS块的整数倍。

6 Oracle Servr工作原理

    当客户应用访问Oracle数据库时,必须首先连接到Oracle Server,然后才能执行各种数据访问操作。

6.1 连接到Oracle Server

当应用程序访问Oracle数据库时,必须首先连接到Oracle Server然后才能访问数据库数据。例如在窗口环境下运行SQL*Plus时,弹出对话框:

 

 

 

只有输入了正确的用户名、口令和主机字符串后,才能连接到Oracle Server,然后执行相应的数据访问操作。

1 用户进程和服务器进程

当在客户端运行应用程序时,会启动相应的应用进程,该进程被称为用户进程;当连接到Oracle Server时,Oracle在服务器端会为用户派生一个新的进程,该进程被称为服务器进程。当使用专用服务器连接时,用户进程与服务器进程是一一对应的关系。

 

 

 

应用程序的所有SQL操作都是由服务器进程执行的,而用户进程只是发送SQL语句,并接收SQL语句的结果。由于所有SQL操作都是由服务器进程执行的,所以服务器进程也被称为用户进程的影子进程(Shadow Process)。当连接到Oracle Server时,可能会遇到“ORA-01034:ORACLE not available”错误,该错误表示例程还没有启动。

2 连接和会话

连接(Connection)是用户进程到服务器进程的网络通信通道,连接和用户进程是一一对应的;会话(Session)时特定用户的连接,连接和会话时一对多的关系,但同一时刻一个连接对应于一个会话。

6.2 处理查询操作

    当客户端运行SELECT语句时,该语句首先被发送到Oracle Server端,并由服务器进程处理该SELECT语句,最终结果返回给用户进程。服务器进程处理SELECT语句包括解析(Parse)、执行(Execute)和提取数据(Fetch)三个阶段。下面以处理如下SELECT语句为例,说明处理查询操作的全过程。

SQL> SELECT ename,job,sal,deptno FROM emp

      2  where empno=7788;

ENAME      JOB             SAL DEPTNO

---------- --------- --------- ------

SCOTT      ANALYST     3000.00     20

 

1.解析

解析(Parse)用于检查SQL语句的语法和语义,生成SQL语句的执行计划,并将SQL语句和执行计划存放到共享池中。在解析期间,用户进程首先将SQL语句发送到服务器进程,然后服务器进程执行以下操作:

Ø         搜索库高速缓存,并检查是否存在相同的SQL语句。如果在库高速缓存中存在同一语句的执行计划,服务器进程将直接执行该SQL语句;

Ø         SQL语句不存在时,服务器进程会检查该SQL语句的语法。如果SQL语句不满足SQL语法规则,服务器进程将语法错误返回到客户端;

Ø         SQL语法正确时,服务器进程会检查SQL语义,以确定表名、列名是否正确。如果表名、列名不正确,服务器进程将语义错误返回到客户端;

Ø         SQL语义正确,则获得对象解析锁,以防止在解析期间其他用户改变对象结构;

Ø         检查用户是否具有该对象的访问权限。如果不具备访问权限,返回错误到客户端;

Ø         若具备访问权限,则会由优化器确定该SQL语句的最佳执行计划;

Ø         SQL语句及其执行计划装载到高速缓存

2.执行

执行(Execute)是指服务器进程按照SQL语句执行计划执行SQL语句。经过语句分析之后,最终生成执行计划,并将执行计划装载到库高速缓存;在执行阶段,服务器进程按照执行计划由所安排的步骤执行SELECT语句。具体过程如下:

Ø         确定被选择行所在数据块是否已经被读取到缓冲区。若数据在缓冲区中已经存在,则直接提取数据。

Ø         若数据不再缓冲区中,则数据从数据文件读取到数据高速缓存;

3. 提取数据

提取数据(Fetch)是指将被选择行数据返回到客户端。执行语句之后,被选择行所在数据将被读取到缓冲区中;在提取数据阶段,服务器进程将被选择行返回到用户进程。

6.3 处理DML语句

    当客户端运行DML语句时,首先将语句发送到Oracle Server端,然后由服务器进程处理DML语句。因为DML语句不会返回数据,所以处理DML语句只包括解析和执行两个阶段。下面以处理UPDATE语句为例,说明处理DML语句的全过程。

SQL> UPDATE emp SET sal=sal+300 WHERE empno=7788;

1 row updated

1.解析

类似于处理SELECT语句,首先将SQL语句发送到服务器进程,然后由服务器进程检查DML语句的语法、语义、权限,最终生成该DML语句的执行计划,并将DML语句及执行计划装载到库高速缓存。

2. 执行

在经过语句解析之后,会生成DML语句执行计划,并将执行计划装载到库高速缓存;在执行阶段,服务器进程按照执行计划执行该DML语句。如下图所示,执行DML语句时,由于涉及到数据修改,所以需要记载事务变化,并存放事务的新、旧数据。具体过程如下:

Ø         检查被修改行数据在数据高速缓存中是否存在,如果不存在,则从数据文件中将数据读取到数据高速缓存;

Ø         在被修改行上加行锁,防止其他用户修改相应行数据;在表上加表锁,防止其他用户该表表结构或删除表;

Ø         将数据变化(表块变化、UNDO变化)写入到重做日志缓冲区;

Ø         修改缓冲区数据,将事务的新数据写入到表块对应的缓冲区中,将事务的旧数据写入到UNDO块对应的缓冲区中。

 

 

6.4 处理COMMIT

当客户端执行COMMIT语句提交事务时,首先将语句发送到服务器进程,然后由服务器进程处理COMMIT语句。SCN时用于记载数据库变化的唯一标识号,该序号顺序等增,并且永远不会用尽,一旦数据库发生任何变化,其值也会随之改变。下图给出了COMMIT的工作原理。

 

 

 

执行CMMMIT操作时,因为要确保数据一致性,所以需要将事务变化写到OS文件中。具体过程如下:

Ø         COMMIT语句及SCN写入重做日志缓冲区;

Ø         后台进程LGWR将重做日志缓冲区的所有事务变化写入重做日志文件。需要注意的是,Oracle采用快速提交机制,提交时刻只将事务变化写入重做日志,而脏缓冲区的数据不会写入数据文件;

Ø         将提交完成信息返回用户进程;

Ø         释放事务所占用的表锁和行锁