Oracle体系结构
来源:互联网 发布:mac 照片文件位置 编辑:程序博客网 时间:2024/06/06 09:25
Oracle体系结构
1 Oracle Server
Oracle server由例程(Instance)和数据库(Database)两部分组成。例程是一组内存结构和后台进程的集合,内存结构主要包括数据高速缓存、重做日志缓冲区和共享池3部分,内存结构总称为SGA(System Global Area);后台进程包括SMON、PMON、DBWR、CKPT、LGWR、ARCH等。数据库是一组OS文件的集合,由数据文件、控制文件和重做日志组成。如下图所示。
2 SGA
SGA(System Global Area)由一组内存结构组成,它由所有用户进程共享的一块内存区域。启动例程时,Oracle自动分配SGA;关闭例程时,Oracle自动释放SGA占用内存空间。SGA主要包括共享池(Shared Pool)、数据高速缓存(Database Buffer Cache)和重做日志缓冲区(Redo Log Buffer)3个部分。
Oracle9i和Oracle10g中,允许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语句1和SELECT语句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)用于存放最近访问的数据块信息,它由许多小缓冲区(缓冲区尺寸=数据块尺寸)组成。Oracle10g中DB_CACHE_SIZE和DB_nk_CACHE_SIZE来定义数据缓存的尺寸,其中DB_CACHE_SIZE定义标准数据高速缓存的尺寸,DB_nk_CACHE_SIZE定义非标准数据高速缓存的尺寸。
Oracle采用LRU(Least Recently Used)算法管理数据高速缓存,类似于排队机制,最先入队的最先出队,最后入队的最后出队。
假定数据高速缓存包括10个缓冲区,数据已经沾满了这10个缓冲区,并且B1是最早访问的缓冲区,B10是最近访问的缓冲区。假定需要执行新的数据访问操作(SELECT或DML),并且要访问的数据都不在这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定义。
当执行DDL或DML语句时,服务器进程首先将事务变化记载到重做日志缓冲区,然后才会修改数据高速缓存。重做日志缓冲区由很多重做记录(Redo Record)组成,并且每条重做记录记载了被修改数据块的位置以及变化后的数据。
如上图所示,当执行UPDATE操作时,新数据2000将被放到EMP段所对应的缓冲区B1中,旧数据1000将被放到UNDO段所对应的缓冲区U1中。在修改这两个缓冲区之前,首先将他们的变化写到重做日志缓冲区,然后再修改它们的数据。
3 后台进程
后台进程是指有Oracle Server隐含执行的进程。启动例程时,Oracle不仅会分配SGA,还会启动后台进程;关闭例程时,Oracle不仅释放SGA所占用的内存空间,而且还会释放后台进程所占用的CPU和内存资源。
Oracle提供很多后台进程,常见的有SMON、PMON、DBWR、LGWR、CKPT、ARCH。
3.1 SMON
SMON(System Monitor)用于执行例程恢复、合并空间碎片并释放临时段。假定在数据库运行过程中出现了例程失败(断电、内存故障、后台进程例外等),此时SGA信息尚未被完全写入磁盘(数据文件、重做日志)。当重新打开数据库时,后台进程SMON会按照以下步骤自动执行例程恢复:
REDO:重新应用那些被记载道重做日志,但尚未记载到数据文件中的数据。因为所有被提交的事务已经记载到了重做日志,所以可以确保恢复事务数据。
打开数据库:在打开数据库时,既包含了被提交的数据,也包含了未被提交的数据(加锁)。
UNDO:取消未提交的数据。打开数据库之后,Oracle会自动使用UNDO段回退未提交的数据。
3.2 PMON
PMON(Process Monitor)用于监视服务器进程的执行,并且在服务器进程失败时清除该服务器进程。访问Oracle Server时,Oracle会在服务器端为用户进程分配服务器进程。
3.3 DBWR
DBWR(Database Writer)用于将数据高速缓存的脏缓冲区数据写入到数据文件中。如下图所示。
默认情况下只有一个DBW0进程,通过设置初始化参数db_writer_processes可以定义最多10个DBWR进程。当执行DML操作时,服务器进程就会修改缓冲区,并且将这些缓冲区标识为脏缓冲区,将来这些脏缓冲区会由后台进程DBWR写入到数据文件中。出现以下情况时,DBWR进程会开始工作:
Ø 系统发出检查点(CheckPoint)
Ø 服务器进程找不空空闲缓冲区
Ø 删除或截断表
Ø 使表空间脱机
Ø 开始表空间备份
3.4 LGWR
LGWR(Log Writter)用于将重做日志缓冲区所记载的全部内容写入到重做日志文件中。
当执行select或dml操作时,服务器进程首先将数据文件读取到数据高速缓存,然后从数据高速缓存提取数据或修改数据高速缓存的数据。Oracle总是“先日志后修改”(先记载变化然后修改数据)。因此,将脏缓冲数据写入到数据文件之前,Oracle先将事务变化写入到重做日志文件,也就是说,在DBWR工作之前,LGWR首先将事务变化写入到重做日志。出现以下情况,LGWR开始工作:
Ø 提交事务(commit)
Ø 每隔3秒钟
Ø 当重做信息超过1M时
Ø 重做日志缓冲区已经有三分之一填满
Ø 在DBWR进程将脏缓冲区写入到数据文件之前
3.5 CKPT
CKPT(CheckPoint Process)用于发出检查点(Checpoint),检查点会同步数据库的数据文件、控制文件和重做日志。当发出检查点时,后台进程CKPT将检查点时刻的SCN(System Change Number)写入到控制文件和数据文件头部。同时促使后台进程DBWR将所有脏缓冲区写入到数据文件中。
当发出检查点时,不仅后台进程CKPT和DBWR要开始工作,LGWR也会将重做日志缓冲区写入到重做日志,从而确保数据文件、控制文件和重做日志的一致性。出现以下情况时CKPT会开始工作:
Ø 日志切换
Ø 关闭例程(SHUTDOWN ABORT除外)
Ø 手工检查点操作(ALTER SYSTEM CHECKPOINT)
Ø 由初始化参数fast_smart_mttr_targer强制发出检查点
3.6 ARCH
ARCH(Archive Process)用于将重做日志的事务变化复制到归档日志中,该后台进程只有在ARCHIVELOG模式下才有意义。默认情况下只有一个ARC0进程,通过初始化参数log_archive_max_processes最多可以定义10个归档进程。在ARCHIVELOG模式下,进行日志切换时会自动生成归档日志。如下图所示。
4 数据库物理结构
4.1 数据文件
数据文件(Data file)用于存储数据库数据,包括系统数据(数据字典)、用户数据(表、索引、簇)、UNDO数据等。当建立数据库或表空间时,数据文件通过DATAFILE选项制定。数据库逻辑上由一个和多个表空间(tablespace)组成,而表空间物理上由一个和多个数据文件组成。
当建立临时表空间时,使用TEMPFILE选项可以指定临时文件。临时文件(Temperary File)用于存放排序操作产生的临时数据。当执行排序操作时,如果临时数据超过排序区尺寸,服务器进程会将临时数据放到临时表空间中。
4.2 重做日志
重做日志(Redo Log)用于记录数据库变化,当进行例程恢复或介质恢复时需要使用重做日志。当执行DDL或DML操作时,事务变化会被写到重做日志缓冲区,在特定时刻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_SIZE、DB_BLOCK_SIZE、LOG_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采用快速提交机制,提交时刻只将事务变化写入重做日志,而脏缓冲区的数据不会写入数据文件;
Ø 将提交完成信息返回用户进程;
Ø 释放事务所占用的表锁和行锁
- ORACLE 体系结构
- ORACLE 体系结构
- oracle体系结构
- oracle体系结构
- oracle 体系结构
- Oracle体系结构
- Oracle体系结构
- Oracle体系结构
- oracle体系结构
- oracle体系结构
- ORACLE 体系结构
- Oracle 体系结构
- ORACLE体系结构
- oracle 体系结构
- Oracle体系结构
- ORACLE体系结构
- Oracle 体系结构
- oracle体系结构
- winform中窗体显示和传值
- ubuntu 中文版 11.04 下载镜像
- 数码相机的定位
- VC多线程运行库的解决
- 计算某段代码运行时间
- Oracle体系结构
- java cookie
- copy命令使用小技巧
- getOutputStream() has already been called for this response
- SystemClock elapsedRealtime()
- 3D视频的原理
- php+apache+mysql配置相关
- ado连接技术
- 我的OI生涯