Oracle从入门到精通(第3版)
上QQ阅读APP看书,第一时间看更新

2章 Oracle 11g体系结构

视频讲解:90分钟

Oracle的体系结构是从某一角度来分析数据库的组成和工作过程,以及如何管理数据库和组织数据。对于初学者而言,在学习本章的过程中,会涉及大量的新概念和术语,希望读者能深入理解这些概念和术语,为后面章节的学习打好基础。

通过阅读本章,您可以:

了解Oracle 11g体系结构

掌握逻辑存储结构

掌握物理存储结构

熟悉Oracle 11g服务器结构

熟悉Oracle 11g常用的数据字典

2.1 Oracle 11g体系结构概述

Oracle体系结构主要用来分析数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。Oracle数据库是一个逻辑概念,而不是物理概念上安装了Oracle数据库管理系统的服务器。

在Oracle数据库管理系统中有3个重要的概念需要理解,那就是实例(Instance)、数据库(Database)和数据库服务器(Database Server)。其中,实例是指一组Oracle后台进程以及在服务器中分配的共享内存区域;数据库是由基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等组成的物理文件集合;数据库服务器是指管理数据库的各种软件工具(如SQL*Plus、OEM等)和实例及数据库3个部分。从实例与数据库之间的辩证关系来讲,实例用于管理和控制数据库;而数据库为实例提供数据。一个数据库可以被多个实例装载和打开;而一个实例在其生存期内只能装载和打开一个数据库。

数据库的主要功能就是存储数据,数据库存储数据的方式通常称为存储结构,Oracle数据库的存储结构分为逻辑存储结构和物理存储结构。逻辑存储结构用于描述Oracle内部组织和管理数据的方式,而物理存储结构用于展示Oracle在操作系统中的物理文件组成情况。

启动Oracle数据库服务器实际上是在服务器的内存中创建一个Oracle实例,然后用这个实例来访问和控制磁盘中的数据文件。当用户连接到数据库时,实际上连接的是数据库的实例,然后由实例负责与数据库进行通信,最后将处理结果返回给用户。图2.1展示了Oracle数据库的基本体系结构,从图中可以看出,SQL命令从客户端发出后,由Oracle的服务器进程进行响应,然后在内存区域中进行语法分析、编译和执行,接着将修改后的数据写入数据文件,将数据库的修改信息写入日志文件,最后将SQL的执行结果返回给客户端。

图2.1 Oracle体系结构

2.2 逻辑存储结构

逻辑存储结构是Oracle数据库存储结构的核心内容,对Oracle数据库的所有操作都会涉及其逻辑存储结构。逻辑存储结构是从逻辑的角度分析数据库的构成,是对数据存储结构在逻辑概念上的划分。Oracle的逻辑存储结构是一种层次结构,主要由表空间、段、数据区和数据块等概念组成。逻辑结构是面向用户的,当用户使用Oracle设计数据库时,其使用的就是逻辑存储结构。Oracle的逻辑存储结构中所包含的多个结构对象从数据块到表空间形成了不同层次的粒度关系,如图2.2所示。

图2.2 Oracle的逻辑存储结构

从图2.2中可以看到,Oracle数据库是由多个表空间组成(可见数据库自身也属于逻辑概念),而表空间又是由多个段组成,段由多个数据区组成,数据区又是由多个数据块组成。

2.2.1 数据块

数据块(Data Block)是Oracle逻辑存储结构中的最小的逻辑单位,也是执行数据库输入/输出操作的最小存储单位。Oracle数据存放在“Oracle数据块”中,而不是“操作系统块”中。通常Oracle数据块是操作系统块的整数倍,如果操作系统块的大小为2048B,并且Oracle数据块的大小为8192B,则表示Oracle数据块由4个操作系统块构成。Oracle数据块有一定的标准大小,其大小被写入到初始化参数DB_BLOCK_SIZE中。另外,Oracle支持在同一个数据库中使用多种大小的块,与标准块大小不同的块就是非标准块。

【例2.1】 通过v$parameter数据字典来查询Oracle标准数据块的大小,具体代码如下。(实例位置:资源包\TM\sl\2\1)

SQL> col name format a30
SQL> col value format a20
SQL> select name,value from v$parameter where name = 'db_block_size' ;

本例运行结果如图2.3所示。

图2.3 Oracle标准数据块的大小

在上面的代码中,首先格式化name列和value列的大小,以方便在同一行显示,然后使用SELECT语句获得参数DB_BLOCK_SIZE的值(即value列的值),该值也就是标准数据块的大小。

数据块中可以存放表数据、索引数据和簇数据等,无论存放哪种类型的数据,其结构都是相同的。数据块由块头、表目录、行目录、空余空间和行数据这5部分组成,如图2.4所示。

图2.4 数据块的结构

数据块中各个组成部分的介绍如下。

块头:存放数据块的基本信息,如块的物理地址、块所属的段的类型。

表目录:存放表的相关信息。如果数据块中存储的数据是表数据,则表目录中存储有关这些表的相关信息。

行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行的地址等。

空余空间:空余空间是一个块中未使用的区域,这片区域用于新行的插入和已经存在的行的更新。

行数据:用于存放表数据和索引数据的地方,这部分空间已被数据行所占用(如表中的若干行数据记录)。

通常把块头、表目录、行目录这三部分组合起来称为头部信息区,头部信息区不存放数据,它存放整个块的引导信息,起到引导系统读取数据的作用。所以头部信息区若遭到破坏,则Oracle系统将无法读取这部分数据。另外,空余空间和行数据公共构成块的存储区,用于存放真正的数据记录。

2.2.2 数据区

数据区(Extent也可称作数据扩展区)是由一组连续的Oracle数据块所构成的Oracle存储结构,一个或多个数据块组成一个数据区,一个或多个数据区再组成一个段(Segment)。当一个段中的所有空间被使用完后,Oracle系统将自动为该段分配一个新的数据区,这也正符合Extent这个单词所具有的“扩展”的含义,可见数据区是Oracle存储分配的最小单位,Oracle就以数据区为单位进行存储控件的扩展。

