第4章 Oracle数据库结构
本章将介绍Oracle数据库的体系结构、服务器结构、Oracle数据库文件及后台进程。
4.1 Oracle体系结构
数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。Oracle数据库是一个逻辑概念,而不是一个运行数据库服务的计算机系统或一台WINSERVER/UNIX的Oracle服务器。
4.1.1 基本术语
初学者往往混淆Oracle实例、Oracle数据库和Oracle服务器等名次,下面分别对这些术语进行解释。
1.Oracle实例/ Oracle数据库
一般Oracle数据库(Oracle Database)可以分为两部分。
(1)实例(Instance)
实例是一个非固定的、基于内存的基本进程与内存结构。当服务器关闭后,实例也就不存在了。
(2)数据库(Database)
数据库指的是固定的、基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等。一般情况下,Oracle数据库都是一个数据库包含一个实例,如图4-1所示。
图4-1 数据库中包含一个实例
2.数据库服务器
数据库服务器(Database Server)一般指的是数据库各软件部件(如sqlplus,OEM,EXP/IMP等)和实例及数据库3个主要部分,是由安装在服务器上的所有软件(包括各种类型的文件)及启动成功后的实例组成的。
4.1.2 体系结构图解
Oracle数据库的总体体系结构如图4-2所示。从图中可以看出,SQL命令从客户端发出后,由Oracle的服务器进程进行响应,在内存区域中进行语法分析、编译、执行,将修改后的数据写入数据库文件,数据库的修改信息写入日志文件,再将SQL的执行结果返回给客户端。
图4-2 总体体系结构
4.1.3 表空间与数据文件
在Oracle系统中,表空间和数据文件是Oracle数据库结构的基本要素。下面分别介绍表空间和数据文件。
1.表空间
在Oracle数据库系统中,用于存放数据库表、索引、回滚段等对象的磁盘逻辑空间叫表空间(tablespace),如图4-3所示。
图4-3 表空间
一般在完成Oracle系统的安装并创建Oracle实例后,Oracle系统自动建立多个表空间。下面是Oracle 11g版本默认创建的主要表空间。
(1)SYSTEM表空间
SYSTEM表空间用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。不赞成将用户创建的表、索引等存放在SYSTEM表空间中。SYSTEM表空间对应的数据文件是system01.dbf,如果表空间对应的数据文件比较小,也可以追加另外一个新的数据文件,如图4-4所示的SYSTEM表空间对应system01.dbf和system02.dfb两个数据文件。
(2)SYSAUX表空间
SYSAUX表空间是Oracle 11g新增加的表空间,主要用于存放Oracle系统内部的常用样例用户的对象,如存放CRM用户的表和索引等。SYSAUX表空间一般不存储用户的数据,由Oracle系统内部自动维护。该表空间对应的数据文件为sysaux01.dbf。
(3)撤销表空间
撤销表空间(Undo Tablesapce)用于存储撤销信息的表空间。当我们对数据库表进行修改(包括INSERT,UPDATE,DELETE操作)时,Oracle系统自动使用撤销表空间来临时存放修改前的数据(Before Image)。当所做的修改操作完成并提交(Commit)后,Oracle系统可根据需要保留修改前数据时间长短来释放撤销表空间的部分空间。一般在创建Oracle实例后,Oracle系统自动创建一个名字为UNDOTBS1的撤销表空间,撤销表空间对应的数据文件为UNDOTBS01.DBF。
(4)USERS表空间
USER是Oracle建议用户使用的表空间,可以在这个表空间上创建各种对象,如创建表、索引等。Oracle的基本样例用户SCOTT的对象就存放在USERS表空间中。一般在创建Oracle实例完成后,USERS表空间对应的数据文件是USERS01.DBF。
除了Oracle系统默认创建的表空间外,用户可根据应用系统的规模及其所要存放的对象类型创建多个表空间,以区分用户数据与系统数据、索引和数据。此外,不同应用的数据应将不同表空间的文件放在不同的盘上,减少I/O冲突。
2.数据文件
数据文件(Datafile)是用于保存用户应用数据和Oracle系统内部数据的文件。Oracle数据库由表空间组成,每个表空间可以包含一个或者多个数据文件,如图4-4所示。
图4-4 表空间可以包含一个或者多个数据文件
一般来说,可以在创建表空间时创建一个或多个数据文件,也可以对已存在的表空间追加新的数据文件。数据文件可以存放下面两种类型的数据。
(1)系统数据
管理用户数据和Oracle系统本身的数据,如用户建立的表的名字、列的名字及字段类型等属于用户数据,这些数据自动被存放在系统表空间对应的system01.dbf文件中;而Oracle系统内部的数据字典、表,如DBA_USERS,DBA_DATA_FILES等所存放的数据属于Oracle系统的内部数据,这些数据也存放在系统表空间对应的system01.dbf文件中。
(2)用户数据
用户数据是指用户应用系统的数据,包括与应用系统有关的所有相关信息,如某市劳动局的医疗保险系统中参保单位信息、参保职工信息、医疗支付信息等。
示例1:查询当前数据库的所有表空间及其对应的数据文件。
SQL> col file_name for a50; SQL> set linesize 140; SQL> select file_name, tablespace_name, bytes from dba_data_files; FILE_NAME TABLESPACE_NAME BYTES ---------------------------- -------------------- ------------------------------------ /oratest/app/Oracle/oradata/orcl/users01.dbf USERS 5242880 /oratest/app/Oracle/oradata/orcl/undotbs01.dbf UNDOTBS1 131072000 /oratest/app/Oracle/oradata/orcl/sysaux01.dbf SYSAUX 672399360 /oratest/app/Oracle/oradata/orcl/system01.dbf SYSTEM 734003200 /oratest/app/Oracle/oradata/orcl/example01.dbf EXAMPLE 104857600 SQL>
从上面给出的图示和查询结果可以看出,表空间和数据文件是一对不可分离的数据库实体,具有以下特点:
◎ 表空间是一个数据库的逻辑区;
◎ 每个表空间由一个或多个数据文件组成;
◎ 一个数据文件只能属于一个表空间。
4.1.4 临时表空间与临时文件
临时表空间(Temporary Tablespace)是Oracle系统用于存放与排序有关的特殊表空间,临时表空间相当于数据库系统的一块白板。当操作中需要进行排序时,Oracle系统就将排序的数据临时存放在该表空间内,排序处理完成后即可释放排序数据所占的空间,因此称之为临时表空间。与一般的永久表空间一样,临时表空间也对应一个或者多个临时文件(Tempfile)。从Oracle 9i以后,Oracle将临时表空间所对应的临时数据文件与一般数据文件分开,要了解数据库实例当前的临时表空间和临时数据文件的信息,可以从DBA_TEMP_FILES数据字典中查询。
示例2:从DBA_TEMP_FILES数据字典中查询临时表空间信息。
SQL> select tablespace_name ,file_name from dba_temp_files; TABLESPACE_NAME FILE_NAME ------------------- ------------------------------------------------------------------- TEMP /oratest/app/Oracle/oradata/orcl/temp01.dbf SQL>
4.1.5 Oracle存储结构介绍
无论是普通的表空间还是临时表空间,当我们创建表空间时至少需要创建一个以上的数据文件,Oracle创建数据文件时,实际上是将磁盘的操作系统块重新格式化成Oracle数据块,并且每个Oracle数据块都有唯一的标识。一般Oracle数据块是操作系统块的倍数,如操作系统块大小为2048B,而Oracle数据块大小为8192B(DB_BLOCK_SIZE=8192),则表示Oracle数据块由4个操作系统块构成。如图4-5所示。
图4-5 Oracle存储结构
从图4-5中可以看出,我们可以在Oracle实例上创建多个表空间,每个表空间由一个或多个数据文件(物理文件)组成;而数据文件由多个操作系统块构成(图4-5右侧)。
一般地,我们在设计数据库结构时需要将表、索引或簇(Cluster)存储到一个已存在的表空间上,而表、索引或簇都是占用空间的对象,Oracle把占空间的对象统一称为段(Segment)。段是由多个区间(Extent)构成;而区间是由多个连续(块的编号地址相邻)的Oracle数据块构成。所以,在Oracle系统中,数据块是一个基本的处理单位。
4.1.6 控制文件
控制文件是一个存储Oracle实例信息、数据文件和日志文件信息的内部二进制文件。控制文件一般在Oracle系统安装时自动创建,控制文件所存放的路径由服务器参数文件SPFILEsid.ora的control_files参数值来确定。
由于控制文件存放有数据文件、日志文件等信息,因此,Oracle实例在启动时必须访问控制文件。实际上,当Oracle实例在正常启动时,系统首先要访问的是初始化参数文件SPFILE;然后,Oracle为系统全局区(SGA)分配内存,这时,Oracle实例处于安装状态,控制文件处于打开状态;接下来,Oracle会自动读出控制文件中的所有数据文件和日志文件信息,并打开所有数据文件及所有日志文件信息以便用户访问。
控制文件内部除了存放Oracle实例及创建日期、数据文件、日志文件外,在系统运行过程中,还存放有系统更改号、检查点信息及归档的当前状态等信息。如果在Oracle环境启用RMAN备份,控制文件中会存放RMAN的备份信息。
Oracle数据库系统出于安全考虑,在安装Oracle数据库或者创建实例时,系统会自动创建2个或3个控制文件,每个控制文件记录相同的信息。这样可确保在数据库运行时,如果某个控制文件损坏,Oracle会自动使用另外一个控制文件,当所有控制文件都损坏时,系统将不能工作。
为了Oracle系统的安全,建议在系统安装时指定多个控制文件,并将它们存放在不同的磁盘路径上。如果一个数据库实例的控制文件太少,建议数据库管理员创建新的控制文件。下面的例子是查询数据库实例所包含的控制文件路径信息。
示例3:从V$CONTROLFILE数据字典中查询控制文件信息。
1.首先查询该视图的结构
SQL> desc v$controlfile; Name Null? Type --------------------------------------------- ------ -------------------------------- STATUS VARCHAR2(7) NAME VARCHAR2(513) IS_RECOVERY_DEST_FILE VARCHAR2(3) BLOCK_SIZE NUMBER FILE_SIZE_BLKS NUMBER
2.查询控制文件的信息
SQL> set linesize 120; SQL> col name for a100; SQL> select name ,status from v$controlfile; NAME STATUS ------------------------------------------------------------------------------ /oratest/app/Oracle/oradata/orcl/control01.ctl /oratest/app/Oracle/oradata/orcl/control02.ctl /oratest/app/Oracle/oradata/orcl/control03.ctl SQL>
4.1.7 日志文件
Oracle日志文件分为重做日志文件(Redo Log File)和归档日志文件,它们是Oracle系统的主要文件之一,特别是重做日志文件,是Oracle数据库系统正常提供服务所不可或缺的。下面简单介绍这两种文件。
1.日志文件
重做日志文件也叫联机重做日志文件(Online Redo Log File),用来记录数据库所有发生过的交易(Transaction)的信息及由Oracle内部行为而引起的数据库变化信息。在数据库恢复时,可以从该日志文件读出原来交易的数据。在数据库运行期间,当用户发出COMMIT命令时,数据库会将每笔交易记录到日志文件中,写入日志文件成功后,才把完成信息传给用户程序,所以,在日志文件上可以随时读出信息以恢复某些交易数据。
对表或者整个表空间设定NOLOGGING属性时,基于表或表空间中所有表的DML操作都不会生成日志信息,当然也就减少了日志信息的产生。
为了确保数据库系统的安全,每个Oracle实例用一个日志线程(Thread)来记录数据库的变化。日志线程由若干日志组构成,日志组又由一个或者多个日志成员(MEMBER)构成(当然一个日志组也可只包括一个成员)。
可以用下面的实例查询数据库实例所包含的日志文件。
示例4:从V$LOGFILE数据字典中查询临时表空间信息。
SQL> COL MEMBER FOR A50; SQL> select GROUP#, STATUS, MEMBER from v$logfile; GROUP# STATUS MEMBER ---------- ------- -------------------------------------------------- 3 /oratest/app/Oracle/oradata/orcl/redo03.log 2 /oratest/app/Oracle/oradata/orcl/redo02.log 1 /oratest/app/Oracle/oradata/orcl/redo01.log SQL>
Oracle实例在运行中产生日志信息,首先被记录在SGA的日志缓冲区中,当发出COMMIT命令(或者日志缓冲区信息满1/3或者3秒过去)时,LGWR进程将日志信息从日志缓冲区读出并写到日志文件组序列号小的文件中,一个日志组写满后接着写另外一组。当LGWR进程将所有能用的日志文件都使用过一次后,它将再次转向第一个日志组重新覆写,如图4-6所示。Oracle用日志文件序列号来跟踪不同的日志文件。当LGWR进程写满一个日志组而转向写另外一组时,称之为日志切换。当日志组发生切换时,Oracle会警告日志文件(alter_sid.log)记录相应的信息,以帮助用户观察各日志组的使用情况。
图4-6 日志切换
2.归档日志文件
Oracle系统运行有两种模式——归档模式和非归档模式。非归档模式就是在系统运行期间,所产生的日志信息不断地记录到各日志文件组中,当所有重做日志组被写满后又重新从第一个日志组开始覆写日志信息内容。
归档模式就是在各日志文件(成员)都写满而即将要被覆盖前,先由归档进程(ARCH)将即将被覆盖的日志文件中的日志信息读出并写到归档日志文件中,以便以后恢复操作时查找,如图4-7所示。
在默认情况下,Oracle系统不采用归档模式运行,这主要是因为归档模式会给系统带来一定的性能问题。下面是查看当前Oracle系统是否采用归档模式的语句。
图4-7 归档模式
示例5:从V$DATABASE数据字典中查询数据库是否是归档模式。
SQL> select dbid,name,log_mode from v$database; DBID NAME LOG_MODE ---------- ---------- ---------------------------------------- 1163896126 ORCL NOARCHIVELOG
如果将数据库系统设置为归档模式下运行,归档日志文件所在路径由服务器参数文件SPFILE的log_archive_dest参数确定,可用下面的语句查询归档日志文件所在路径。
示例6:显示归档文件所在路径。
SQL> set pagesize 60; SQL> show parameter log_archive_dest; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest string log_archive_dest_1 string log_archive_dest_10 string log_archive_dest_2 string log_archive_dest_3 string log_archive_dest_4 string log_archive_dest_5 string log_archive_dest_6 string log_archive_dest_7 string log_archive_dest_8 string log_archive_dest_9 string log_archive_dest_state_1 string enable log_archive_dest_state_10 string enable log_archive_dest_state_2 string enable log_archive_dest_state_3 string enable log_archive_dest_state_4 string enable log_archive_dest_state_5 string enable log_archive_dest_state_6 string enable log_archive_dest_state_7 string enable log_archive_dest_state_8 string enable log_archive_dest_state_9 string enable
4.1.8 服务器参数文件
服务器参数文件SPFILE(Server Parameter File)是二进制文件,用来记录Oracle实例的基本参数信息,包括数据库实例名(db_name)、控制文件(control_files)所在路径、进程(process)等。服务器参数文件在Oracle系统安装时以默认的方式创建,文件命名为SPFILEsid.ora,其中,sid为数据库实例名。
与旧版的初始化参数文件INITsid.ora不同的是,SPFILE中的参数由Oracle系统自动维护,如果要对某些参数进行修改,则不能直接多SPFILE进行编辑,而只能通过企业管理器(Oracle Enterprise Manager)或ALTER SYSTEM命令来修改,所修改过的参数自动写到SPFILE中。
SPFILE中某些参数可以通过调整来改善数据库的性能,但有些参数必须在Oracle公司全球支持人员的指导下进行。
另外需要指出的是:SPFILEsid.ora文件也可以用编辑器修改,前提是要确保其格式不被破坏,所以建议不要用编辑器直接修改以免造成文件的不可用。
4.1.9 密码文件/跟踪文件/警告日志
Oracle系统运行时,除了必须的数据文件、临时文件、控制文件、日志文件、归档日志文件及服务器参数文件外,还有一些辅助文件,下面进行简单的介绍。
1.密码文件
密码文件(或称口令文件)是Oracle系统用于验证sysdba权限的二进制文件。当远程用户以sysdba或sysoper连接到数据库时,一般要用口令文件验证。值得注意的是,remote_login_passwordfile应设置为NONE或SHARED。NONE表示只要通过操作系统验证,就不用通过Oracle口令文件的验证;SHARED表示采用口令文件验证(SHARED与EXCLUSIVE一样)。
密码文件的创建一般要在操作系统下用orapwd命令来完成
示例7:创建一个密码文件,其SYS口令是change_on_install_new。
$orapwd file=$Oracle_home/Oracle/intra.passwd Password=change_on_install_new entries=30
2.警告日志文件
警告日志文件是一个存储在Oracle系统目录下的文本文件,用来在数据库系统运行期间记录例行的信息与错误信息。例行的信息一般包括Oracle实例打开与关闭、建立表空间、增加数据文件等;错误信息包括空间扩展失败、各种错误等。阅读警告日志文件信息时,数据库管理员应注意Oracle实例出现过的错误、异常环境及一些永久性操作等。
一般当Oracle安装完成后,Oracle实例日常运行的基本信息都会记录到警告日志文件中。警告日志文件的文件名为alert_sid.log,其中sid是数据库实例的名字。警告日志文件的路径可由Oracle系统的BACKGROUND_DUMP_DEST参数查到。
示例8:查询当前数据库实例的警告日志文件的路径。
SQL> Select value from v$parameter where name='background_dump_dest'; VALUE -------------------------------------------------------------------------------------- /oratest/app/Oracle/diag/rdbms/orcl/orcl/trace SQL>
3.后台跟踪文件和用户跟踪文件
跟踪文件是Oracle实例在系统出现异常时,由Oracle系统自动创建的文本文件,与警告文件一起构成完整的故障信息描述体系。警告日志包括错误事件的说明,而随之产生的跟踪文件记录了该错误的详细信息。
要得到解决Oracle实例错误的方法,除了要阅读警告日志文件的错误信息外,还要认真分析相关的跟踪文件所记录的内容。建议Oracle管理员掌握阅读警告日志文件的错误信息和跟踪文件错误信息的方法。
跟踪文件的路径由服务器参数文件SPFILEsid.ora的USER_DUMP_DEST参数指定。如果系统在安装时遵循Oracle的OFA目录结构,那么在UNIX环境下,当Oracle系统发生错误时,跟踪文件会被记录在$ORACLE_BASE/admin/SID/udump目录下。这里,SID是Oracle的实例名。
示例9:查询当前数据库实例用户跟踪文件的路径。
SQL> Select value from v$parameter where name='user_dump_dest'; VALUE -------------------------------------------------------------------------------------- /oratest/app/Oracle/diag/rdbms/orcl/orcl/trace SQL>
4.2 Oracle服务器结构
前面介绍了与Oracle系统有关的各种文件的概念,从管理角度来看,有必要明白Oracle服务器和Oracle实例的关系。
4.2.1 Oracle服务器与Oracle实例
Oracle服务器(Oracle Server)包含所有必要的文件、进程及内存结构。进程包括必需的和可选的两种,可选的进程在需要时才启用,如归档进程ARCH。Oracle服务器由Oracle实例和Oracle数据库组成,如图4-2所示。Oracle服务器至少包含一个或者几个实例。
Oracle实例(Oracle instance)由SGA和后台进程组成,每一个Oracle实例都有自己的SGA和独立的Oracle进程集。图4-2显示了Oracle数据库与各文件的关系。
从图4-2可以看出,参数文件(Parameter file)、口令文件(Password file)及归档日志文件(Archive log files)是一般文件;而数据文件(Data files)、控制文件(Control files)、联机重做日志文件(Redo Log files)是必需文件。这三种文件是通过DBWR和LGWR等后台进程来操作的,也就是说,使用Oracle数据库(Database)时,只能通过发出SQL语句来实现对Oracle数据库的操作。
4.2.2 物理结构与逻辑结构的关系
从管理角度来说,数据文件的管理是最关键和最重要的。将数据文件看成是物理文件,而对应的表空间看成是逻辑存储,如图4-8所示。
图4-8 物理结构与逻辑结构关系
从物理上看,多个数据文件(和控制文件及日志文件一起)组成数据库(Database);数据库(Database)通过实例(Instance)来管理。从图4-8中右半部分可以看出,表空间至少包含一个以上的数据文件;表空间用于存放表、索引、Cluster等对象,这些占空间的对象在Oracle系统标为段(Segment);而段(如一个具体的表)在表空间中实际上是由很多扩展(Extent或叫区间)构成的;而扩展则是由多个Oracle块组成的。可以这样理解:
◎ Oracle块是最小处理单位(在安装时选择)。
◎ Oracle块可存放段的多个数据,如存放表的多个行。
◎ 一个占空间的对象称为段,段根据需要而每次占用多个块,叫做扩展(Extent)。
◎ 占空间的对象(如表)每次的扩展累加在一起叫做段。
◎ 段在Oracle里是占用表空间的具体对象(可从DBA_SEGMENS字典中查)。
4.2.3 系统全局区(SGA)
系统全局区(System Global Area)主要由三部分构成,分别是数据缓冲区、日志缓冲区与共享池。下面分别进行解释。
1.数据高速缓冲区(Data Buffer Cache)
数据高速缓冲区中存放着Oracle系统最近使用过的数据块(即用户的高速缓冲区),当把数据写入数据库时,它以数据块为单位进行读写;当数据高速缓冲区填满时,会自动去掉一些不常被访问的数据。如果用户要查的数据不在数据高速缓冲区,Oracle会自动从硬盘中读取。数据高速缓冲区有3种类型。
◎ 脏区(Dirty Buffers):包含已经改变过并需要写回数据文件的数据块。
◎ 自由区(Free Buffers):不包含任何数据,并且可以被再次写入的区,Oracle可以将从数据文件中读出的数据块存放在该区。
◎ 保留区(Pinned Buffers):此区包含正在处理的或明确保留以作将来使用的区。
◎ Oracle将缓冲池分为3个区(使用多个缓冲池特性时)。
◎ KEEP缓冲池(Keep buffer pool):在内存中保留数据块,而且这些数据块在内存中不会被挤掉。
◎ RECYCLE缓冲池:循环使用的缓冲池,表示不再需要所清除的内存块。
◎ DEFAULT缓冲池:包含已经分配的块。
2.重做日志缓冲区(Redo Log Buffer)
Oracle数据库系统在处理事务时会产生日志信息,这些日志信息在记录到重做日志文件(恢复工作需要使用联机重做日志)之前,必须首先放到重做日志缓冲区(Redo Log Buffer)中。然后,在检查点发生或日志缓冲区达到一定的块数量时,由日志写入进程(LGWR)。最后将此缓冲区的内容写入重做日志文件。
3.共享池(Shared Pool)
共享池是SGA保留的区,用于存储SQL、PL/SQL存储过程、包、数据字典、锁、字符集、安全属性等。共享池包含库高速缓冲区(Library Cache)和字典高速缓冲区(Dictionary Cache)。
(1)库高速缓冲区(Library Cache),是共享池的一部分,包括:
◎ 共享SQL区(Shared Pool Area)
◎ 私有SQL区(Private Pool Area)
◎ PL/SQL存储过程及包(PL/SQL Procedure and Package)
◎ 控制结构
(2)字典高速缓冲区(Data Dictionary Cache),用于存放Oracle系统管理自身需要的所有信息,包括登录的用户名、用户对象、权限等。
4.大池(Large Pool)
在SGA中,大池是一个可选的缓冲区,管理员可以根据需要对其进行配置。大池还可以提供一个大的区以供数据库的备份与恢复之类的操作使用。
4.2.4 后台进程
Oracle后台进程是指运行于Oracle服务器端的后台程序,是Oracle实例的一部分。它们是一组分工明确、分别完成不同功能的进程。一般情况下,Oracle有如下进程。
1.数据库写入器(DBWn)
数据库写入器(Database Writer)的任务是将修改后的(在内存)数据块写回到数据库文件中。在某些比较繁忙的应用系统中,可以修改服务器参数文件SPFILE的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程,这样的DBWR进程名字分别为DBW0,DBW1,DBW2等。
2.检查点进程(CKPT)
检查点进程是一个可选进程。在数据库运行中当出现查找数据请求时,系统从数据库中找出这些数据并存入内存区,用户对数据的操作在内存中进行。当需要对修改的数据写回数据文件而产生重做日志文件的切换(Switch)时就出现校验点。DBA可以通过修改初始化参数文件SPFILE中的CHECKPOINT_PROCESS参数为TRUE来启动检查点进程。
3.日志写入器(LGWR)
日志写入器用于将SGA区中的日志信息写入到日志文件。一般是用户所做的修改先写入日志文件,等到一定时间才真正将修改结果写回到数据文件。
4.系统监控器(SMON)
系统监控器(System Monitor)是在数据库系统启动时执行恢复工作的强制性进程。比如,在并行服务器模式下(两台服务器共用一个磁盘组),SMON可以恢复另一台处于失败的数据库,使系统切换到另外一台正常的服务器上。
5.进程监控器(PMON)
进程监控器主要用于清除失效的用户进程,释放用户进程所用的资源。如,PMON将回滚未提交的工作释放锁、释放分配给失败进程的SGA资源。
6.归档器(ARCH)
可选进程,当数据库系统处于归档(ARCHIVELOG)模式时使用。当系统比较繁忙而导致LGWR进程处于等待ARCH进程时,可通过修改LOG_ARCHIVE_MAX_PROCESSES参数启动多个归档进程,从而提高归档写磁盘的速度。
7.锁(LCKn)
可选进程,并行服务器模式下可出现多个锁定进程以利于数据库通信。
8.恢复器(RECO)
分布式数据库(不同地点有不同机器和不同的Oracle系统)模式下使用的可选进程,用于数据不一致时进行恢复工作。在RECO解决恢复前,所做的修改数据的标识均标为“可疑”。
9.调度(Dnnn)
可选进程,在共享服务器模式下使用,可以启动多个调度进程。一般在网络环境具有多种协议下,每种协议至少创建一个调度进程,每个调度进程负责从所连接的用户进程到可用服务器进程的路由请求,然后把响应返回给合适的用户进程。
10.快照进程(SNPn)
快照进程处理数据库快照的自动刷新,并通过DBMS_JOB包运行预定的数据库存储过程。一般情况下,快照进程可以启动多个,在Oracle 11g版本里,可以直接在SQL>提示下用ALTER SYSTEM命令修改初始化参数JOB_QUEUE_PROCESS,动态启动多个快照进程。
11.并行查询进程(Pnnn)
可以根据数据库的活动并行查询选项的设置,Oracle服务器启动或停止并行查询进程,这些进程设计并行索引的创建、表的创建及查询。启动的数量与参数PARALLEL_MIN_SERVERS指定的数量相同,不能超出该参数指定的值。
Oracle不同版本的后台进程也不同,Oracle 11g默认情况下启动200多个后台进程。
示例:从V$BGPROCESS数据字典中查询当前实例进程信息。
SQL> set pagesize 50; SQL> select name,description from v$bgprocess; NAME DESCRIPTION ----- ---------------------------------------------------------------- PMON process cleanup VKTM Virtual Keeper of TiMe process DIAG diagnosibility process DBRM Resource Manager process RSMN Remote Slave Monitor PING interconnect latency measurement FMON File Mapping Monitor Process PSP0 process spawner 0 ACMS Atomic Controlfile to Memory Server DSKM slave DiSKMon process DIA0 diagnosibility process 0 DIA1 diagnosibility process 1 DIA2 diagnosibility process 2 DIA3 diagnosibility process 3 DIA4 diagnosibility process 4 DIA5 diagnosibility process 5 DIA6 diagnosibility process 6 DIA7 diagnosibility process 7
4.2.5 程序全局区PGA
Oracle在内存分配上除了SGA区外,还有程序全局区(PGA)、用户全局区(UGA)及调用全局区。与SGA区不同的是,PGA不是一个共享全局区,而是一个私有区。
程序全局区可以理解为进程全局区(Process Global Area),也可以理解为程序全局区(Program Global Area)。其内存段在进程私有区(Process Private Memory)而不是在共享区(Shared Memory)中。PGA是一个全局区,意味着所有代码、全局变量和数据结构都可存放在其中,但不被所有进程所共享。也就是说,每个Oracle的服务器进程都包含属于自己的PGA,该私有的PGA只包含本进程的相关特定信息。此外,PGA中的结构不像SGA那样需要由Oracle的锁存器机制来保护。因为其他进程不能进入这里访问,也就不会存放所存在的结构。
PGA区除了保存私有信息外,还包含正在使用的操作系统资源信息的有关进程及进程的状态信息。如果这些进程出现失败,则Oracle系统可将失败进程所占用的资源清除或释放掉,从而实现资源的高效利用。
示例:显示数据库实例的PGA信息。
SQL>set line 160 SQL> show parameter pga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 0 24M SQL>
4.3 数据字典
数据字典是存放整个数据库实例重要信息的一组表,这些数据字典多数都归于SYS用户所有。要想对Oracle重要性有更深入的了解,建议首先了解Oracle的部分数据字典,特别是DBA_xxx和V$xxx数据字典。
4.3.1 Oracle数据字典的构成
Oracle数据字典名称由前缀和后缀组成,使用下画线“_”连接。其代表的含义如下。
◎ USER_:记录用户的对象信息。
◎ ALL_:记录用户的对象信息及被授权访问的对象信息。
◎ DBA_:包含数据库实例的所有对象信息。
◎ V$_:当前实例的动态视图,包含系统管理和系统优化等所使用的视图。
◎ GV_:分布式环境下所有实例的动态视图,包含系统管理和系统优化使用的视图,这里的GV表示Global v$。
4.3.2 Oracle常用的数据字典
Oracle数据字典是一个不断发展、变化与淘汰的内部表,使用和参考相关资料时要注意所使用的Oracle RDBMS的版本与资料是否一致。
虽然Oracle提供了方便的企业管理器可阅读数据字典的信息,但是,通过这些图形界面来了解Oracle系统的内部结构和应用系统各对象的关系还存在一定的难度。为了使读者能方便了解Oradle系统内部的对象结构和进行高层次的管理,下面给出最基本的数据字典及其说明。
1.基本的数据字典
表4-1是初学者要了解的基本数据字典。
表4-1 基本的数据字典列表
2.与数据库组建相关的数据字典
Oracle数据库管理员经常按照数据库组建对数据库进行管理,比如,了解表空间及数据文件的信息,查询DBA_DATA_FILES和DBA_TABLESPACES数据字典等。表4-2是按照数据库组建进行分类的数据字典。
表4-2 基本的数据字典列表
4.3.3 Oracle常用的动态性能视图
动态性能视图(以V$开头的数据字典)对于鉴别实例级性能问题来说是非常有用的,所有带V$的视图都可以从V$FIXED_TABLE视图中列出,而V$FIXED_TABLE视图中以X$开头的视图是可以修改的内部数据结构。所以,这些表只是在实例处在NOMOUNT或MOUNT状态时才有效。
Oracle动态性能视图较多,表4-3是常见的动态性能视图的列表说明。
表4-3 常见动态性能视图
4.4 本章小结
Oracle数据库结构是一个复杂的结构,了解Oracle系统结构对于管理很有帮助。下面是掌握Oracle数据库结构的要点。
◎ 数据文件是存放实际数据的物理文件。
◎ 表空间是包括一个或多个数据文件的逻辑结构。
◎ 一个数据文件只能归到一个表空间上。
◎ 数据文件可在创建表空间时创建,也可以增加的方式创建。
◎ 数据文件的大小一般与操作系统的限制有关。
◎ 控制文件是Oracle的重要文件,主要存放有关数据文件、日志文件及数据库的基本信息,一般在数据打开时访问。
◎ 日志文件是存放日志信息的文件,在Oracle数据库活动时使用。
◎ 临时表空间是用于存放排序的磁盘空间;临时表空间由一个或多个临时文件组成。
◎ 临时文件(Oracle 8i中是数据文件)是属于某个临时表空间的数据文件。
◎ 归档日志文件是为了长期保存日志文件而由归档进程将联机日志文件读出并写到一个路径上的文件。
◎ Oracle实例由一组后台进程和内存结构组成。
◎ Oracle实例的内存结构称为系统全局区,简称SGA。
◎ SGA分为数据缓冲区、共享池和日志缓冲区。
◎ 后台进程是一组在Oracle服务器上运行的程序,称为后台进程。
◎ 后台进程是一组完成不同功能的程序,主要包括DBWR,LGWR,CKPT等。
◎ 数据字典是Oracle的重要部分,也是用于系统内部的一组表。
◎ 数据字典分为动态和静态两种,静态数据字典主要是以DBA_开头的数据字典,而动态数据字典则是以V$开头的视图。
◎ DBA_开头的数据字典存放的字符信息都是大写的,而V$_开头的视图存放的都是小写的。