ORACLE结构回顾(摘)

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 代码才进行可读写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值