使用数据区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配存储空间就是以数据区为单位的。一个Oracle对象至少包含一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

2.2.3 段

段(Segment)是由一个或多个数据区构成,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象,Oracle也把这种占用空间的数据对象统一称为段。一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时,Oracle将为它创建一个段。

段是为特定的数据对象(如表、索引、回滚等)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件,使用段的目的是用来保存特定对象。一个Oracle数据库通常有以下4种类型的段。

(1)数据段:数据段中保存的是表中的数据记录。在创建数据表时,Oracle系统将为表创建数据段。当表中的数据量增大时,数据段的大小自然也随着变大,数据段的增大过程是通过向其添加新的数据区来实现的。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。

(2)索引段:索引段中包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。

(3)回滚段:回滚段(也可称作撤销段)中保存了回滚条目,Oracle将修改前的旧值保存在回滚条目中。利用这些信息,可以撤销未提交的操作,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。Oracle 11g系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。

(4)临时段:当执行创建索引、查询等操作时,Oracle可能会使用一些临时存储空间,用于暂时性地保存解析过的查询语句以及在排序过程中产生的临时数据。Oracle系统将在专门用于存储临时数据的表空间中为操作分配临时段。

在执行CREATE INDEX、SELECT ORDER BY、SELECT DISTINCT和SELECT GROUP BY等几种类型的SQL语句时,Oracle系统就会在临时表空间中为这些语句的操作分配一个临时段。

在数据库管理过程中,若经常需要执行上面这类SQL语句,最好调整SORT_AREA_SIZE初始化参数来增大排序区,从而使排序操作尽量能够在内存中完成,以获得更好的执行效率,但同时这对数据库服务器的内存空间提出了更大的要求。

2.2.4 表空间

Oracle使用表空间(Tablespace)将相关的逻辑结构(如段、数据区等)组合在一起,表空间是数据库的最大逻辑划分区域,通常用来存放数据表、索引、回滚段等数据对象(即Segment),任何数据对象在创建时都必须被指定存储在某个表空间中。表空间(属逻辑存储结构)与数据文件(属物理存储结构)相对应,一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间;Oracle数据的存储空间在逻辑上表现为表空间,而在物理上表现为数据文件。举个例子来说,表空间相当于操作系统中的文件夹,而数据文件就相当于文件夹中的文件。每个数据库至少有一个表空间(即SYSTEM表空间),表空间的大小等于所有从属于它的数据文件大小的总和。

由于表空间在物理上(即磁盘上)包含操作系统中的一个或多个数据文件,因此在表空间中创建的数据对象就存在以下两种情况。

(1)若表空间只包含一个数据文件,则该表空间中的所有对象都存储在这个数据文件中。

(2)若表空间包含多个数据文件,则Oracle即可将数据对象存储在该表空间的任意一个数据文件中,也可以将同一个数据对象中的数据分布在表空间的多个数据文件中。

在创建数据库时,Oracle系统会自动创建多个默认的表空间,这些表空间除了用于管理用户数据的表空间之外,还包括用于管理Oracle系统内部数据(如数据字典)的表空间,下面列举了Oracle 11g版本默认创建的主要表空间。

(1)SYSTEM表空间——系统表空间。它用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。Oracle本身不赞成将用户创建的表、索引等存放在系统表空间中。表空间中的数据文件个数不是固定不变的,可以根据需要向表空间中追加新的数据文件。

【例2.2】 通过dict查看数据库中数据字典的信息,具体代码如下。

SQL> col table_name for a30
SQL> col comments for a30
SQL> select * from dict;

【例2.3】 通过v$fixed_view_definition查看数据库中内部系统表的信息,具体代码如下。

SQL> col view_name format a30
SQL> col view_definition format a30
SQL> select * from v$fixed_view_definition;

(2)SYSAUX表空间。它是Oracle 11g新增加的表空间,是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,降低了SYSTEM表空间的负荷,主要存储除数据字典以外的其他数据对象。SYSAUX表空间一般不存储用户的数据,由Oracle系统内部自动维护。

(3)UODO表空间——撤销表空间。它用于存储撤销信息的表空间。当用户对数据表进行修改操作(包括插入、更新、删除等操作)时,Oracle系统自动使用撤销表空间来临时存放修改前的旧数据。当所做的修改操作完成并执行提交命令后,Oracle根据系统设置的保留时间长度来决定何时释放掉撤销表空间的部分空间。一般在创建Oracle实例后,Oracle系统自动创建一个名字为UNDOTBS1的撤销表空间,该撤销表空间对应的数据文件是UNDOTBS01.DBF。

(4)USERS表空间——用户表空间。它是Oracle建议用户使用的表空间,可以在这个表空间上创建各种数据对象。例如,创建表、索引、用户等数据对象。Oracle系统的样例用户scott对象就存放在USERS表空间中。

除了Oracle系统默认创建的表空间外,用户可根据应用系统的实际情况及其所要存放的对象类型创建多个自定义的表空间,以区分用户数据与系统数据。此外,不同应用系统的数据应存放在不同的表空间上,而不同表空间的文件应存放在不同的盘上,从而减少I/O冲突,提高应用系统的操作性能。

2.3 物理存储结构

逻辑存储结构是为了便于管理Oracle数据而定义的具有逻辑层次关系的抽象概念,不容易理解;但物理存储结构比较具体和直观,它用来描述Oracle数据在磁盘上的物理组成情况。从大的角度来讲,Oracle的数据在逻辑上存储在表空间中,而在物理上存储在表空间所包含的物理文件(即数据文件)中。

Oracle数据库的物理存储结构由多种物理文件组成,主要有数据文件、控制文件、重做日志文件、归档日志文件、参数文件、密码文件和警告日志文件等,如图2.5所示。下面将对这些物理文件进行讲解。

