ORACLE结构回顾
为了使读者对本资料所描述的内容有直接的理解,这里从总结的角度出发,给出了深入了解
Oracle8i/9i 的管理所需的准备知识小结,如果读者对基本的概念已经很熟悉,则可以跳过本
章。
§1.1 Oracle 数据库结构
主要介绍Oracle 数据库结构,包括:
z Oracle 数据字典
z 表空间与数据文件
z Oracle 实例(Instance)
§1.1.1 Oracle? 数据字典
Oracle数据库的重要部分是数据字典。它存放有Oracle数据库所用的有关信息,对用户来说是
一组只读的表。数据字典内容包括:
z 数据库中所有模式对象的信息,如表、视图、簇、及索引等。
z 分配多少空间,当前使用了多少空间等。
z 列的默认值。
z 约束信息的完整性。
z Oracle用户的名字。
z 用户及角色被授予的权限。
z 用户访问或使用的审计信息。
z 其它产生的数据库信息。
数据库数据字典是一组表和视图结构。它们存放在SYSTEM表空间中。
数据库数据字典不仅是每个数据库的中心。而且对每个用户也是非常重要的信息。用户可以
用SQL语句访问数据库数据字典。
§1.1.2 表空间与数据文件
Oracle 以表空间来存储逻辑数据并 以物理数据相连。如图:
Tablespace 1 Tablespace 2
Index1 Index2
Table2
Table1
Table3 Index3
Datafile1 Datafile2 Datafile3
数据库被分成一个或多个逻辑部件称作表空间。而表空间又被分成称作段 (segment)的逻辑
部件。这些段再细分就叫扩展(extents)。Oracle 一般有如下表空间:
z SYSTEM 表空间
z 用户多个表空间
z 工具表空间
z 只读表空间
z 临时表空间
z 回滚段表空间
§1.1.3 Oracle 实例(Instance)
Oracle实例是由一组后台进程和内存结构组成。每个运行的数据库系统都与实例有关。
Oracle 进程
Oracle 有两种类型的进程: 服务器进程和后台进程(server processes and background
processes) 。
§1.2 Oracle 文件
§1.2.1 数据文件
z Oracle 的数据文件是用来存放实际数据的物理文件;
z Oracle 数据文件必须对应于一个表空间;
z Oracle 系统安装完成并创建数据库成功后,Oracle 会自动创建几个数据库文件。它们被分
配给 SYSTEM、USERS、TEMP 等表空间;
z 用户可以根据需要创建表空间时创建一个或多个数据文件;
z 对已经创建完成的数据文件可以用ALTER ADTABASE … AUTOEXTEND 、RESIZE 来改
变数据文件的大小。
z 数据文件可用下面命令查到:
select tablespace_name,file_name ,bytes from dba_data_files;
§1.2.2 控制文件
z Oracle 数据库至少有一个控制文件;
z 一般数据库系统安装完成后,自动创建两个以上控制文件;
z 为了安全一般建议创建多个控制文件;
z 控制文件可用下面命令查到:
select name,value from v$parameter where name like 'control_files';
§1.2.3 重做日志文件
z 重做日志是Oracle 的日记帐,负责记录所有用户对象或系统变更的信息;
z 安装完成后有多个重做日志文件,它们是几个分为一组,组内的重做日志文件大小要一
样;
z 为了使系统性能更好可以在创建多重做日志文件组;
z 重做日志文件可以名下面命令查到:
select * from v$logfile;
§1.2.4 其它支持文件
除了上面的三类文件外,还有:
z INITsid.ORA 参数文件;
z Sqlnet.ora 文件;
z Tnsnames.ora 文件;
z Listener.ora 文件等。
§1.3 数据块、区间和段
Oracle 系统的数据块(block)和区间(extent)及段(segment)存在一种关系。了解它们的关
系对于管理和优化都有好处。
§1.3.1 数据块(data block)
z Oracle 的数据块也叫Oracle 块;
z Oracle 系统在创建表空间时将数据文件格式化成若干个Oracle 块;
z 每个Oracle 块是Oracle 系统处理的最小单位;
z 块的大小在安装系统时确定,可以选择“ 自定义安装”来设置大小;
z 块的大小一旦确定下来就不能改动;
z 块的大小可以从2k 至64k 不等;
z 块的大小可以用下面命令查到:
select name,value from v$parameter where name like 'db_block_size';
§1.3.2 区间(extent)
z 分配给对象(如表)的任何连续块叫区间;
z 区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区
间(即扩展一些块);
z 区间的大小由next 决定;
z 一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象;
z 一个对象所用去多少区间可用下命令查到:
select segment_name,tablespace_name,count(*) from dba_extents
having count(*)>1 group by segment_name,tablespace_name;
§1.3.3 段(segment)
z 段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;
z 段可以有表段、索引段、回滚段、临时段和高速缓存段等;
z 段使用同表空间中的若干Oracle 块(可以位于不同数据文件中)。
例:
CREATE TABLE abc ( empno number(4),ename varchar2(20),sal number(9,2))
TABLESPACE user_data storage(initial 500k next 256k pctincrease 0);
1)段被分配=初始区间=500k;
2)当开始的500k 用完后就再分配256k; 此时段=500k+256k;
3)如果所分配的区间又用完后,就再分配256k, …
段(segment)、区间(extent)及块的关系(seg_ext_block)
§1.4 SQL 语句处理
SQL(Structured Query Language)是结构查询语言,它用于操纵和检索Oracle 数据库的数据。
而 SQL 语句分为 DDL(Data Define Language)和 DML(Data Manipulation Language)两类。在本
教材里主要讨论 DML 语言。DML 语言包括:SELECT 、INSERT 、UPDATE 、DELETE 、
EXPLAIN 及LOCK TABLE。还要讨论COMMIT 语句。
§1.4.1 SQL 语句处理顺序
SQL 语句处理分两个或三个阶段,每个语句从用户进程传给服务器进程进行分析然后执行。
如果是 select 语句,则还需要将结果返回给用户。
1.分析(Parse)
分析是 SQL 语句处理的第一步。主要进行:
z 检查语法和根据字典来检查表名、列名。
z 确定用户执行语句的权限。
z 为语句确定最优的执行计划。
z 从 SQL 区中找出语句。
2.执行(Execute)
Oracle 执行阶段执行的是被分析过的 语句。对于 UPDATE、DELETE 语句,Oracle 先锁住有
关的行。Oracle 还要查找数据是否在数据缓冲区里。如果不在还得从数据文件中将数据读到数
据缓冲区里来。
3.检索(Fetch )
如果是 select 语句,还要进行检索操作。执行结束,将数据返回给用户。
4.Select 语句处理:
一般select 语句处理要经过下面步骤:
执行顺序是:
1)建立光标。
2 )分析语句。
3)定义输出:指定位置,类型,结果集的数据类型。
4 )绑定变量:如果查询使用变量的话,Oracle 就要知道变量的值。
5)是否能并行运行。
6)执行查询。
7)检索出数据。
8)关闭光标。
5.DML 语句处理:
一般INSERT,UPADTE,DELETE 语句处理要经过下面步骤:
打开光标
YES
库缓存里有本语
句?
NO
分析语句
定 义
NO 绑定变量?
YES
绑定
并行
执行
检索
关闭光标
执行顺序是:
1)建立光标:Oracle 建立一个隐含的光标。
2)分析语句。
3)绑定变量:如果语句用了变量,Oracle 要知道变量的值。
4)看语句是否能以并行方式运行(如果有多个服务器时)。
5)执行语句。
6)通知用户,语句已执行完毕。
7)关闭光标。
§1.4.2 COMMIT 语句处理顺序
当事务提交时,Oracle 分配一个唯一的顺序号 SCN(System Change Number)给事务。数据库恢
复总是基于该 SCN 号来进行处理。SCN 号是记录在控制文件、数据文件、块头及重做日志文
件中。
1.COMMIT 处理步骤:
Oracle 在下面情况提交事务:
z 发出一个COMMIT 语句。
z 执行DDL 语句时。
z 离开Oracle 时。
Oracle 处理COMMIT 的顺序是:
1)服务器为每个COMMIT 产生一个 SCN。使改变永久化。
2 )LGWR 进程将日志缓冲区数据并带有 SCN 一起写到重做日志文件。
3)服务器释放表级和行级锁。
4 )用户被提示COMMIT 完成。
5)服务器使事务已完成。
Oracle 处理ROLLBACK 的顺序是:
当下面情况发生时执行回滚:
z 发出ROLLBACK 命令。
z 服务器进程放弃地终止。
z 会话被DBA 终止。
ROLLBACK 是对数据库的操作进行撤消,步骤有:
1)服务器进程不做任何的改变。
2)服务器释放表级和行级锁。
3) 服务器使事务已完成。
§1.5 共享池
Oracle 的系统全局区SGA 是由三个部分组成:
z 重做日志缓冲区
z 数据库缓高速冲区
z 共享 SQL 区(包括数据字典cache 和 Shared SQL Pool )
SGA 中的共享池由两个部分组成,即共享 SQL 高速缓存(即库高速缓存)和数据字典高速缓
存。共享 SQL 高速缓存用于在 SGA 中保存当前一次执行的查询的存储过程和其它 SQL 操
作。频繁使用的 SQL 语句都存放在该区内。 而数据字典高速缓存存放系统的数据字典。
共享池高速缓存的使用效率取决于命中率。命重率高表示不需要从硬盘读数据。但是这样的
情况是很不现实的。
例:查询执行次数和失效次数:
select sum(pins) pins, sum(reloads) reloads from v$librarycache;
如果 ratio = ( reloads / pins ) * 100 大于 1 或更大。就需要加大共享池的大小。
类似地,数据字典高速缓存取决于数据库访问的用户数、权限、数据表、索引等。数据库系
统会重复使用相同的数据库对象。如果程序频繁地访问硬盘,就说明数据字典高速缓存过快
失效造成。
例:查询用户可以获得gets(找到对象 )次数和getmisses(高速缓存失效)的次数:
select sum(gets) gets , sum(getmisses) getmisses
from v$rowcache;
如果 ratio = ( getmisses / gets ) * 100 大于 10%,就要考虑加大SHARED_POOL_SIZE 参数值。
§1.6 块缓存(数据高速缓冲区)
块缓存即数据高速缓冲区。它是 SGA 区的一个主要部分。用于存放从数据文件读入的数据
块。它的大小有 INITsid.ORA 文件的 DB_BLOCK_BUFFERS 参数来设置(Oracle9i 参数名称为
DB_CACHE_SIZE)。这个区内容再分为:
z Dirty Buffers 已经改变但还没有存盘的缓冲区。
z Pinned Buffers 当前正在访问的缓冲区。
z Free Buffers 当前尚未使用的缓冲区。
数据高速缓冲区也有命中率的问题。如果需要的数据能在数据高速缓冲区中找到。就叫命
中。下面语句查询命中率。
例:查询数据高速缓冲区的命中率
select name, value from v$sysstat
where name in (‘consistent gets’,’db block gets’,’physical reads’ ) ;
如果 ratio = 1- ( physical reads / ( db block gets + consistent gets ) ) 低于 70% 。 则应该加大
INITsid.ORA 文件中的DB_BLOCK_BUFFERS 参数值。
§1.7 数据库写入进程
数据库写入进程(DBWR )的任务是将修改后的数据块写回数据库文件中。在某些操作
系统中,Oracle 有两个BDWR 进程。
当用户向表中增加数据或从表中读数据,都要用到数据高速缓冲区。当对缓冲区的数据进行
过改动,就叫脏(dirty),如果多次修改(弄脏多个块)缓冲区数据,空闲的缓冲区就减少。
用户就找不到有效的缓冲区来存放查出(读出)的数据。
§1.8 日志写进程
数据库在处理每个事务中,先将所涉及的记录记在日志缓冲区内。日志缓冲区的是按照
先进先出原则进行工作的。在 Oracle 系统中,有多个日志文件,日志进程以循环的方式将日
志缓冲区内的数据写到日志文件中。
日志写入进程的规则是:
z LGWR 在收到用户进程的提交语句时被唤醒。
z LGWR 每 3 秒被唤醒一次并写重做日志缓冲区。
z 当重做日志缓冲区使用达 1/3 时,LGWR 写重做日志缓冲区。
z 当 DBWR 将数据缓冲区的数据写到数据文件时,LGWR 确保相应的重做日志缓冲区也写
入到日志文件中。
§1.9 数据库检查点
当把 SGA 高速缓冲区的数据写回数据文件时就发生了检查点。检查点事件将定期发生以
保证数据库和控制文件同步。然而,由于硬盘的 I/O 速度比内存的处理速度慢,所以数据库系
统一方面要保持内存数据文件的同步,又要保证这种同步不能过频繁。这样就要在
INITsid.ORA 文 件 中 设 置 两 个 参 数 : LOG_CHECKPOINT_INTERVAL 和
LOG_CHECKPOINT_TIMEOUT。
LOG_CHECKPOINT_INTERVAL 设置块的数量间隔。
LOG_CHECKPOINT_TIMEOUT 设置时间间隔。
如果DBA 增大重做日志文件,则重做日志交换的频率降低。
如果要强制产生检查点,就要用下面命令来完成:
ALTER system switch logfile;
当 DBA 执行重做日志的管理时,如将日志文件从一个硬盘移到另一个硬盘时,就需要强制检
查点发生。
§1.10 归档处理
当数据库环境设置成归档模式时,归档进程(ARCH )就被启动。LGWR 以循环的方式
对日志文件进行写。当 LGWR 进程写满一个日志文件并要覆盖写另外的日志文件时,LGWR
通知 ARCH 进程把想将将被覆盖的日志文件拷贝到一个归档日志中。ARCH 就负责将在线的
日志文件的副本写到指定的磁带或硬盘上。
要设置数据库为归档方式,可以有两种方法:
ALTER SYSTEM ARCHIVE LOG START;
或
在INITsid.ORA 文件中设置 LOG_ARCHIVE_START=true 并重启动数据库实例。
§1.11 程序全局区(PGA)
当每个用户与 Oracle 系统连接成功后,Oracle 创建一个叫做程序或私有全局区(Program
or Private Gloable Area )。这个程序全局区一般来说是一个较小的服务器内存区域,程序全局
区包含有数据和单进程的(服务器或后台)控制信息。它包含有特定的会话信息。例如,一
个客户端的服务器进程使用它的PGA 来存储该会话的程序变量及包的状态等。
程序全局区是一个非共享的程序可以写入的内存区。当某个 PGA 被分配给每个服务器进
程;则该PGA 对于服务器进程来说是独占的,并且只有 Oracle 代码才进行可读写。