图2.5 Oracle的物理存储结构

2.3.1 数据文件

数据文件是用于保存用户应用程序数据和Oracle系统内部数据的文件,这些文件在操作系统中就是普通的操作系统文件,Oracle在创建表空间的同时会创建数据文件。Oracle数据库在逻辑上由表空间组成,每个表空间可以包含一个或多个数据文件,一个数据文件只能隶属于一个表空间,如图2.5所示。

在创建表空间的同时,Oracle会创建该表空间的数据文件。在表空间中创建数据对象(如表、索引、簇等)时,用户是无法指定使用哪一个数据文件来进行存储的,只能由Oracle系统负责为数据对象选择具体的数据文件,并在其中分配物理存储空间。一个数据对象的数据可以全部存储在一个数据文件中,也可以分布存储在同一个表空间的多个数据文件中。

在读取数据时,Oracle系统首先从数据文件中读取数据,并将数据存储在内存的高速数据缓冲区中。如果用户要读取数据库中的某些数据,而请求的数据又不在内存的高速数据缓冲区中,则需要从相应的数据文件中读取数据并存储在缓冲区中。当修改和插入数据时,Oracle不会立即将数据写入数据文件,而是把这些数据保存在数据缓冲区中,然后由Oracle的后台进程DBWR决定如何将其写入相应的数据文件。这样的存取方式减少了磁盘的I/O操作,提高了系统的相应性能。

【例2.4】 通过查询dba_data_files或v$datafile数据字典来了解Oracle系统的数据文件信息,具体代码如下。(实例位置:资源包\TM\sl\2\2)

SQL> col file_name for a50;
SQL> set linesize 100;
SQL> select file_name,tablespace_name from dba_data_files;

本例运行结果如图2.6所示。

图2.6 Oracle系统的数据文件信息

在上面的代码中,可以看到3种类型的数据文件:系统数据文件(SYSTEM01.DBF和SYSAUX01.DBF)、撤销数据文件(UNDOTBS01.DBF)和用户数据文件(USERS01.DBF、EXAMPLE01.DBF、TBSP_1.DBF和TBSP_2.DBF),下面对这3种类型的数据文件进行介绍。

(1)系统数据文件。用于存放“特殊”的用户数据和Oracle系统本身的数据,如用户建立的表名、列名及字段类型等,这些属于用户数据范畴,这些数据被存放在系统表空间所包含的数据文件中;而Oracle系统内部的数据字典、系统表(如dba_data_files、dba_temp_files等)中所存储的数据属于Oracle系统的内部数据,这些数据也存放在系统表空间所包含的数据文件中。

(2)撤销数据文件。撤销数据文件隶属于撤销表空间。如果修改Oracle数据库中的数据,那么就必须使用撤销段,撤销段用来临时存放修改前的旧数据,而撤销段通常存放在一个单独的撤销表空间中,这个撤销表空间所包含的数据文件就是撤销数据文件。

(3)用户数据文件。用户数据文件用于存放用户应用系统的数据,这些数据包括与应用系统有关的所有相关信息,例如,上述TBSP_1.DBF和TBSP_2.DBF文件就是一个具体应用系统的两个数据文件。

在上面的代码中并没有看到临时表空间所包含的数据文件,这是由于临时数据文件本身的特殊性,从Oracle 9i以后,Oracle将临时表空间所对应的临时数据文件与一般数据文件分开,要了解Oracle系统的临时数据文件信息,可以从dba_temp_files或v$tempfile数据字典中查询。

【例2.5】 通过查询dba_temp_files或v$tempfile数据字典来查看临时文件的信息,具体代码如下。(实例位置:资源包\TM\sl\2\3)

SQL> col file_name format a50;
SQL> col tablespace_name format a20;
SQL> select file_name,tablespace_name from dba_temp_files;

本例运行结果如图2.7所示。

图2.7 查看临时文件的信息

2.3.2 控制文件

控制文件是一个二进制文件,它记录了数据库的物理结构,其中主要包含数据库名、数据文件与日志文件的名字和位置、数据库建立日期等信息。控制文件一般在Oracle系统安装时或创建数据库时自动创建,控制文件所存放的路径由服务器参数文件SPFILEORCL.ORA的CONTROL_FILES参数值来指定。

由于控制文件存放有数据文件、日志文件等的相关信息,因此,Oracle实例在启动时必须访问控制文件。如果控制文件正常,实例才能加载并打开数据库;但若控制文件中记录了错误的信息,或者实例无法找到一个可用的控制文件,则实例无法正常启动。

当Oracle实例在正常启动时,系统首先要访问的是初始化参数文件SPFILE,然后Oracle为系统全局区(SGA)分配内存。这时,Oracle实例处于安装状态,并且控制文件处于打开状态;接下来Oracle会自动读出控制文件中的所有数据文件和日志文件的信息,并打开当前数据库中所有的数据文件和所有的日志文件以供用户访问。

每个数据库至少拥有一个控制文件,一个数据库可以同时拥有多个控制文件,但是一个控制文件只能属于一个数据库。控制文件内部除了存放数据库名及其创建日期、数据文件、日志文件等的相关信息之外,在系统运行过程中,还存放有系统更改号、检查点信息及归档的当前状态等信息。

Oracle数据库系统出于安全考虑,在安装Oracle数据库或创建数据库时,系统会自动创建2个或3个控制文件,每个控制文件记录相同的信息。这样可确保在数据库运行时,如果某个控制文件损坏,Oracle会自动使用另外一个控制文件,当所有控制文件都损坏时,系统将无法工作。

【例2.6】 通过查询v$controlfile数据字典来查看Oracle系统的控制文件信息,具体代码如下。(实例位置:资源包\TM\sl\2\4)

SQL> col name format a60;
SQL> select name from v$controlfile;

本例运行结果如图2.8所示。

图2.8 Oracle系统的控制文件信息

说明

当数据库的物理组成更改时,Oracle自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。

2.3.3 日志文件

日志文件的主要功能是记录对数据所做的修改,对数据库所做的修改几乎都记录在日志文件中。在出现问题时,可以通过日志文件得到原始数据,从而保证不丢失已有操作成果。Oracle的日志文件包括重做日志文件(Redo Log File)和归档日志文件(Archive Log File),它们是Oracle系统的主要文件,尤其是重做日志文件,它是Oracle数据库系统正常运行所不可或缺的。下面将介绍这两种日志文件。

1.重做日志文件

重做日志文件用来记录数据库所有发生过的更改信息(修改、添加、删除等信息)及由Oracle内部行为(创建数据表、索引等)而引起的数据库变化信息,在数据库恢复时,可以从该日志文件中读取原始记录。在数据库运行期间,当用户执行COMMIT命令(数据库提交命令)时,数据库首先将每笔操作的原始记录写入日志文件中,写入日志文件成功后,才把新的记录传递给应用程序,所以,在日志文件上可以随时读取原始记录以恢复某些数据。

技巧

通过对表或者整个表空间设定NOLOGGING属性,使基于表或表空间中所有的DML操作(如创建表、删除视图、修改索引等)都不会生成日志信息,这样就会减少日志信息的产生。

为了保障数据库系统的安全,每个Oracle实例都启用一个日志线程来记录数据库的变化。日志线程由若干“日志组”构成,而每个日志组又由一个或者多个日志文件构成。

【例2.7】 若要了解Oracle系统的日志文件信息,可以通过查询v$logfile视图来实现,代码如下。(实例位置:资源包\TM\sl\2\5)

SQL> col member for a50
SQL> select member from v$logfile;

本例运行结果如图2.9所示。

图2.9 Oracle系统的日志文件信息

Oracle系统在运行过程中产生的日志信息,首先被临时存放在系统全局区(SGA)的重做日志缓冲区中,当发出COMMIT命令(或日志缓冲区信息满1/3)时,日志写入(LGWR)进程将日志信息从重做日志缓冲区中读取出来,并将读取的日志信息写入日志文件组中序列号较小的文件里,一个日志组写满后接着写另外一个日志组。当LGWR进程将所有能用的日志文件都使用过一遍之后,它将再次转向第一个日志组重新覆写。

2.归档日志文件

在所有的日志文件被写入一遍之后,LGWR进程将再次转向第一个日志组进行重新覆写,这样势必会导致一部分较早的日志信息被覆盖掉,但Oracle通过归档日志文件解决了这个问题。

Oracle数据库可以运行在两种模式下,即归档模式和非归档模式。非归档模式是指在系统运行期间,所产生的日志信息不断地记录到日志文件组中,当所有重做日志组被写满后,又重新从第一个日志组开始覆写。归档模式就是在各个日志文件都被写满而即将被覆盖之前,先由归档(ARCH)进程将即将被覆盖的日志文件中的日志信息读出,并将读出的日志信息写入归档日志文件中,而这个过程又被称为归档操作。

在归档操作进行的过程中,LGWR进程需要等待ARCH进程的结束才能开始覆写日志文件,这样就延迟了系统的响应时间,而且归档日志文件本身又会占用大量的磁盘空间,这些都会影响系统的整体性能。所以在默认情况下,Oracle系统不采用归档模式运行。

【例2.8】 可以通过v$database视图来查看当前Oracle系统是否采用归档模式,代码如下。(实例位置:资源包\TM\sl\2\6)

SQL> col name format a30;
SQL> select dbid,name,log_mode from v$database;

本例运行结果如图2.10所示。

图2.10 查看当前Oracle系统是否采用归档模式

如果将Oracle数据库系统设置成在归档模式下运行,则可以通过服务器参数文件SPFILE的log_archive_dest参数来确定归档日志文件的所在路径。

【例2.9】 可以使用下面的语句来查询归档日志文件的所在路径,代码如下。(实例位置:资源包\TM\sl\2\7)

SQL> set pagesize 30;
SQL> show parameter log_archive_dest;

本例运行结果如图2.11所示。

图2.11 归档日志文件的所在路径

技巧

若显示SPFILE的指定参数的信息,则只需要使用SHOW PARAMETER+参数名即可。

2.3.4 服务器参数文件

服务器参数文件(Server Parameter File,SPFILE)是二进制文件,用来记录Oracle数据库的基本参数信息(如数据库名、控制文件所在路径、日志缓冲大小等)。数据库实例在启动之前,Oracle系统首先会读取SPFILE中设置的这些参数,并根据这些初始化参数来配置和启动实例。例如,设置标准数据块的大小(即参数DB_BLOCK_SIZE的值)、设置日志缓冲区的大小(即参数log_buffer的值)等,所以SPFILE非常重要。SPFILE在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora,sid为所创建的数据库实例名。

与早期版本的初始化参数文件INITsid.ora不同的是,SPFILE中的参数由Oracle系统自动维护,如果要对某些参数进行修改,则尽可能不要直接对SPFILE进行编辑,最好通过Oracle企业管理器(OEM)或ALTER SYSTEM命令来修改,所修改过的参数会自动写到SPFILE中。

1.查看服务器参数

用户可以通过如下两种方式查看数据库的服务器参数。

(1)查询视图v$parameter,可利用该动态性能视图来确定参数的默认值是否被修改过,以及是否可以用ALTER SYSTEM和ALTER SESSION命令修改。

【例2.10】 查询视图v$parameter中的name、value、ismodified列的值,代码如下。(实例位置:资源包\TM\sl\2\8)

SQL> col name for a30;
SQL> col value for a30;
SQL> select name,value,ismodified from v$parameter;

本例运行结果如图2.12所示。

图2.12 查询视图v$parameter

(2)可以使用SQL*Plus的SHOW PARAMETER命令显示服务器的参数。

【例2.11】 通过SHOW PARAMETER命令显示服务器参数,代码如下。

SQL> show parameter

本例运行结果如图2.13所示。

图2.13 显示服务器参数

2.修改服务器参数

修改数据库的服务器参数,主要通过Oracle企业管理器(OEM)或ALTER SYSTEM命令来实现。

(1)通过企业管理器OEM修改,首先使用system用户登录OEM,然后选择“服务器”页面中的“初始化参数”项,将打开如图2.14所示的“初始化参数”页面,在该页面的“值”列中就可以修改参数值,然后保存就可以。

图2.14 OEM中的初始化参数

(2)使用ALTER SYSTEM命令修改服务器参数。

【例2.12】 通过ALTER SYSTEM命令修改标准数据块的大小为4096B,代码及运行结果如下。

alter system set db_block_size=4096;

系统已更改。

2.3.5 密码文件、警告文件和跟踪文件

Oracle系统运行时,除了必要的数据文件、控制文件、日志文件及服务器参数文件外,还需要一些辅助文件,如密码文件、警告文件和跟踪文件,下面对这些辅助文件进行简单的介绍。

1.密码文件

密码文件是Oracle系统用于验证sysdba权限的二进制文件,当远程用户以sysdba或sysoper连接到数据库时,一般要用密码文件验证。

Oracle 11g(这里以发行版2为例)密码文件的默认存放位置在%dbhome_1%\database目录下,密码文件的命名格式为PWD<sid>,其中sid表示数据库实例名。创建密码文件既可以在创建数据库实例时自动创建,也可以使用ORAPWD.mp4工具手动创建,创建密码文件的命令格式如下。

C:\>ORAPWD FILE=<filename> PASSWORD=<password> ENTRIES=<max_users>

filename:表示密码文件名称。

password:表示设置internal/sys账户口令。

max_users:表示密码文件中可以存放的最大用户数,对应允许以sysdba/sysoper权限登录数据库的最大用户数。

创建了密码文件后,需要设置初始化参数remote_login_passwordfile来控制密码文件的使用状态,通常有3种状态值:NONE表示只要通过操作系统验证,就不用通过Oracle密码文件验证;SHARED表示多个数据库实例都可以采用此密码文件验证;EXCLUSIVE表示只有一个数据库实例可以使用此密码文件验证。

【例2.13】 创建一个密码文件,其sys口令为012345,代码如下。

C:\>ORAPWD FILE=E:\app\Admin\product\11.2.0\dbhome_1\database\PWDorcl.ora password=012345 entries
=40

2.警告文件

警告文件(即警告日志文件)是一个存储在Oracle系统目录下的文本文件(名称通常为alert_orcl.log),它用来记录Oracle系统的运行信息和错误信息。运行信息一般包括Oracle实例的启动与关闭、建立表空间、增加数据文件等;错误信息包括空间扩展失败、启动实例失败等。

当Oracle系统安装完毕后,其实例日常运行的基本信息都会记录在警告文件中。警告文件的路径可通过Oracle系统的BACKGROUND_DUMP_DEST参数值来查看,并且该参数值由服务器进程和后台进程写入。

【例2.14】 在v$parameter视图中查看当前实例的警告文件的路径,代码及运行结果如下。

注意

随着时间的推移,警告文件会越来越大,数据库管理员应该定期删除警告文件。

3.跟踪文件

跟踪文件包括后台进程跟踪文件和用户进程跟踪文件。后台进程跟踪文件用于记录后台进程的警告或错误消息。后台进程跟踪文件的磁盘位置由初始化参数BACKGROUND_DUMP_DEST确定,后台进程跟踪文件的命名格式为<sid>_<processname>_<spid>.trc,如orcl_cjq0_5172.trc。用户进程跟踪文件用于记载与用户进程相关的信息,它主要用于跟踪SQL语句。通过用户进程跟踪文件,可以判断SQL语句的执行性能。用户进程跟踪文件的位置由初始化参数USER_DUMP_DEST确定,用户进程跟踪文件的命名格式为<sid>_ora_<spid>.trc,如orcl_ora_4888.trc。

除了.trc文件之外,还有.trm文件。.trm文件为跟踪元数据文件,伴随着.trc文件产生,一个.trm对应一个.trc文件,.trm文件包含.trc文件的结构化信息。

【例2.15】 在v$parameter视图中查看当前实例的用户跟踪文件的路径,代码及运行结果如下。

SQL> select value from v$parameter where name = 'user_dump_dest';
VALUE
--------------------------------------------------
e:\app\administrator\diag\rdbms\orcl\orcl\trace

说明

每个后台进程都有对应的后台进程跟踪文件。

2.4 Oracle 11g服务器结构

Oracle服务器主要由实例、数据库、程序全局区和前台进程组成,如图2.15所示。其中,实例就是图2.15中的例程区域,用来提供管理数据库的功能;数据库就是图2.15中的数据库区域,由Oracle数据库文件组成,用来存储系统数据。

图2.15 Oracle服务器结构模型

实例可以进一步划分为系统全局区(SGA)和后台进程(PMON、SMON等)两部分,其中,SGA使用操作系统的内存资源,而后台进程需要使用CPU与内存资源;数据库(Database)中包含数据文件(Data File)、控制文件(Control File)和重做日志文件(Redo Log File),数据库文件存放在硬盘中;程序全局区(PGA)是一个非共享的内存区域,用于管理用户进程的私有资源;前台进程可以再划分为用户进程和服务器进程,它们需要使用CPU与内存资源。2.3节已经对数据库的3种物理文件进行过详细讲解,本节主要对实例、程序全局区和前台进程进行详细的讲解。

2.4.1 系统全局区

系统全局区(System Global Area,SGA)是所有用户进程共享的一块内存区域,也就是说,SGA中的数据资源可以被多个用户进程共同使用。SGA主要由高速数据缓冲区、重做日志缓冲区、共享池、大型池和Java池等内存结构组成。SGA随着数据库实例的启动而加载到内存中,当数据库实例关闭时,SGA区域也就消失了。

1.高速数据缓冲区

高速数据缓冲区中存放着Oracle系统最近访问过的数据块(数据块在高速缓冲区中也可称为缓存块)。当用户向数据库发出请求时(如检索某一条数据),如果在高速数据缓冲区中存在请求的数据,则Oracle系统会直接从高速数据缓冲区中读取数据并返回给用户,否则,Oracle系统会打开数据文件读取请求的数据。

若无法在高速数据缓冲区中找到所需要的数据,则Oracle首先从数据文件中读取指定的数据块到缓冲区,然后再从缓冲区中将请求的数据返回给用户。由于高速数据缓冲区被所有的用户所共享,只要数据文件中的某些数据块被当前用户或其他用户请求过,因此这些数据块就会被装载到高速数据缓冲区中。这样当任何用户再次访问相同的数据时,Oracle就不必再从数据文件中读取数据,而是可以直接将缓冲区中的数据返回给用户。经常或最近被访问的数据块会被放置到高速数据缓冲区前端,不常被访问的数据块会被放置到高速数据缓冲区的后端,当高速数据缓冲区填满时,会自动挤掉一些不常被访问的数据块。

以存取速度来看,内存的读取速度远快于物理硬盘,所以高速数据缓冲区的存在可大大降低对物理磁盘的读取频率,从而达到提高数据库服务器性能的目的。为了便于管理SGA的内存数据,Oracle把高速数据缓冲区分为以下3个部分。

脏数据区

脏数据区中存放着已被修改过的数据,这些数据等待被写入数据文件中。当一条更新或删除语句对某些数据块中的数据修改后,那么这些数据块就被标记为“脏”,然后等待提交命令并通过后台进程DBWR将其写入数据文件中。

空闲区

空闲区中的数据块不包含任何数据,这些数据块可以被写入数据,Oracle可以从数据文件中读取数据块,并将其存放到该区中。

保留区

保留区包含那些正在被用户访问的数据块和明确保留以作为将来使用的数据块(即缓存块),这些数据块将被保留在缓冲区中。

2.重做日志缓冲区

重做日志缓冲区用于存放对数据库进行修改操作时所产生的日志信息,这些日志信息在写入重做日志文件之前,首先存放到重做日志缓冲区中,然后,在检查点发生或重做日志缓冲区中的信息量到达一定峰值时,最后由日志写入(LGWR)进程将此缓冲区的内容写入到重做日志文件。

重做日志缓冲区的大小由LOG_BUFFER参数指定,该参数也可以在实例启动后动态修改。相对于高速数据缓冲区而言,重做日志缓冲区的大小对数据库性能的影响较小,通常较大的重做日志缓冲区能减少重做日志文件对I/O的读写次数,对数据库的整体性能有一定的提高。

3.共享池

共享池是SGA保留的内存区域,用于缓存SQL语句、PL/SQL语句、数据字典、资源锁、字符集以及其他控制结构等。共享池包含库高速缓冲区(LIBRARY CACHE)和字典高速缓冲区(DICTIONARY CACHE)。

(1)库高速缓冲区

库高速缓冲区是共享池的一部分,主要包括共享SQL区和私有SQL区两个组成部分。库高速缓冲区中存放最近用过的SQL语句、PL/SQL语句的文本和执行计划。当下一次执行相同的SQL语句或PL/SQL语句时,可以直接在库高速缓冲区中找到之前已生成的执行计划,而不需要再次解析相同的SQL语句或PL/SQL语句,从而提高系统执行效率。

每条被缓存的SQL或PL/SQL语句都被分成两个部分,分别被存放在共享SQL区和私有SQL区中。共享SQL区存放SQL或PL/SQL语句的语法分析结果和执行计划,如果以后要再次执行类似的语句,则可以利用共享SQL区中已缓存的语法分析结果和执行计划。私有SQL区存放SQL语句中的绑定变量、环境和会话等信息,这些信息属于执行该语句的用户的私有信息,其他用户则无法共享这些信息。

(2)字典高速缓冲区

用于存放Oracle系统内部管理所需要的数据字典信息,如用户名、数据对象和权限等。

共享池的内存空间大小是可以动态改变的,一般通过修改参数SHARED_POOL_SIZE的值来实现。

【例2.16】 修改Oracle共享池的内存空间大小为30MB,代码及运行结果如下。

SQL> alter system set shared_pool_size=30m;

系统已更改。

注意

Oracle共享池的空间不是越大越好,因为系统的内存资源是有限的,而且操作系统本身也要消耗一定的内存空间。


互动练习:改变数据库高速缓冲区的大小。

4.大型池

大型池在SGA区中不是必需的内存结构,只在某些特殊情况下,实例需要使用大型池来减轻共享池的访问压力,常用的情况有以下几种。

当使用恢复管理器进行备份和恢复操作时,大型池将作为I/O缓冲区使用。

使用I/O Slave仿真异步I/O功能时,大型池将被当作I/O缓冲区使用。

执行具有大量排序操作的SQL语句。

当使用并行查询时,大型池作为并行查询进程彼此交换信息的地方。

大型池的缓存区大小是通过LARGE_POOL_SIZE参数定义的,在Oracle 11g中,用户可以使用ALTER SYSTEM命令动态地修改其缓存区的大小。

【例2.17】 修改Oracle大型池的缓存区大小为16MB,代码及运行结果如下。

注意

如果在SGA区中没有设置大型池,则在实例需要时,Oracle系统会在共享池或PGA中分配一定的缓存空间,这样势必会影响到共享池或PGA的工作效率。

5.Java池

用来提供内存空间给Java虚拟机使用,目的是支持在数据库中运行Java程序包,其大小由JAVA_POOL_SIZE参数决定。

6.流池

Oracle流池用于在数据库与数据库之间进行信息共享。如果没有用到Oracle流,就不需要设置该池。流池的大小由参数STREAMS_POOL_SIZE决定。

2.4.2 程序全局区

程序全局区(Program Global Area,PGA)也可称作用户进程全局区,它的内存区在进程私有区而不是共享区中。虽然PGA是一个全局区,可以把代码、全局变量和数据结构都可以存放在其中,但区域内的资源并不像SGA一样被所有的用户进程所共享,而是每个Oracle服务器进程都只拥有属于自己的那部分PGA资源。

在程序全局区中,一个服务进程只能访问属于它自己的那部分PGA资源区,各个服务进程的PGA的总和即为实例的PGA的大小。通常PGA由私有SQL区和会话区组成。

1.私有SQL区

私有SQL区用于存储变量以及SQL语句运行时的内存结构信息,当每个用户连接到实例时,都会在实例中创建一个会话。这些会话可能会在SGA区中创建一个共享SQL区,但在PGA区中可能会创建多个私有SQL区。把一个私有SQL区与对应的共享SQL区合并在一起,就可以获得一条SQL语句的完整缓存数据。

另外,每个会话的私有SQL区可以再分为静态区和动态区两部分。静态区的信息在会话过程中保持不变,只有当会话结束时,静态区才会被释放掉;而动态区的信息在整个会话过程中是不断变化的,一旦SQL语句指定完毕,即使会话还没有结束,动态区就被释放掉。

2.会话区

会话区用于存放用户的会话信息(如登录用户名)。如果数据库处于共享服务器连接模式下,则会话区将位于SGA中,而不是PGA中,这点需要用户特别注意。

查看程序全局区的信息可以通过显示PGA参数的内容来实现。

【例2.18】 显示当前用户进程的PGA信息,代码及运行结果如下。

2.4.3 前台进程

前台进程包括用户进程和服务器进程,它不属于实例的一部分,但是用户在不知不觉中经常会用到它,使用前台进程能够实现用户与实例的沟通,下面对这两种前台进程进行讲解。

1.用户进程

用户进程是指那些能够产生或执行SQL语句的应用程序,无论是SQL*Plus,还是其他应用程序,只要是能生成或执行SQL语句,都被称作用户进程。

在用户进程中有两个非常重要的概念:连接和会话。连接是一个用户进程与实例之间建立的通信渠道,这个渠道可以通过操作系统上的相关通信机制或网络连接来实现。会话是指在用户进程与实例之间建立连接后形成的用户与实例之间的交互方式,一般是用户发出请求,数据库实例为用户返回响应消息的方式。例如,用户在SQL*Plus中发出connect system/1qaz2wsx的请求命令,若用户名和密码都正确,则数据库实例返回“已连接”的响应消息。

2.服务器进程

服务器进程是用于处理用户会话过程中向数据库实例发出的SQL语句或SQL*Plus命令,它可以分为专用服务器模式和共享服务器模式。在专用服务器模式下,每个用户进程都有一个专用的服务器进程,这个服务器进程代表用户进程执行SQL语句,必要时还可以回传执行结果给用户进程。在共享服务器模式下,每个用户进程不直接与服务器进程连接,而是连接到分派程序,每个分派程序可以同时连接多个用户进程。

2.4.4 后台进程

Oracle后台进程是一组运行于Oracle服务器端的后台程序,是Oracle实例的重要组成部分。这组后台进程有若干个,它们分工明确——分别完成不同的系统功能,如图2.16所示。其中SMON、PMON、DBWR、LGWR和CKPT这5个后台进程必须正常启动,否则将导致数据库实例崩溃。此外,还有很多辅助进程,用于实现相关的辅助功能,如果这些辅助进程发生问题,只是某些功能受到影响,一般不会导致数据库实例崩溃。下面对其中的主要进程进行讲解。

图2.16 主要后台进程

1.数据写入进程

数据写入(DBWR)进程的主要任务是负责将内存中的“脏”数据块回写到数据文件中。所谓的“脏”数据块是指高速数据缓冲区中被修改过的数据块,这些数据块的内容与数据文件的数据块内容不一致。但DBWR并不是随时将所有的“脏”数据块都写入数据文件,只有满足一定的条件时,DBWR进程才开始成批量地将“脏”数据块写入数据文件,Oracle这样做的目的是尽量减少I/O操作,提高Oracle服务器性能。通常在以下几种情况发生时,DBWR进程会将“脏”数据块写入数据文件。

当用户进程执行插入或修改等操作时,需要将“新数据”写入到高速数据缓冲区,如果在高速数据缓冲区中没有找到足够用的空闲数据块来存放这些“新数据”,这时,Oracle系统将启动DBWR进程并将“脏”数据块写入到数据文件,以获得空闲数据块来存储这些“新数据”。

检查点进程启动后,它会强制要求DBWR将某些“脏”数据块写入数据文件。

当“脏”数据块在高速数据缓冲区中存放超过3秒钟,DBWR进程会自行启动并将某些“脏”数据块写入数据文件。

在某些比较繁忙的应用系统中,可以修改服务器参数文件SPFILE的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程。但是DBWR进程的数量不应当超过系统处理器的数量,否则多余的DBWR不但无法发挥作用,反而会耗费系统资源。

2.检查点进程

检查点(CKPT)进程可以看作是一个事件,当检查点事件发生时,CKPT会要求DBWR将某些“脏”数据块回写到数据文件。当用户进程发出数据请求时,Oracle系统从数据文件中读取需要的数据并存放到高速数据缓冲区中,用户对数据的操作是在缓冲区中进行的。当用户操作数据时,就会产生大量的日志信息并存储在重做日志缓冲区,当Oracle系统满足一定条件时,日志写入(LGWR)进程会将日志信息写入重做日志文件组中,当发生日志切换时(写入操作正要从一个日志文件组切换到另一组时),就会启动检查点进程。

另外,数据库管理员(DBA)还可以通过修改初始化参数文件SPFILE中的CHECKPOINT_PROCESS参数为TRUE来启动检查点进程。

3.日志写入进程

日志写入(LGWR)进程用于将重做日志缓冲区中的数据写入重做日志文件。Oracle系统首先将用户所做的修改日志信息写入日志文件,然后再将修改结果写入数据文件。

Oracle实例在运行中会产生大量日志信息,这些日志信息首先被记录在SGA的重做日志缓冲区中,当发生提交命令,或者重做日志缓冲区的信息满1/3,或者日志信息存放超过3秒钟时,LGWR进程就将日志信息从重做日志缓冲区中读出并写入日志文件组中序号较小的文件中,一个日志组写满后接着写另外一组。当LGWR进程将所有的日志文件都写过一遍之后,它将再次转向第一个日志文件组重新覆盖,如图2.17所示。当LGWR进程写满一个日志文件组而转向写另外一组时,称之为日志切换。

图2.17 通过LGWR写日志文件

4.归档进程

归档(ARCH)进程是一个可选择的进程,只有当Oracle数据库处于归档模式时,该进程才可能起到作用。若Oracle数据库处于归档模式,当各个日志文件组都被写满而即将被覆盖之前,先由ARCH把即将被覆盖的日志文件中的日志信息读出,然后再把这些“读出的日志信息”写入到归档日志文件中,如图2.18所示。

图2.18 通过ARCH写归档文件

当系统比较繁忙而导致LGWR进程处于等待ARCH进程时,可通过修改LOG_ARCHIVE_MAX_PROCESSES参数启动多个归档进程,从而提高归档写磁盘的速度。

5.系统监控进程

系统监控(SMON)进程是在数据库系统启动时执行回复工作的强制性进程。例如,在并行服务器模式下,SMON可以回复另一条处于失败的数据库,使系统切换到另外一台正常的服务器上。

6.进程监控进程

进程监控(PMON)进程用于监控其他进程的状态,当有进程启动失败时,PMON会清除失败的用户进程,释放用户进程所用的资源。

7.锁进程

锁(LCKN)进程是一个可选进程,并行服务器模式下可以出现多个锁定进程以利于数据库通信。

8.恢复进程

恢复(RECO)进程是在分布式数据库模式下使用的一个可选进程,用于数据不一致时进行恢复工作。

9.调度进程

调度(DNNN)进程是一个可选进程,在共享服务器模式下使用,可以启动多个调度进程。

10.快照进程

快照(SNPN)进程用于处理数据库快照的自动刷新,并通过DBMS_JOB包运行预定的数据库存储过程。

以上讲解了Oracle 11g中的若干个典型进程,不同版本Oracle的后台进程也不同,默认情况下,Oracle 11g会启动200多个后台进程。

【例2.19】 从v$bgprocess数据字典中查询当前实例进程信息,代码如下。(实例位置:资源包\TM\sl\2\9)

SQL> set pagesize 50;
SQL> select name,description from v$bgprocess;

本例运行结果如图2.19所示。

图2.19 当前实例进程信息

互动练习:Oracle执行SQL查询语句的步骤。

2.5 数据字典

数据字典是Oracle存放关于数据库内部信息的地方,用来描述数据库内部的运行和管理情况。例如,一个数据表的所有者、创建时间、所属表空间、用户访问权限等信息,这些信息都可以在数据字典中查找到。当用户操作数据库遇到困难时,就可以通过查询数据字典来提供帮助信息。

2.5.1 Oracle数据字典简介

Oracle数据字典的名称由前缀和后缀组成,使用下画线“_”连接,其代表的含义如下。

dba_:包含数据库实例的所有对象信息。

v$_:当前实例的动态视图,包含系统管理和系统优化等所使用的视图。

user_:记录用户的对象信息。

gv_:分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图。

all_:记录用户的对象信息机被授权访问的对象信息。

2.5.2 Oracle常用数据字典

虽然通过Oracle企业管理器(OEM)操作数据库比较方便,但它不利于读者了解Oracle系统的内部结构和应用系统对象之间的关系,所以建议读者尽量使用SQL*Plus来操作数据库。为了方便读者了解Oracle系统内部的对象结构和进行高层次的数据管理,下面给出最常用的数据字典及其说明。

1.基本数据字典

基本数据字典主要包括描述逻辑存储结构和物理存储结构的数据表,另外,还包括一些描述其他数据对象信息的表,如dba_views、dba_triggers、dba_users等。基本数据字典及其说明如表2.1所示。

表2.1 基本数据字典及其说明

2.常用动态性能视图

Oracle系统内部提供了大量的动态性能视图,之所以说是“动态”,是因为这些视图的信息在数据库运行期间会不断地更新。动态性能视图以v$作为名称前缀,这些视图提供了关于内存和磁盘的运行情况,用户只能进行只读访问而不能修改它们。常用的动态性能视图及其说明如表2.2所示。

表2.2 常用动态性能视图

上面介绍了Oracle数据字典的基本内容,实际上Oracle数据字典的内容非常丰富,这里因篇幅有限,不能一一列举,需要读者在学习和工作中逐渐积累。运用好数据字典技术,可以使用户能够更好地了解数据库的全貌,这样对于数据库优化、管理等有极大的帮助。

注意

Oracle数据字典是一个不断发展和变化的内部表,读者在参考某些资料时,要注意所使用的数据库版本是否与资料内容一致。

2.6 小结

Oracle体系结构是一个复杂的结构,了解Oracle体系结构对于管理数据库很有帮助。本章重点讲解了逻辑存储结构(包括数据块、数据区、段、表空间)和物理存储结构(包括数据文件、控制文件、日志文件、参数文件、密码文件等)的组成。另外,本章最后还对服务器结构(SGA、PGA、前台进程、后台进程)和数据字典进行了详细介绍。

2.7 实践与练习

1.尝试通过dba_segments数据字典查询数据库中所有段的存储空间信息。

2.尝试通过v$datafile动态性能视图查询数据库所使用的数据文件信息。