大多数阅读过Oracle相关内容的用户会听说过它的三个核心效力,即:

一、Oracle体系结构概述:

数据库(Database)

  • 可扩充性——Oracle系统有能力承担增长的工作负荷,并且相应地扩充它的系统资源利用情况。这意味着给定的系统既可以服务于10个用户,也可以有效地服务于每个用户同时运行5个会话的10000个用户。
  • 可行性——无论出现操作系统崩溃、电源断电还是系统故障,都可以对Oracle进行配置,以保证在检索用户数据和进行事务处理的时候不受任何影响。
  • 可管理性——数据库管理员可以微调Oracle使用内在的方式、Oracle向磁盘写入数据的频率,以及数据库为连接到数据库的用户分配操作系统进行的方式。

  Oracle的体系结构是指数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。要了解Oracle数据库的体系结构,必须理解Oracle系统的重要概念和主要组件。

数据库是一个数据的集合,不仅是指物理上的数据,也指物理、存储及进程对象的一个组合。Oracle是一个基于B/S模式的关系型数据库管理系统(RDBMS)。

本章我们将要讨论:

  Oracle系统体系结构由三部分组成:内存结构,进程结构,存储结构。。如下图所示:

Oracle系统体系结构由三部分组成:逻辑结构、物理结构和实例。

  • 为什么理解体系结构很重要
  • 使用Oracle Net Services在用户进程和数据库之间进行连接
  • 服务器进程
  • 文件
  • 内在区域
  • 后台进程

  必发娱乐官方网站 1

必发娱乐官方网站 2

5.1     为什么必须理解体系结构

许多操作系统的细节都可以对应用开发者和数据库管理员进行抽象。应用只编写一次,就可以部署于几乎任何服务器操作系统上。例如,用户可以基于运行于用户开发服务器上的数据库构建用户应用,开发服务器为具有双处理器的Windows
2000服务器。当应用开发调试完毕之后,用户可以不作任何代码修改,只要花费一定的时间(依赖于应用的规模和数据)就可以将应用配置到Solaris硬件上运行的4个处理口碑
Sun
Solaris计算机上。在一段日子以后,用户的IT部门可能会决定将公司所有的硬件设备都移植到Linux。无论这种硬件改变的原因如何,Oracle都可以在这些平台上以一种相似的方式运行。用户只需从原始数据库中导出所有模式,并将它们导入到目标数据库中。而在客户计算机上不必进行修改,除非用户需要改变网络配置,指向新的服务器。如果已经在数据库中构建了用户应用,那么服务器应用根本不需要进行改变。

 

    1、内存结构(SGA、PAG)

一、Oracle的逻辑结构

Oracle的逻辑结构是一种层次结构。主要由:表空间、段、区和数据块等概念组成。逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构。数据库存储层次结构及其构成关系,结构对象也从数据块到表空间形成了不同层次的粒度关系。

必发娱乐官方网站 3

1.数据块(Data Blocks)

数据块是Oracle最小的存储单位,Oracle数据存放在“块”中。一个块占用一定的磁盘空间。特别注意的是,这里的“块”是Oracle的“数据块”,不是操作系统的“块”。

Oracle每次请求数据的时候,都是以块为单位。也就是说,Oracle每次请求的数据是块的整数倍。如果Oracle请求的数据量不到一块,Oracle也会读取整个块。所以说,“块”是Oracle读写数据的最小单位或者最基本的单位。

块的标准大小由初始化参数DB_BLOCK_SIZE指定。具有标准大小的块称为标准块(Standard
Block)。块的大小和标准块的大小不同的块叫非标准块(Nonstandard Block)。

操作系统每次执行I/O的时候,是以操作系统的块为单位;Oracle每次执行I/O的时候,都是以Oracle的块为单位。

Oracle数据块大小一般是操作系统块的整数倍。

数据块的格式(Data Block Format)

块中存放表的数据和索引的数据,无论存放哪种类型的数据,块的格式都是相同的,块由块头(header/Common
and Variable),表目录(Table Directory),行目录(Row
Directory),空余空间(Free Space)和行数据(Row Data)五部分组成,如下图

必发娱乐官方网站 4

块头(header/Common and
Variable):存放块的基本信息,如:块的物理地址,块所属的段的类型(是数据段还是索引段)。

表目录(Table
Directory):存放表的信息,即:如果一些表的数据被存放在这个块中,那么,这些表的相关信息将被存放在“表目录”中。

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

行数据(Row
Data):是真正存放表数据和索引数据的地方。这部分空间是已被数据行占用的空间。

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

头部信息区(Overhead):我们把块头(header/Common and
Variable),表目录(Table Directory),行目录(Row
Directory)这三部分合称为头部信息区(Overhead)。头部信息区不存放数据,它存放的整个块的信息。头部信息区的大小是可变的。一般来说,头部信息区的大小介于84字节(bytes)到107字节(bytes)之间。

数据块中自由空间的使用

当往数据库中插入(INSERT)数据的时候,块中的自由空间会减少;当对块中已经存在的行进行修改(UPDATE)的时候(使记录长度增加),块中的自由空间也会减少。

DELETE语句和UPDATE语句会使块中的自由空间增加。当使用DELETE语句删除块中的记录或者使用UPDATE语句把列的值更改成一个更小值的时候,Oracle会释放出一部分自由空间。释放出的自由空间并不一定是连续的。通常情况下,Oracle不会对块中不连续的自由空间进行合并。因为合并数据块中不连续的自由空间会影响数据库的性能。只有当用户进行数据插入(INSERT)或者更新(UPDATE)操作,却找不到连续的自由空间的时候,Oracle才会合并数据块中不连续的自由空间。

对于块中的自由空间,Oracle提供两种管理方式:自动管理,手动管理

行链接和行迁移(Row Chaining and Migrating)

行链接(Row
Chaining):如果我们往数据库中插入(INSERT)一行数据,这行数据很大,以至于一个数据块存不下一整行,Oracle就会把一行数据分作几段存在几个数据块中,这个过程叫行链接(Row
Chaining)。如下图所示:

必发娱乐官方网站 5

如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。

行迁移(Row
Migrating):数据块中存在一条记录,用户执行UPDATE更新这条记录,这个UPDATE操作使这条记录变长,这时候,Oracle在这个数据块中进行查找,但是找不到能够容纳下这条记录的空间,无奈之下,Oracle只能把整行数据移到一个新的数据块。原来的数据块中保留一个“指针”,这个“指针”指向新的数据块。被移动的这条记录的ROWID保持不变。行迁移的原理如下图所示:

必发娱乐官方网站 6

无论是行链接还是行迁移,都会影响数据库的性能。Oracle在读取这样的记录的时候,Oracle会扫描多个数据块,执行更多的I/O。

块中自由空间的自动管理

Oracle使用位图(bitmap)来管理和跟踪数据块,这种块的空间管理方式叫“自动管理”。自动管理有下面的好处:

◆易于使用

◆更好地利用空间

◆可以对空间进行实时调整

块中自由空间的手动管理

用户可以通过PCTFREE,
PCTUSED来调整块中空间的使用,这种管理方式叫手动管理。相对于自动管理,手动管理方式比较麻烦,不容易掌握,容易造成块中空间的浪费。

PCTUSED也是用于设置一个百分比,当块中已使用的空间的比例小于这个百分比的时候,这个块才被标识为有效状态。只有有效的块才被允许插入数据。

PCTFREE参数用于指定块中必须保留的最小空闲空间百分例,默认值为10。之所以要预留这样的空间,是因为UPDATE时,需要这些空间。如果UPDATE时,没有空余空间,Oracle就会分配一个新的块,这会产生行迁移(Row
Migrating)。

例如,假定在Create
table语句中指定了pctfree为20,则说明在该表的数据段内每个数据块的20%被作为可利用的空闲空间,用于更新已在数据块内存在的数据行其余80%是用于插入新的数据行,直到达到80%为止。显然,pctfree值越小,则为现存行更新所预留的空间越少。因此,如果pctfree设置得太高,则在全表扫描期间增加I/O,浪费磁盘空间;如果pctfree设置得太低,则会导致行迁移。 
pctused参数设置了数据块是否是空闲的界限。当数据块的使用空间低于pctused的值时,此数据块标志为空闲,该空闲空间仅用于插入新的行。如果数据块已经达到了由pctfree所确定的上边界时,Oracle就认为此数据块已经无法再插入新的行。例如,假定在Create
table语句中指定pctused为40,则当小于或等于39时,该数据块才是可用的。所以,可将数据块填得更满,这样可节省空间,但却增加了处理开销,因为数据块的空闲空间总是要被更新的行占据,所以对数据块需要频繁地进行重新组织。比较低的pctused增加了数据库的空闲空间,但减少了更新操作的处理开销。所以,如果pctused设置过高,则会降低磁盘的利用率导致行迁移;若pctused设置过低,则浪费磁盘空间,增加全表扫描时的I/O输出。pctused是与pctfree相对的参数。 
那么,如何选择pctfree和pctused的值呢?有个公式可供参考。显然,pctfree和pctused的之和不能超过100。若两者之和低于100,则空间的利用与系统的I/O之间的最佳平衡点是:pctfree与pctused之和等于100%减去一行的大小占块空间大小的百分比。例如,如果块大小为2048字节,则它需要100个字节的开销,而行大小是390字节(为可用块的20%)。为了充分利用空间,pctfree与pctused之和最好为80%。 
那么,怎样确定数据块大小呢?有两个因素需要考虑: 
一是数据库环境类型。例如,是DSS环境还是OLTP环境?在数据仓库环境(OLAP或DSS)下,用户需要进行许多运行时间很长的查询,所以应当使用大的数据块。在OLTP系统中,用户处理大量的小型事务,采用较小数据块能够获得更好的效果。 
二是SGA的大小。数据库缓冲区的大小由数据块大小和初始化文件的db_block_buffers参数决定。最好设为操作系统I/O的整数倍。

(以上摘自)

2.数据区(Extent)

是一组连续的数据块。当一个表、回滚段或临时段创建或需要附加空间时,系统总是为之分配一个新的数据区。一个数据区不能跨越多个文件,因为它包含连续的数据块。使用区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配空间就是以数据区为单位的。一个Oracle对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。

3.段(Segment)

是由多个数据区构成的,它是为特定的数据库对象(如表段、索引段、回滚段、临时段)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件。使用段的目的是用来保存特定对象。 
一个Oracle数据库有4种类型的段: 
数据段:数据段也称为表段,它包含数据并且与表和簇相关。当创建一个表时,系统自动创建一个以该表的名字命名的数据段。 
索引段:包含了用于提高系统性能的索引。一旦建立索引,系统自动创建一个以该索引的名字命名的索引段。 
回滚段:包含了回滚信息,并在数据库恢复期间使用,以便为数据库提供读入一致性和回滚未提交的事务,即用来回滚事务的数据空间。当一个事务开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。系统有个默认的回滚段,其管理方式既可以是自动的,也可以是手工的。 
临时段:它是Oracle在运行过程中自行创建的段。当一个SQL语句需要临时工作区时,由Oracle建立临时段。一旦语句执行完毕,临时段的区间便退回给系统。

4.表空间(tablespace)

是数据库的逻辑划分。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间(system
tablespace),表空间的大小等于所有从属于它的数据文件大小的总和。

(1)系统表空间(system tablespace)

是每个Oracle数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。 
系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。

(2)SYSAUX表空间 
是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX也是许多Oracle
数据库的默认表空间,它减少了由数据库和DBA管理的表空间数量,降低了SYSTEM表空间的负荷。

(3)临时表空间  相对于其他表空间而言,临时表空间(temp
tablespace)主要用于存储Oracle数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。

(4)撤销表空间  用于保存Oracle数据库撤销信息,即保存用户回滚段的表空间称之为回滚表空间(或简称为RBS撤销表空间(undo
tablespace))。在Oracle8i中是rollback
tablespace,从Oracle9i开始改为undo tablespace。在Oracle
10g中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example和users。其中temp是临时表空间,undotbs1是undo撤销表空间。

(5)USERS表空间

用户表空间,用于存放永久性用户对象的数据和私有信息。每个数据块都应该有一个用户表空间,以便在创建用户是将其分配给用户。

必发娱乐官方网站 7

 

5.2     进行连接

在这一节中,我们将要讨论Oracle体系结构中协同工作的三个领域,它们可以为我们提供连接数据库实例的能力。它们是:

  • 用户进程
  • Oracle监听器
  • Oracle网络客户

  内存结构包括系统全局区(System Global
Area,SGA)和程序全局区(Program
Gloabl Area,PGA)。

二、物理结构

Oracle物理结构包含了数据文件、日志文件和控制文件

1.数据文件

每一个ORACLE数据库有一个或多个物理的数据文件(data
file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引)的数据物理地存储在数据库的数据文件中。数据文件有下列特征: 
一个数据文件仅与一个数据库联系。

一旦建立,数据文件不能改变大小.

一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。 
数据文件中的数据在需要时可以读取并存储在ORACLE内存储区中。例如:用户要存取数据库一表的某些数据,如果请求信息不在数据库的内存存储区内,则从相应的数据文件中读取并存储在内存。当修改和插入新数据时,不必立刻写入数据文件。为了减少磁盘输出的总数,提高性能,数据存储在内存,然后由ORACLE后台进程DBWR决定如何将其写入到相应的数据文件。

2.日志文件

每一个数据库有两个或多个日志文件(redo log
file)的组,每一个日志文件组用于收集数据库日志。日志的主要功能是记录对数据所作的修改,所以对数据库作的全部修改是记录在日志中。在出现故障时,如果不能将修改数据永久地写入数据文件,则可利用日志得到该修改,所以从不会丢失已有操作成果。 
日志文件主要是保护数据库以防止故障。为了防止日志文件本身的故障,ORACLE允许镜象日志(mirrored
redo log),以致可在不同磁盘上维护两个或多个日志副本。 
日志文件中的信息仅在系统故障或介质故障恢复数据库时使用,这些故障阻止将数据库数据写入到数据库的数据文件。然而任何丢失的数据在下一次数据库打开时,ORACLE自动地应用日志文件中的信息来恢复数据库数据文件。

Oralce两种日志文件类型:

联机日志文件 
这是Oracle用来循环记录数据库改变的操作系统文件

归档日志文件 
这是指为避免联机日志文件重写时丢失重复数据而对联机日志文件所做的备份

Oracle有两种归档日志模式,Oracle数据库可以采用其中任何一种模式:

NOARCHIVELOG 
不对日志文件进行归档。这种模式可以大大减少数据库备份的开销,但可能回导致数据的不可恢复

ARCHIVELOG 
在这种模式下,当Oracle转向一个新的日志文件时,将以前的日志文件进行归档。为了防止出现历史“缺口”的情况,一个给定的日志文件在它成功归档之前是不能重新使用的。归档的日志文件,加上联机日志文件,为数据库的所有改变提供了完整的历史信息。

在Oracle利用日志文件和归档日志文件来恢复数据库时,内部序列号可以起一个向导的作用。

3.控制文件

每一ORACLE数据库有一个控制文件(control
file),它记录数据库的物理结构,包含下列信息类型: 
数据库名; 
数据库数据文件和日志文件的名字和位置; 
数据库建立日期。 
为了安全起见,允许控制文件被镜象。 
每一次ORACLE数据库的实例启动时,它的控制文件用于标识数据库和日志文件,当着手数据库操作时它们必须被打开。当数据库的物理组成更改时,ORACLE自动更改该数据库的控制文件。数据恢复时,也要使用控制文件。

4.参数文件

除了构成Oracle数据库物理结构的三类主要文件外,Oracle数据库还具有另外一种重要的文件:参数文件。参数文件记录了Oracle数据库的基本参数信息,主要包括数据库名、控制文件所在路径、进程等。与旧版本的初始化参数文件INITsid.ora不同,在Oracle10g中还可以使用二进进制服务器参数文件,并且该服务器参数文件在安装Oracle数据库系统时由系统自动创建,文件的名称为SPFILEsid.ora,sid为所创建的数据库实例名。 
SPFILEsid.ora中的参数是由Oracle系统自动管理。如果想要对数据库的某些参数进行设置,则可能过OEM或ALTER
SYSTEM命令来修改。用户最好不要用编辑器进行修改。

5.2.1          用户进程

可以将用户进程(User
Process)看作是一些试图连接数据库的软件(例如客户工具)。用户进程会使用Oracle
Net
Services(Oracle网络服务)与数据库进行通信,网络服务是一组通过网络连接协议提供网络连接的组件。Oracle
Net对应用开发者和数据库管理员屏蔽了不同硬件平台上配置不同网络的复杂性。Oracle不用编辑Windows
2000服务器上的注册表,或者Linux服务器上/etc中的配置文件,而是使用一些简单的配置文件(在Oracle安装区域中的一个位置)就可以管理OracleNet。Oracle提供了(并且鼓励使用)Oracle
Net Manager(Oracle网络管理器)以及Oracle Net Configuration
Assistant(Oracle 网络配置助理)这样的工具来设置用户的Oracle Net
Services配置。

由于在所有的平台上都使用了相同的文件,所以在用户最熟悉的操作系统上了解它们的语法,然后使用这些知识配置任何服务器上的文件就很容易。

  

三、实例(instance)

数据库实例(也称为服务器Server)就是用来访问一个数据库文件集的一个存储结构及后台进程的集合。它使一个单独的数据库可以被多个实例访问(也就是ORACLE并行服务器–
OPS)。

实例在操作系统中用ORACLE_SID来标识,在Oracle中用参数INSTANCE_NAME来标识,
它们两个的值是相同的。数据库启动时,系统首先在服务器内存中分配系统全局区(SGA),构成了Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了Oracle的
进程结构,内存区域和后台进程合称为一个Oracle实例。

必发娱乐官方网站 8
1.系统全局区(SGA)

SGA是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信: 
息。如果多个用户连接到同一个数据库实例,在实例的SGA中,数据可以被多个用户共享,
当数据库实例启动时,SGA的内存被自动分配;当数据库实例关闭时,SGA内存被回收。 
SGA是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。

系统全局区(SGA),主要包括:

1)数据块缓存区 
数据块缓存区(datablockbuffercache)是SGA中的一个高速缓存区域,用来存储从数据库中读取数据段的数据块(如表、索引和簇)。数据块缓存区的大小由数据库服务器init.ora文件中的DB_LOCK_BUFFERS参数决定(用数据库块的个数表示)。在调整和管理数据库时,调整数据块缓存区的大小是一个重要的部分。

因为数据块缓存区的大小固定,并且其大小通常小于数据库段所使用的空间,所以它不能一次装载下内存中所有的数据库段。通常,数据块缓存区只是数据库大小的1%~2%,Oracle使用最近最少使用(LRU,leastrecentlyused)算法来管理可用空间。当存储区需要自由空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置。通过这种方法,将最频繁使用的数据保存在存储区中。

然而,如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据块缓存区中的空间。当多个应用程序共享同一个SGA时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺SGA中的空间。其结果是,对数据块缓存区的数据请求将出现较低的命中率,导致系统性能下降。

2)字典缓存区 
数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、数据文件名、段名、盘区位置、表说明和权限,当数据库需要这些信息(如检查用户查询一个表的授权)时,将读取数据字典表并且将返回的数据存储在字典缓存区的SGA中。

数据字典缓存区通过最近最少使用(LRU)算法来管理。字典缓存区的大小由数据库内部管理。字典缓存区是SQL共享池的一部分,共享池的大小由数据库文件init.ora中的SHARED_POOL_SIZE参数来设置。

如果字典缓存区太小,数据库就不得不反复查询数据字典表以访问数据库所需的信息,这些查询称为循环调用(recuesivecall),这时的查询速度相对字典缓存区独立完成查询时要低。

3)重做日志缓冲区 
重做项描述对数据库进行的修改。它们写到联机重做日志文件中,以便在数据库恢复过程中用于向前滚动操作。然而,在被写入联机重做日志文件之前,事务首先被记录在称作重做日志缓冲区(redologbuffer)的SGA中。数据库可以周期地分批向联机重做日志文件中写重做项的内容,从而优化这个操作。重做日志缓冲区的大小(以字节为单位)由init.ora文件中的LOG_BUFFER参数决定。

4)SQL共享池 
SQL共享池存储数据字典缓存区及库缓存区(librarycache),即对数据库进行操作的语句信息。当数据块缓冲区和字典缓存区能够共享数据库用户间的结构及数据信息时,库缓存区允许共享常用的SQL语句。

SQL共享池包括执行计划及运行数据库的SQL语句的语法分析树。在第二次运行(由任何用户)相同的SQL语句时,可以利用SQL共享池中可用的语法分析信息来加快执行速度。

SQL共享池通过LRU算法来管理。当SQL共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间。如果SQL共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。

SQL共享池的大小(以字节为单位)由init.ora文件参数SHARED_POOL_SIZE决定。

5)大池 
大池(LargePool)是一个可选内存区。如果使用线程服务器选项或频繁执行备份/恢复操作,只要创建一个大池,就可以更有效地管理这些操作。大池将致力于支持SQL大型命令。利用大池,就可以防止这些SQL大型命令把条目重写入SQL共享池中,从而减少再装入到库缓存区中的语句数量。大池的大小(以字节为单位)通过init.ora文件的LARGE_POOL_SIZE参数设置,用户可以使用init.ora文件的LARGE_POOL_MIN_ALLOC参数设置大池中的最小位置。Oracle8i已不用这个参数。作为使用LargePool的一种选择方案,可以用init.ora文件的SHARED_POOL_RESERVED_SIZE参数为SQL大型语句保留一部分SQL共享池。

6)Java池 
由其名字可知,Java池为Java命令提供语法分析。Java池的大小(以字节为单位)通过在Oracle8i引入的init.ora文件的JAVA_POOL_SIZE参数设置。init.ora文件的JAVA_POOL_SIZE参数缺省设置为10MB。

7)多缓冲池 
可以在SGA中创建多个缓冲池,能够用多个缓冲池把大数据集与其他的应用程序分开,以减少它们争夺数据块缓存区内相同资源的可能性。对于创建的每一个缓冲池,都要规定其LRU锁存器的大小和数量。缓冲区的数量必须至少比LRU锁存器的数量多50倍。

创建缓冲池时,需要规定保存区(keeparea)的大小和再循环区(recyclearea)的大小。与SQL共享池的保留区一样,保存区保持条目,而再循环区则被频繁地再循环使用。可以通过BUFFER_POOL_KEEP参数规定来保存区的大小。例如: 
保存和再循环缓冲池的容量减少了数据块缓冲存储区中的可用空间(通过DB_BLOCK_BUFFERS参数设置)。对于使用一个新缓冲池的表,通过表的storage子句中的buffer_pool参数来规定缓冲池的名字。例如,如果需要从内存中快速删除一个表,就把它赋予RECYCLE池。缺省池叫作DEFAULT,这样就能在以后用altertable命令把一个表转移到DEFAULT池。

2.后台进程(Backgroung Process)

数据库的物理结构与内存结构之间的交互要通过后台进程来完成。

1、DBWR进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个Oracle后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。

Oracle采用LRU(LEAST RECENTLY
USED)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使I/O最小。在下列情况预示DBWR
要将弄脏的缓冲区写入磁盘:

当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度时,该服务进程将通知DBWR进行写。该临界长度是为参数DB-BLOCK-WRITE-BATCH的值的一半。

当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区,它停止查找并通知DBWR进行写。出现超时(每次3秒),DBWR
将通知本身。当出现检查点时,LGWR将通知DBWR.在前两种情况下,DBWR将弄脏表中的块写入磁盘,每次可写的块数由初始化参数DB-BLOCK-
WRITE-BATCH所指定。如果弄脏表中没有该参数指定块数的缓冲区,DBWR从LUR表中查找另外一个弄脏缓冲区。

如果DBWR在三秒内未活动,则出现超时。在这种情况下DBWR对LRU表查找指定数目的缓冲区,将所找到任何弄脏缓冲区写入磁盘。每当出现超时,DBWR查找一个新的缓冲区组。每次由DBWR查找的缓冲区的数目是为寝化参数DB-BLOCK-
WRITE-BATCH的值的二倍。如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。

在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘。DBWR将指定的缓冲区写入磁盘。

在有些平台上,一个实例可有多个DBWR.在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。参数DB-WRITERS控制DBWR进程个数。

必发娱乐官方网站 9

2、LGWR进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个Oracle后台进程。LGWR进程将自上次写入磁盘以来的全部日志项输出,LGWR输出:

◆当用户进程提交一事务时写入一个提交记录。 
◆每三秒将日志缓冲区输出。 
◆当日志缓冲区的1/3已满时将日志缓冲区输出。 
◆当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。

LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,LGWR可继续地写入该组的其它文件。

日志缓冲区是一个循环缓冲区。当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。LGWR
通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。

注意:有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。

ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。

必发娱乐官方网站 10

3、CKPT进程:该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由LGWR执行。然而,如果检查点明显地降低系统性能时,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。对于许多应用情况,CKPT进程是不必要的。只有当数据库有许多数据文件,LGWR在检查点时明显地降低性能才使CKPT运行。
CKPT进程不将块写入磁盘,该工作是由DBWR完成的。初始化参数CHECKPOINT-PROCESS控制CKPT进程的使能或使不能。缺省时为FALSE,即为使不能。

   
由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。在Oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用:

1、完全检查点

   
在Oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:

(1)DBA手工执行alter system checkpoint的命令;

(2)数据库正常shutdown(immediate,transcational,normal)。

由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。因此Oracle从8i开始引入了增量检查点的概念。

2、 增量检查点

Oracle从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo
Block
Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置,以表示Instance
Recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。检查点位置发生变更后,Oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。

(1)fast_start_io_target

该参数用于表示数据库发生Instance
Recovery的时候需要产生的IO总数,它通过v$filestat的AVGIOTIM来估算的。比如我们一个数据库在发生Instance
Crash后需要在10分钟内恢复完毕,假定OS的IO每秒为500个,那么这个数据库发生Instance
Recovery的时候大概将产生500*10*60=30,000次IO,也就是我们将可以把fast_start_io_target设置为30000。

(2)fast_start_mttr_target

我们从上面可以看到fast_start_io_target来估算检查点位置比较麻烦。Oracle为了简化这个概念,从9i开始引入了fast_start_mttr_target这么一个参数,用于表示数据库发生Instance
Recovery的时间,以秒为单位。这个参数我们从字面上也比较好理解,其中的mttr是mean
time to
recovery的简写,如上例中的情况我们可以将fast_start_mttr_target设置为600。当设置了fast_start_mttr_target后,fast_start_io_target这个参数将不再生效,从9i后fast_start_io_target这个参数被Oracle废除了。

(3)log_checkpoint_timeout

该参数用于表示检查点位置和重做日志文件末尾之间的时间间隔,以秒为单位,默认情况下是1800秒。

(4)log_checkpoint_interval

该参数是表示检查点位置和重做日志末尾的重做日志块的数量,以OS块表示。

(5)90% OF SMALLEST REDO LOG

除了以上4个初始化参数外,Oracle内部事实上还将重做日志文件末尾前面90%的位置设为检查点位置。在每个重做日志中,这么几个参数指定的位置可能不尽相同,Oracle将离日志文件末尾最近的那个位置确认为检查点位置。

4、SMON进程:该进程实例启动时,执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

5、PMON进程:该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。

PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

6、RECO进程:该进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障。一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。

当一数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果远程服务器是不可用或者网络连接不能建立时,RECO自动地在一个时间间隔之后再次连接。

RECO后台进程仅当在允许分布式事务的系统中出现,而且DISTRIBUTED C
TRANSACTIONS参数是大于0。

7、ARCH进程:该进程将已填满的在线日志文件拷贝到指定的存储设备。当日志是为ARCHIVELOG使用方式、并可自动地归档时ARCH进程才存在。

8、LCKn进程:是在具有并行服务器选件环境下使用,可多至10个进程(LCK0,LCK1……,LCK9),用于实例间的封锁。

9、Dnnn进程(调度进程):该进程允许用户进程共享有限的服务器进程(SERVER
PROCESS)。没有调度进程时,每个用户进程需要一个专用服务进程(DEDICATEDSERVER
PROCESS)。对于多线索服务器(MULTI-THREADED
SERVER)可支持多个用户进程。如果在系统中具有大量用户,多线索服务器可支持大量用户,尤其在客户_服务器环境中。

在一个数据库实例中可建立多个调度进程。对每种网络协议至少建立一个调度进程。数据库管理员根据操作系统中每个进程可连接数目的限制决定启动的调度程序的最优数,在实例运行时可增加或删除调度进程。多线索服务器需要SQL*NET版本2或更后的版本。在多线索服务器的配置下,一个网络接收器进程等待客户应用连接请求,并将每一个发送到一个调度进程。如果不能将客户应用连接到一调度进程时,网络接收器进程将启动一个专用服务器进程。该网络接收器进程不是Oracle实例的组成部分,它是处理与Oracle有关的网络进程的组成部分。在实例启动时,该网络接收器被打开,为用户连接到Oracle建立一通信路径,然后每一个调度进程把连接请求的调度进程的地址给予它的接收器。当一个用户进程作连接请求时,网络接收器进程分析请求并决定该用户是否可使用一调度进程。如果是,该网络接收器进程返回该调度进程的地址,之后用户进程直接连接到该调度进程。有些用户进程不能调度进程通信(如果使用SQL*NET以前的版本的用户),网络接收器进程不能将此用户连接到一调度进程。在这种情况下,网络接收器建立一个专用服务器进程,建立一种合适的连接。

 

(以上都参考自网上资料)

5.2.2          Oracle监听器

监听器(listener)是一个通常运行于Oracle数据库服务器上的进程,它负责“监听”来自于客户应用的连接请求。客户负责在初始化连接请求中向监听器发送服务名称(service
name)。这个服务名称是一个标识符,它可以唯一标识客户试图连接的数据库实例。

监听器可以接受请求,判断请求是否合法,然后将连接路由到适当的服务处理器(service
handler)。服务处理器是一些客户请求试图连接的进程。在数据库服务的例子中,两种类型的服务处理器分别是专用服务器进程或者共享服务器进程。当把连接路由到合适的服务处理器之后,监听器就完成了它的职责,就可以等候另外的连接请求。

Oracle 8i和Oracle
9i数据库可以使用监听器动态配置它们的服务。动态注册(也称为服务注册)可以通过称为进程监控器的Oracle后台进程或者PMON来完成。动态注册意味着数据库可以告诉监听器(与数据库处于相同服务器的本地监听器或者远程监听器)服务器上可以使用的服务。

即使没有在用户监听器配置文件中明确设置静态监听配置,同时用户数据库无法使用动态注册,监听器也会使用安装它的时候的默认值。标准的监听器会使用如下假定:

  • 网络协议:TCP/IP
  • 主机名称:运行监听器的主机
  • 端口:1521

监听器配置

如果用户想要手工配置用户监听器,那么就可以在listener.ora文件找到配置信息,它通常位于Unix上的$ORACLE_HOME/network/admin目录中,或者Windows上的%ORACLE_HOME%\network\admin目录中。在两个平台上,就可以建立名为TNS_ADMIN的环境变量,指向Oracle网络服务文件所处的目录。这可以方便管理员将它们的配置文件放置到默认位置以外的某个地方。

listener.ora文件(在Linux服务器上)的示例如下所示:

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS_LIST =

        (ADDRESS = (PROTOCOL = TCP)(HOST = slaphappy.us.oracle.com)(PORT = 1521))

      )

    )

  )



SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = slqpdb.us.oracle.com)

      (ORACLE_HOME = /u01/app/oracle/Oracle 9i)

      (SID_NAME =slapdb)

    )

  )



SAVE_CONFIG_ON_STOP_LISTENER=ON

LOG_FILE_LISTENER=lsnr.log

LOG_DIRECTORY_LISTENER=/u01/app/oracle/Oracle 9i/network/log

TRACE_FILE_LISTENER=lsnr

TRACE_DIRECTORY_LISTENER=/u01/app/oracle/Oracle 9i/network/log

TRACE_LEVEL_LISTENER=0FF

 

第一个表项LISTENER是一个命名监听器,它会使用TCP/IP协议监听slaphappy.us.oracle.com上的端口1521.LISTENER是用户安装数据库时Oracle监听器的默认名称,但是可以使用不同的名称建立多个监听器,监听多个端口。

SID_LIST_LISTENER标识了正在连接LISTENER的客户可以使用的服务。SID部分代表系统标识符(System
Identifier)。在以上的配置中,SLAPDB是全局数据库库的名称,US.ORACLE.COM是在安装期间赋给数据库的全局数据库域。SLAPDB是在安装期间指定给数据库的实例名称,ORACLE_HOME是安装Oracle数据库的目录。

当监听器运行的时候,它就可以使用Oracle提供的名为lsnrct1的实用工具(实用工具的名称可能会在版本之间发生变化)修改它的配置。这是一个命令行模式的应用,它可以提供大量有帮助的操作,例如STOP、START、RELOAD、STATUS、SHOW(参数)、SET(参数)等。

在以上的监听器配置文件中,SAVE_CONFIG_ON_STOP_LISTENER设置可以告诉Oracle网络服务是否将监听器设置的修改结果写入listener.ora文件。

LOG_FILE_LISTENER和LOG_DIRECTORY_LISTENER标识了监听器日志文件的位置。长时间等候连接、连接问题、非预期拒绝、或者非预期监听器关闭都会在日志文件中记录有用的信息。由设置TRACE_FILE_LISTENER和TRACE_DIRECTORY_LISTENER标识的示踪文件,将会提供Oracle网络组件操作的附加细节。

可以在各种富余程度上执行跟踪功能。在以上的配置中,TRACE_LEVEL_LISTENER设置为OFF。这意味着无论监听器出现了什么问题,都不会在跟踪文件中记录跟踪信息。TRACE_LEVEL_LISTENER的合法设置如下所示:

  • OFF。根本不生成跟踪信息。
  • USER。所记录的跟踪信息将会提供用户连接所引发错误的详细信息。
  • ADMIN。这个层次的监听器跟踪记录将会向管理员展示监听器安装和/或者配置所出现的问题。
  • SUPPORT。这个跟踪层次可以在用户调用Oracle服务支持Oracle Services
    Support,(OSS)的时候使用。在跟踪文件中为SUPPORT层次生成的信息能够被发往OSS,进而进行分析和排除用户可能会遇到的问题。

  2、进程结构(process)

5.2.3          Oracle网络客户

Oracle客户工具必须进行配置,才可以与网络上某处的数据库进行交互。对于监听器来说,这个文件是listener.ora,而在客户机中,它就是tnsnames.ora。tns代表透明网络层(transparent
networking
substrate),而names是指在配置文件中包含数据库的“名称”。tnsnames.ora文件中是一个连接描述符(connection
descriptors)的列表
,Oracle工具可以使用它们连接数据库。连接描述符是文件中的表项,它规定了服务器主机名称、与服务器进行通信的协议以及用来与监听者交互的端口这样的信息。tnsnames.ora文件示例如下所示:

SLAPDB.US.ORACLE.COM =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = slaphappy.us.oracle.com)(PORT = 1521))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = slapdb.us.oracle.com)

    )

  )

这种将Oracle网络客户(Net
Client)与Oracle网络监听器进行连接的类型称为局域管理(localized
management)。这意味着网络上所有想要和Oracle数据库进行连接的计算机都要在本地配置文件中维护连接描述符。

在图5-1中,可以看到在局域化网络服务管理中,能够连接数据库的每个计算机上都有一个tnsnames.ora文件。

必发娱乐官方网站 11 

图5-1 局域化网络服务管理

为了解决局域网络服务管理在管理上的麻烦。Oracle可以支持Oracle网络配置细节的集中管理(centralized
management)。这意味着网络上的所有计算机都要指向一些中心存储,它们可以通知客户在哪里找到数据库。

 必发娱乐官方网站 12

图5-2 集中网络服务管理

在集中管理中,客户机和数据库服务器都要进行配置,以查看中心资源来寻找他们的连接数据。在图5-2中,客户机需要在它们的本地配置中有一些表项指向存储它们的连接数据的Oracle名称服务器或者LDAP兼容目录服务器。当用户想要作为用户SCOTT连接数据库服务slapdb.us.oracle.com的时候,工具会采用不同的途径获取它的连接细节。SQL*Plus(作为数据库应用的示例)将会首先读取本地配置,并且找出它应该使用的名称服务器(或者目录服务器)来获取连接细节。

Oracle网络服务的优点是它不是一个全或无的方案。用户可以很容易地为用户的企业应用使用集中名称服务器或者目录服务器。而在本地的tnsnames.ora文件中规定使用网络服务进行连接的其他数据库或者服务。然后,用户可以配置用户计算机上的数据库应用在tnsnames.ora文件中查找本地配置来获取连接数据,如果在那里没有找到服务名称,则工具就可以向名称或者目录服务器发送请求。

  进程结构包括前台进程和后台进程。前台进程是指服务进程和用户进程。前台进程是根据实际需要而运行的,并在需要结束后立刻结束。后台进程是指在Oracle数据库启动后,自动启动的几个操作系统进程。

5.3     服务器进程

当Oracle网络服务器接收到用户进程的连接请求之后,它就会将用户进程路由到一个服务器进程(server
process)。至此,服务器进程就要负责在用户进程和Oracle实例之间调度请求和响应。当用户进程提交查询之后,服务进程就要负责执行这个查询,将数据从磁盘缓存,获取查询的结果,然后向用户进程返回结果。即使响应出现了某些错误,服务进程也会将错误信息发回给用户进程,以便进程合适的处理。可以基于服务器的体系结构,在用户进程和服务器进程之间维护连接,以便不必重新建立连接就可以管理随后的请求。在Oracle中有2种不同的体系结构,用于将用户进程与服务进程进行连接。

专用服务器和共享服务器

在专用服务器(dedicated
server)模式中,会向每个要与数据库连接的用户进程赋予了它自己的专用服务器进程。这是用户安装Oracle数据库时它所配置的方式,通常也是大多数数据库管理员运行他们的数据库的方式。

专用服务器为用户进程和服务器进程之间提供了一对一的映射关系,而共享服务器使用多对一的关系。每个服务器进程都要为多个用户进程提供服务。

在Oracle 9i之前,共享服务器称为多线程服务器(Multi-Threaded
Server,MTS)。熟悉在他们的数据库上设置MTS开发者将会发现大多数概念相同,但是所有与MTS_相关的数据库参数都有了新的名称。

在共享服务器模式中,有一个称为调度程序(dispatcher)的附加组件,它会负责在用户进程与服务器进程之间进行跌幅。当用户进程请求与共享服务器进行连接的时候,Oracle网络服务就会将会话请求路由到调度程序,而不是服务进程。然后,调度程序就会将请求发送到请求队列,在那里,第一个i\(空闲)共享服务器就会获得请求。所生成的结果会放回到响应队列中,它会受到调度程序的监控,并返回到客户。

尽管配置共享服务器模式要稍微复杂一些,必须要对连接到服务器进程的客户进行一些考虑,但是还是有一些原因促使用户使用这种方式:

  • 它会使用更少的服务器进程(在基于UNIX的系统上)或者线程(在基于Windows
    NT/2000的系统上)。这是因为用户进程会对它们进行共享。对于专用服务器,1000个通过网络连接数据库的用户将需要在数据库计算机上启动1000个服务器进程(在Unix上)或者服务器线程(在Windows上)。在共享服务器中,因为一个服务器进程可以服务于5、10甚至50个用户进程(当然要根据用户应用),所以这个数量将会极大减少。
  • 它可以减少内在消耗。正如用户将会在以后讨论内在区域的时候看到的,每个服务器进程都要分配它自己的程序全局区域(Program
     GlobalArea,PGA)。由于我们要运行更少的服务进程,所以就不需要分配更多的PGA。
  • 有时它是必须的。对于Oracle数据库跌Enterprises Java
    Beans(EJB)容器,用户必须要使用Internet
    Inter-Orb协议(IIOP)来连接运行于这个窗口中的Bean程序。目前,这必须使用共享服务器来配置。

 

5.4     文件

  3、存储结构(Database)

5.4.1          参数文件

参数文件(parameter
files)用于在启动实例的时候配置数据库。当建立数据库的时候,用户就可以运行初始化文件(一种形式的参数文件,通常是指pfile或者init.ora文件),规定数据库中所使用的各种设置值。这些设置包括了数据库实例名称(SID)、数据库主要文件的位置、以及实例所使用的主要内在区域的大小等内容。在这个初始文件中还会规定其他许多参数。该文件的名称通常为init<SID>.ora。例如,如果数据库实例名称是SLAPDB,那么它的初始化文件就是initslapdb。这个文件的内容非常简单。用户将会发现在各行中使用等号所分隔的参数和它的值。例如,这是一个Windows服务器上的init.ora文件的摘录(在C:\oracle\admin\YONGFENG\pfile,其中YONGFENG是数据库):

##############################################################################

# Copyright (c) 1991, 2001, 2002 by Oracle Corporation

##############################################################################



###########################################

# MTS

###########################################

dispatchers="(PROTOCOL=TCP) (SERVICE=YONGFENGXDB)"

###########################################

# Diagnostics and Statistics

###########################################

background_dump_dest=c:\oracle\admin\YONGFENG\bdump

core_dump_dest=c:\oracle\admin\YONGFENG\cdump

timed_statistics=TRUE

user_dump_dest=c:\oracle\admin\YONGFENG\udump



###########################################

# File Configuration

###########################################

control_files=("c:\oracle\oradata\YONGFENG\CONTROL01.CTL", "c:\oracle\oradata\YONGFENG\CONTROL02.CTL", "c:\oracle\oradata\YONGFENG\CONTROL03.CTL")

.. ..

在数据库建立之后,就会在实例启动期间使用初始化文件。当实例启动的时候,它就会读取文件,建立我们以上讨论的设置,以及许多其它管理员可以在文件中设置的数据参数。几乎所有的参数都有默认值,因此初始化文件会根据怎样配置数据库才能满足特定的需求,在大小有所变化。

会因许多原因使用参数文件。最明显的就是,用户想要改变默认设置来适应数据库的需求。在数据库中能够打开的游标数量、数据库能够在一个时刻同时管理的进程数量、以及数据库的默认语言或者字符集,都是用户可以根据应用的需求和用户正在访问的数据库进行改变的设置。另一方面,还可以使用其他的一些参数调整实例。共享池大小、数据库的默认数据库尺寸、以及缓存中的数据块数量等内存参数都是这类参数的主要示例。

注意:

在用户修改这个文件中的设置之前,要确保不仅可以理解要进行修改的参数,而且要知道一旦修改生效,它将会对数据库带来的影响。如果没有正确设置参数,那么用户的数据库就会低效运行,甚至可能根本不能够运行!

只能够通过关闭数据库进行更新的参数称为静态初始化参数。还有一些参数可以在当前数据库实例中进行更新,它们被称为动态初始化参数。这样的动态参数能够使用以下2种SQL语句进行更新:

  • ALTER SYSTEM——该命令会产生全局影响,影响当前数据库上运行的所有会话。
  • ALTER SESSION——该命令将会修改当前会话进行期间的参数。

作为修改服务器参数的示例,我们要讨论怎样在系统层次修改数据库中的一些参数。首先,我们要OPEN_CURSORS和UTL_FILE_DIR的值。因为用户打开的任何游标都要影响OPEN_CURSORS计数,所以我们可能要在系统范围的基础上OPEN_CURSORS。对于UTL_FILE_DIR也是如此。如果数据库中的任何用户想要使用UTL_FILE数据库补充程序包,在主机文件系统上读取或者写入文件,那么就必须正确配置服务器参数UTL_FILE_DIR。我们来找到一些这样的参数值,然后尝试使用ALTER
SYSTEM修改它们。

SQL> show parameters open_cursors

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------

open_cursors                         integer     300

SQL> show parameters utl_file_dir

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------

utl_file_dir                         string

SQL>

假定要将OPEN_CURSORS参数从300修改为500,将UTL_FILE_DIR修改为/tmp/home/sdillon。可以发现OPEN_CURSORS是一个动态初始化参数(因为不关闭数据库就可以执行它),而UTL_FILE_DIR是静态参数(因为当数据库运行时,会拒绝它):

SQL> alter system set open_cursors=500

  2  /

系统已更改。

SQL> alter system set utl_file_dir='/home/sillon'

  2  /

alter system set utl_file_dir='/home/sillon'

                 *

ERROR 位于第 1 行:

ORA-02095: 无法修改指定的初始化参数

服务器参数文件

服务器参数文件是Oracle
9i中所提供的新型参数文件,它可以管理数据库参数和值。服务器参数文件是静态文本初始化文件(init<SID>.ora)的替代物。可以将这些二进制文件看作是能够跨越实例关闭和启动,保存的参数和值的知识库。当使用ALTER
SYSTEM
SQL语句对数据库进行改变时,正在执行的用户就可以选择是在服务器参数文件中、内存中还是同时在两者中进行改变。如果对服务器参数文件进行了改变,那么改变就会永久存在,不必再手工修改静态初始化文件。ALTER
SYSTEM SQL有三个不同的选项可以用来规定改变的“范围“:

  • SPFILE。当用户规定SPFILE范围的时候,能够在实例运行期间进行的修改会立即产生作用。不必进行重新启动。对于不能在实例运行期间进行修改的参数,就只会在服务器参数文件中进行改动,并且只在实例再次启动之后产生作用。
  • MEMORY。Oracle 9i之前的功能。规定了SCOPE=MEMORY的ALTER
    SYSTEM语句将会立即产生作用,并且不会对服务器参数文件进行修。当实例重新启动之后,这些对数据库参数的改变就会丢失。
  • BOTH。这个用于ALTER
    SYSTEM命令范围的选项是前2个范围的结合。唯一在这个命令中规定的参数就是那些可以在实例运行期间进行改变的参数,当作出改变之后,改变会立刻影响所有的会话,而且会对服务器参数文件进行更新,以便在实例重新启动之后,也反映出改变。

用户可以使用数据词典中的3个视图来分析用户数据库的参数。它们是V$PARAMETER、V$SYSTEM_PARAMETER和V$SPPARAMETER。查询这些视力将会返回如下与用户会话、系统和服务器参数文件相关联的数据库参数特性。

  • V$PARAMETER。用于用户当前会话的数据库参数。
  • V$PARAMETER2。与V$PARAMETER相同,但是它使用2个不同的行来列出参数,以代替使用逗号分隔的一个行(如在V$PARAMETER中)。
  • V$SYSTEM_PARAMETER。用于整个系统的数据库参数。新会话会从这个视图中获取它们的参数值。
  • V$SYSTEM_PARAMETER2。这个视力如同于V$PARAMETER2,它会将参数个称为个不同的行列出,以代替使用逗号分隔的一个行。
  • V$SPPARAMETER。这个视力包含了已存储参数文件的内容。

  Oracle的存储结构主要包含逻辑结构和物理结构。物理结构指系统中的一组文件。逻辑结构是一种层次结构。主要由:表空间、段、区和数据块等概念组成。

5.4.2          控制文件

控制文件(control
files)是Oracle服务器在启动期间用来标识物理文件和数据库结构的二进制文件。它们提供了建立新实例时所需的必要文件目录。Oracle也会在常规的数据库操作期间更新控制文件,以便准备为下一次使用。

 

5.4.3          数据文件

数据文件是存放用户数据的地方。这些文件对于用户数据的稳定性和完整性十分重要。

二、内存结构

5.4.4          表空间

表空间(tablespaces)是用户可以在Oracle中最大的逻辑存储结构。用户在数据库中建立的所有内容都会存储在表空间中。每个Oracle数据库库都提前配置有SYSTEM表空间,它存储了数据词典以及系统管理信息。用户和应用通常要使用它们自己的表空间存储数据。定稿到临时表中的数据,为大规模排序操作磁盘的数据块,其他许多类型的临时数据都会写入到表空间中。

用户可以使用一个默认表空间和一个临时表空间。默认表空间是在默认情况下存储用户对象的表空间。当用户建立表的时候,就可以选择通知Oracle将表数据存储在那个表空间中。如果用户没有规定表空间,那么Oracle就会将表数据存储在用户的默认表空间中。用户的临时表空间是写入临时数据的地方。当用户进行的查询将数据块交换到磁盘上的时候(因为在内在中没有足够的空间处理整个查询),就会将所交换的数据存储到用户的临时表空间中。当用户将数据写入到临时表的时候,这些数据也会写入到用户的临时表空间中。

  内存结构是Oracle中最为重要的部分,内存也是影响数据库性能的第一因素。

5.4.5          段

段(segment)是用户建立的数据库对象的存储表示。用户建立的每一个表都会有一个在表空间存储的逻辑段。为用户所建立的对象生成的段都要在磁盘上消耗空间。有三种类型的段:

  • 数据段是存储表、索引、簇以及表分区这样的常规应用数据的地方。
  • 临时段是临时表空间中的段,可以用来存储临时表、引起内存页交换的SQL操作这样的内容。
  • 回滚段用于管理数据库中的UNDO数据,并且为事务处理提供数据库的读取一致性视图。

回滚段,Oracle的撤消机制

当用户修改数据库中的数据时,只有当用户向数据库提交了用户数据之后,改变才会永久发生。用户可以在具有上百万行的表中改变各个行,然后决定回滚这些改变,也就是说没有人会知道用户试图改变过这些记录。因此,当回滚事务处理的时候,我们从最后使用COMMIT语句以来所做的修改就会被取消。这就是回滚段发挥作用的地方。

自动撤消管理

在Oracle
8i和更早的数据库发布中,管理员必须手工建立表空间来存储它们的回滚段。回滚段必须根据用户正在进行的事务处理类型,以及用户完成查询所要花费的时间数据进行正确调整。在大多数情况下,分配回滚大小要涉及知识、经验和一点运气。

在Oracle
9i,管理员可以建立UNDO表空间去管理实例所需的所有回滚数据。在这种操作模式下,不需要再调整单独的回滚段的大小,数据库可以在表空间中为用户自动管理所有事务处理的UNDO数据。

使用自动撤消提供了以前使用手工回滚段模式时没有的新特性,称为UNDO保持(UNDO
retention)。UNDO_RETENTION是一个新的init.ora参数,它规定了在事务处理提交之后回滚数据应该保留的秒数。

另一个与UNDO数据管理有关的新概念是UNDO配额(UNDO
quota)。在Oracle中,称为资源管理器的特性可以让用户限制各种资源的消耗。用户可以限制的资源示例包括查询时间、进程的CPU使用、临时表空间使用。通过使用资源管理器,用户就可以定义称为消费组(consumer
group)的用户组,并且为这些组赋予UNDO_QUOTA。这可以阻止用户所运行的行为不佳的事务处理在UNDO表空间中消耗超额的UNDO空间共享区域。

用户没有被强制使用这种类型的撤消管理;它只是一个(强烈推荐的)选项。在Oracle
9i中有一个新的称为UNDO_MODE的新init.ora参数,可以让用户规定他要在数据库中使用的撤消模式:

###########################################

# System Managed Undo and Rollback Segments

###########################################

undo_management=AUTO

undo_retention=10800

undo_tablespace=UNDOTBS1

  Oracle的内存存储的主要内容如下:

5.4.6          盘区

段是由一个或者多个盘区构成。盘区是用来为段存储数据的逻辑上连接的数据库库块集合。当建立数据库对象的时候(无论如何,它都需要空间消耗),它就会建立一个或者多个盘区来存储它的数据。盘区数据和盘区大小可以在正在建立的对象的storage子句中规定。例如,用户可以使用如下SQL语句建立一个表:

SQL> create table my_hash_table(

  2   name varchar2(30),

  3   value varchar2(4000))

  4  tablespace users

  5  storage(

  6   initial 1M

  7   next 512K

  8   pctincrease 0

  9   minextents 2

 10   maxextents unlimited);

表已创建。

 

注意:

在Oracle
9i中,默认的表空间的盘区(extent)管理风格是局域管理,而不是词典管理。这意味着在以上的语句中,INITIAL、NEXT、PCTINCREASE和MAXEXTENTS完全没有必要。

INITIAL。设置为对象建立的第一个盘区的大小。

NEXT。这是随后的盘区的大小。

MINEXTENTS。这是立即分配的盘区数量。

MAXEXTENTS。这是能够为这个表建立的盘区的最大数量。它可以为一个数量值或者UNLIMITED。

当我们向表中写入超过(1MB+512KB)1.5MB的数据之后,Oracle就要分配另外的盘区来对段进行扩展。这个盘区可能与其它的盘区不相邻(事实上,它甚至在不同的文件中),但是将要与这个对象的其它盘区处于相同的表空间中(USERS)。当这个盘区填满之后,如果Oracle还需要向表中放入更多的数据,就会分配另一个盘区。

  1、程序代码(PL-SQL、Java)。

5.4.7          数据块

数据块(data
blocks)代表了数据库中最细致的逻辑数据存储层次。在此最低层次上,盘区是由连接的数据块集合构成,而盘区构成了段,段以构成了表空间,表空间又构成了数据库。

数据块(data
blocks)->盘区(extent)->段(segment)->表空间(tablesapce)->数据库(data
base)

通常,数据块的大小可以是2KB、4KB、8KB、16KB或者32KB。一般的情况下,它们为2、4或者8KB。然而,在Oracle
9i中,已经允许为各个表空间规定数据块大小。在设计用户数据库的时候,可以为不同类型的数据和/或不同类型的数据访问使用不同的数据块大小。

下面是数据块的组成部分以及各部分中保存的信息:

  • 数据块题头。在该头中存储着数据类型(段类型)以及块的物理位置等信息。
  • 表目录。在一个数据块中可以存储多个表的数据。表目录告诉Oracle在数据块中存储了哪些表。
  • 行目录。该部分告诉Oracle数据块中各行的物理位置。
  • 自由空间。当第一次分配数据块的时候,它只有自由空间,没有行数据。随着行被插入,自由空间就会越变越小。直到数据块完全充满行(依赖段的存储参数)。
  • 行数据。这是数据块中存储实际行的地方。

  2、关于已经连接的会话的信息,包括当前所有活动和非活动会话。

5.4.8          预先分配文件

当用户使用CREATE TABLESPACE或者ALTER TABLESPACE
SQL命令,为表空间建立数据文件的时候,通常要在SQL命令的SIZE子句中告诉Oracle数据文件的大小。(以Windows为例子)例如:

SQL> connect system/zyf;

已连接。

SQL> create tablespace MY_APPLICATION_TABLESPACE

  2  datafile 'C:\oracle\oradata\YONGFENG\1.mdf' size 20M

  3  autoextend on next 10M maxsize 1000M

  4  extent management local uniform size 1M

  5  /

表空间已创建。

运行Win+R,输入cmd,查看目录:

 必发娱乐官方网站 13

删除表空间DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES:

SQL> drop tablespace MY_APPLICATION_TABLESPACE including contents and datafiles;

表空间已丢弃。

  3、程序运行时必须的相关信息,如查询计划。

5.4.9          重做日志文件

用户的数据库文件会在表、索引以及其他的数据库结构中存储大多数当前数据的表示,用户的重做日志文件会存储所有数据库中发生的修改。它们是用户的事务处理日志。这些文件十分重要,它们可以用于在出现介质故障、电源中断或者其他导致用户数据库异常中断或者出现某种损坏的时候进行实例恢复。如果没有这些文件,那么用户能够执行的唯一恢复手段就是从最后的完整备份中进行复原。

  4、Oracle进程之间共享的信息和相互交流的信息,如锁。

5.4.10      临时文件

Oracle中的临时文件(temporary
files)处理方式与标准数据文件稍有不同。这些文件确实包含数据,但是只用于临时的操作,例如对程序全局区域(Program
Global
Area,PGA)不能够容纳的数据进行排序,或者将数据插入到临时表或者索引中。只会临时存储数据,一旦建立它的会话完成了操作,就会从数据库中将这些数据完全删除。

数据库中的每个用户都有一个为其账号指定的临时表空间。当用户由于要在SELECT语句中使用大规模的SORT
BY或者GROUP
BY操作,或者要将数据插入到临时表空间,而需要将数据定稿临时表空间的时候,就会使用这个临时表空间。临时表空间问题使用临时文件进行建立,而不应该使用标准数据文件。其语法如下所示:

SQL> create temporary tablespace temp_tblspace

  2  tempfile 'C:\oracle\oradata\YONGFENG\2.dbf'

  3  size 10M

  4  extent management local

  5  uniform size 512K

  6  /

表空间已创建。

注:与tablespace的drop用法相同删除临时表空间。

  5、哪些别永久存储在外围存储介质上,被缓存在内存中的数据。(如数据块)。

1.词典管理临时表空间

当建立临时表空间的时候,用户需要确定是要使用局域管理表空间,还是要使用词典管理表空间。在Oracle
8i和Oracle
9i中优先的机制是局域管理表空间。我们在以上使用的语法就会建立一个局域管理表空间,这是因为在CREATE
TABLESPACE语句中所使用的子句。为了建立与以上的TEMP_TBLSPACE表空间具有相同结构的词典管理临时表空间,可以使用如下语法:

create tablespace temp_tblspace_dm

datafile 'C:\oracle\oradata\YONGFENG\3.dbf'

size 10M

default storage(

initial 1M

next 512K

minextents 1

pctincrease 0)

extent management dictionary

temporary

/

表5-1 建立词典管理临时表空间与建立局域管理临时表空间的差异

词典管理临时表空间

局域管理临时表空间

CREATE TABLESPACE

CREATE TEMPORARY TABLESPACE

DATAFILE

TEMPFILE

EXTENT MANGEMENT DICTIONARY

EXTENT MANAGEMENT LOCAL

DEFAULT STORAGE clause

AUTOEXTEND clause

TEMPORARY at the end of the statement

TEMPORARY as a part of CREATE

TEMPORARY TABLESPACE

 

 

2.“临时”标准表空间

用户容易犯的一个常见错误就是,为账号建立一个将要作为临时表空间使用的表空间,但是表空间却不是临时表空间,而只是一个常规表空间(使用datafile,而不是tempfile)。以下代码就是这样一个示例:

SQL> create tablespace temp_tblspace2

  2  datafile 'C:\oracle\oradata\YONGFENG\4.dbf'

  3  size 10M

  4  extent management local

  5  uniform size 64K

  6  /

表空间已创建。

尽管将用户的临时表空间指定到一个常规表空间(换句话说,不是临时表空间)上可以工作的很好,但它还是会为数据库管理员带来一些额外的工作。标准表空间应该作为常规备份或者恢复过程的组成部分进行备份,我们的示例会为备份列表增加不必要的表空间。应该尽可能避免这种作法。

  按照内存的使用方法不同,又将Oracle的内存分为系统全局区(SGA),程序全局区(PGA)

5.4.11      Oracle管理文件

在Oracle
9i中,Oracle引入了Oracle管理文件。当管理员为他们的数据库使用Oracle管理文件的时候,就可以避免对以下类型的数据库对象进行手工文件管理:

  • 表空间
  • 控制文件
  • 在线重做日志文件

使用Oracle管理文件并不阻止管理员使用旧有的文件管理。用户仍然可以为表空间、重做日志文件以及控制文件规定明确的文件名。例如,可以为从Oracle
8i升级到Oracle 9i的数据库使用混合的方法。

启用Oracle管理文件很简单。在用户的参数文件中,可以将名为DB_CREATE_FILE_DEST的参数设置为Oracle为数据文件、临时文件、在线重做日志文件以及控制文件使用的默认目录,由于Oracle推荐在多个设备上镜像控制文件和在线重做日志文件,所以用户可以使用DB_CREATE_ONLINE_LOG_DEST_n的格式,设置多个使用序列编号命名的参数。用户的参数在Windows
2000数据库服务器上可能看起来如下所示:

db_create_file_dest=’D:\Oracle\groovylap\oradata’

db_create_online_log_dest_1=’D:\Oracle\grouvylap\oradata’

db_create_online_log_dest_1=’E:\Oracle\grouvylap\oradata’

db_create_online_log_dest_1=’F   :\Oracle\grouvylap\oradata’

在数据库建立在线重做日志文件或者控制文件的时候,就会将它们放到符合参数名称末尾序列编号的目标目录中。第一个文件将会建立在D:\Oracle\groovylap\oradata中,第二个文件将会建立在E:\Oracle\groovylap\oradata中,等等。对于用户在参数文件中规定的每一个DB_CREATE_ONLINE_LOG_DEST_n参数都会建立一个文件。如果用户没有规定任何额外的参数,那么Oracle就会使用DB_CREATE_FILE_DEST参数。可以注意到,如果没有设置这个参数,Oracle就将不能使用Oracle管理文件。

  1、SGA:(System Global
Area,SGA)
所有用户都可以访问的实例共享内存区域。数据块、事务处理日志、数据词典信息等都存储在SGA中。

5.5     内存区域

Oracle的服务器进程和许多后台进程要负责在这些内在区域中写入、更新、读取和删除数据。3个主要内存区域:

  • 系统全局区域(System Global
    Area,SGA)。这是所有用户都可以访问的实例的共享内存区域。数据块、事务处理日志、数据词典信息等都存储在SGA中。
  • 程序全局区域(Program Global
    Area,PGA)。这是一类没有共享的内存,它专用于特定的服务器进程,只能够由这个进程访问。
  • 用户全局区域(User Global
    Area,UGA)。这个内存区域会为我们在本章前面讨论的用户进程存储会话状态。根据用户数据库是配置为专用服务器模式,还是共享服务器模式,UGA可以SGA或者PGA的一部分。它为用户会话存储数据。

  SGA是Oracle系统为实例分配的一组共享缓冲存储区,用于存放数据库数据和控制信息,以实现对数据库数据的管理和操作。

5.5.1          系统全局区域

SGA是一个共享内存区域,是数据库操作的中枢。它所包含的数据有缓存数据块(在内存中存储,可以被用户的会话使用),在数据库上执行的SQL语句(以及它们的执行方案),由许多用户执行的过程,函数和触发器这样的程序单元(因此要共享)等。这些存储在共享内存区域中的数据可以被运行在Oracle实例中的大量进程快速访问。所有连接到数据库的用户都可以使用SGA中存储的数据。由于数据是共享的,所有系统全局区域有时也称为共享全局区域(Shared
Global Area)。

如果服务器中没有足够的内存可以容纳整个SGA,那么就会将部分SGA页交换到磁盘上。因为Oracle会认为SGA位于实际内存中,所以就会导致不合适的不良性能。当主机操作系统不能满足实际内存需求的时候,Oracle就会使用数据文件中的临时空间“虚拟”不可获得的内存。

注意:

这种意想不到的I/O急用和挂续的内在页交换不应该是产品环境中使用Oracle的方式,无论如何都应该避免这种方式。

  1. ### 数据块缓存

数据块缓存(block buffer cache),另外也称为数据库缓存(database buffer
cache)或者简称为缓存(buffer
cache),可以用于存储读入内存的数据块副本。这些数据块是由正在执行的服务器进程放入缓存的,它们可以是读入这些数据块来回答由用户进程提交的查询的SQL语句,或者是一个根据用户进程指令对数据块进行的更新。数据块会在缓存中存储,以便当服务器进程需要读取或者写入它们的时候,Oracle能够避免执行不必要的磁盘I/O操作,进而增强数据库的读/写性能。

随着服务器进程将数据读入缓存,缓存就能够使用内部机制追踪哪些数据块应该写入磁盘,哪些数据块由于缺少使用而应该移出缓存。在Oracle
8i和Oracle
9i中,这要通过维护一个特定数据块被访问的时间数量计数(称为接触计数(touch
count))来实现。当读取数据块的时候,它的接触计数就会增加。如果Oracle需要将数据块从缓存中清除,为服务器进程读入内存的新数据块腾出空间,它就会找到具有最小接触计数的数据块,并将它们从缓存中清除。

另一个用来在缓存中维护数据块信息的机制称为写入列表(Writelist或者脏列表Uirtylist)。这个列表负责标识缓存中已经被服务器进程修改的那些数据块。这个列表上的数据块在从内存清除之前需要被写入磁盘。

针对数据块尺寸提供缓存

为整个数据库定义默认数据块大小的数据库参数是db_block_size。对于默认的缓存(默认意味着针对数据库的默认数据块大小提供的缓存),数据库参数是db_cache_size。对于数据库中的其它数据块大小,存在相应的db_nk_cache_size参数(即db_2k_cache_size、db_4k_cache_size等)。应该注意,用户不能够为的数据块大小定义db_nk_cache_size参数。参数文件init.ora所示如下:

###########################################

# Cache and I/O

###########################################

db_block_size=8192

db_cache_size=16777216

db_file_multiblock_read_count=32

  SGA主要包括:

1.重做日志缓存

重做日志缓存(redo log
buffer),也称为重做缓存,可以为在线重做日志文件存储数据。

相对于缓存、共享池以及大型池这样的SGA中的其它内存区域,频繁写入磁盘的日志缓存。     
相对较小。重做日志缓存的默认大小是500K或者128K x
CPU_COUNT,它也可以更大一点(CPU_COUNT是Oracle可以使用的用户主机操作系统的CPU数量)。因为只要重做日志缓存包含了1MB的数据,日志写入器就会将缓存写入到磁盘,所以拥有500MB的重做日志缓存是没有意义的。

初始化参数LOG_BUFFER会规定重做日志缓存的字节大小。重做日志缓存的默认设置是主机操作系统上数据块最大尺寸的4倍。

  1)数据缓冲区:    

2.共享池

共享池(shared
pool)可用于在内存中存储要被其他会话使用的信息。这种信息包括SQL语句、PL/SQL代码、控制结构(日对表行或者内存区域的锁定),以及数据词典信息。

库缓存。存储SQL执行方案以及已缓存的PL/SQL代码。

词典缓存。存储数据词典信息。

用户在数据库中所做的几乎所有事情都会频繁使用Oracle数据词典。即使用户没有直接在数据词典上提交查询,Oracle也会在后台使用这些表和视力来查询提供结果,在表上执行DML操作,并且执行DDL语句。由于这个原因,Oracle在共享池中保留了称为词典缓存的特殊空间来存储数据词典的信息。

共享池使用了经过修改的最近最少使用(LRU)算法,它与Oracle
8.0的数据块缓存所用算法大体相似。

共享池 -> SQL语句、PL/SQL代码、控制结构、数据词典

  数据块缓存区(datablockbuffercache)是SGA中的一个高速缓存区域,用来存储从数据库中读取数据段的数据块(如表、索引和簇)。数据块缓存区的大小由数据库服务器init.ora文件中的DB_LOCK_BUFFERS参数决定(用数据库块的个数表示)。在调整和管理数据库时,调整数据块缓存区的大小是一个重要的部分。

3.大型池

大型池(large
pool)是数据库管理员能够配置的可选内存空间,可以用于不同类型的内存存储。将这个区域称为大型池的原因不是因为它的整体规模应该经SGA中的其他内在区域大;而是因为它采用了超过4K字节块来存储所缓存的数据,而4K是共享池中字节块的大小。

大型池的不同之处不仅是因为它所存储的数据的典型大小,而且也是因为它所存储的数据类型:

  • 用于共享服务进程的会话内存
  • 备份和复原操作
  • 并行执行消息缓存

当数据库配置为共享服务模式的时候,服务器进程就会将它们的会话数据存储在大型池中,而不是共享池中。

大型池 ->会话

  因为数据块缓存区的大小固定,并且其大小通常小于数据库段所使用的空间,所以它不能一次装载下内存中所有的数据库段。通常,数据块缓存区只是数据库大小的1%~2%,Oracle使用最近最少使用(LRU,leastrecentlyused)算法来管理可用空间。当存储区需要自由空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置。通过这种方法,将最频繁使用的数据保存在存储区中。

5.5.2          程序全局区域

PGA是为单独的服务器进程存储私有数据的内存区域。与所有服务器进程都可以访问的共享内存区域SGA不同,数据库写入器、日志写入器和许多其他后台进程,都只为各个服务器进程提供一个PGA。PGA只能够由它们自己的服务器进程访问。

有一个称为用户全局区域(UGA)内存区域,它会存储会话状态。UGA的位置依赖于服务器是运行在共享服务模式,还是专用服务器模式。在专用服务器模式中,UGA会在PGA中分配,只能够由服务器进程访问。然后,在共享服务器模式中,UGA会在大型池中分配,并且可以由任何服务器进程访问。这是因为不同的服务器进程要处理用户进程的请求。在这种情况下,如果UGA(用户会话状态)存储在服务器进程的PGA中,随后由其它服务器在进程处理的请求就不能访问这些数据。

这意味着如果用户服务器运行于共享服务器模式,用户就需要正确设置大型池的规模。在大型池需要足够大,不仅要能够容纳大型池通常存储的所有内容,而且还要能够容纳同时连接用户数据库的各个用户的会话状态。运行于共享服务器模式时所存在的危险是,消耗过多内存的会话导致数据库中的其余会话出现内存问题。为了防止失控的会话,用户可以将PRIVATE_SGA数据库参数设置为用户能够分配的内存数量。

  然而,如果SGA的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据块缓存区中的空间。当多个应用程序共享同一个SGA时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺SGA中的空间。其结果是,对数据块缓存区的数据请求将出现较低的命中率,导致系统性能下降。

5.6     后台进程

  

5.6.1          进程监控器

进程监控器(Process Monitor,PMON)有两个主要的职责:

  • 监控服务器进程,以确保能够销毁发生损坏或者出现故障的进程,释放它们的资源。

假如正在使用一个更新表中大量行的服务器进程。那么直到事务处理提交或者回滚,进程所更新的所有行都要被锁定。如果服务器进程由于某种原因死掉,那么数据库就会认为那些行都要被锁定,并且会允许其他用户更新它们之前,等候它们被释放。PMON会处理这种情况。在共享服务器进程的情况下,PMON会重新启动服务器进程,以便Oracle能够继续为接入的用户进程请求服务。

  • 在主机操作系统上使用Oracle监听器注册数据库服务。

全局数据库名称、SID(数据库实例名称),以及其他数据库支持的服务都要使用监听器注册。

  2)字典缓冲区:

5.6.2          系统监控器

Oracle的系统监控器(System
Monitor,SMON)有许多职责。我们不能在这里涵盖所有内容,只将一些最重要的职责罗列如下:

在出现故障实例的情况下,SMON负责重新启动系统执行崩溃恢复。这包括了回滚未提交事务处理,为实例崩溃的时候还没有定稿数据文件的事务处理在数据库上应用重做日志表项(来自于归档的重做日志文件)等任务。

  • SMON将会清除已经分配但是还没有释放的临时段。在词典管理表空间中,如果有大量盘区,那么清除临时段所花的时间将会非常多。这可以导致数据库启动时报性能问题,因为SMON将会在这个时候试图清除临时段。
  • SMON也会在词典管理表空间中执行盘区结合。这就是说,如果表空间中有多个自由盘区位置相邻,SMON就能够将它们结合为一个单独的盘区,以便能够满足对磁盘上更大盘区的请求。

  数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、数据文件名、段名、盘区位置、表说明和权限,当数据库需要这些信息(如检查用户查询一个表的授权)时,将读取数据字典表并且将返回的数据存储在字典缓存区的SGA中。

5.6.3          数据库写入器

数据块会从磁盘读入缓存,各种服务器进程会在那里对它们进行读取和修改。当要将这些缓存中的数据块写回到磁盘的时候,数据库写入器(Database
Writer,DBWn)就要负责执行这些数据的写入。

在Oracle中,很多时候都要对操作进行排队以待稍后执行。这称为延迟操作(deferred
operation),因为这样可以大批执行操作,而不是一次执行一个操作,所以它有益于长时间运行的性能。另外,如果每次服务器进程需要使用数据块上的时候,都要从数据文件读取和写入,那么性能就会非常糟糕。这就是为什么需要将Oracle写入延迟到Oracle需要将数据块写入磁盘的时候再进行的原因。

如果不理解Oracle的体系结构,用户可能就会认为当执行COMMIT语句的时候,用户对数据进行的修改会写入磁盘进行保存。毕竟,这是大多数应用采用的方式,所以认为Oracle会做同样的事情也很自然。然后,提交并不能够保证数据库写入器执行写入的时间。数据库写入器基于如下两个不同的原因,执行从内存到磁盘的数据块写入:

(1)     
在缓存中不能够为服务器进程从磁盘读入的数据块提供足够的时间。在这种情况下,就要将脏(修改)数据写入到磁盘,以包容新数据块。

(2)      Oracle需要执行一个检查点(checkpoint)。

检查点是数据库中发生的事件,它可以让数据库写入器将数据块从缓冲池写入到磁盘。不要错误地认为检查点是唯一“保存”用户数据的方式。

对于大多数系统,一个数据库写入器就足够了,这也是Oracle为单处理器系统推荐的方式。然而,Oracle最多可以允许10个数据库写入器(DBW0到DBW9)。频繁执行数据插入、更新或者删除的应用将会受益于多个数据库写入器的配置。

  数据字典缓存区通过最近最少使用(LRU)算法来管理。字典缓存区的大小由数据库内部管理。字典缓存区是SQL共享池的一部分,共享池的大小由数据库文件init.ora中的SHARED_POOL_SIZE参数来设置。

5.6.4          日志写入器

日志写入器(Log
Writer,LGWR)负责向在线重做日志文件中记录所有数据库的已提交事务处理。这个进程将所有数据从重做日志缓存中写入到现行的在线重做日志文件中。日志写入器会在如下4种不同情况执行写入操作:

  • 事务处理进行提交
  • 重做日志缓存已经填充了1/3
  • 重做日志缓存中的数据数量达到了1MB
  • 每三秒的时间

尽管已经将事务处理提交写入在线重做日志文件,但是修改结果可能还没有写入到数据文件。换句话说,在重做日志文件中的提交记录决定了事务处理是否已经提交,而不用写入数据文件。这个过程就叫做快速提交(fast
commit)——将表项写入重做日志文件,在以后的某个时间再写入数据文件。

  如果字典缓存区太小,数据库就不得不反复查询数据字典表以访问数据库所需的信息,这些查询称为循环调用(recuesivecall),这时的查询速度相对字典缓存区独立完成查询时要低。

5.6.5          归档器

尽管实例故障可以通过在线重做日志文件中的事务处理日志恢复,但是媒介故障却不能。如果磁盘遇到了不可恢复的崩溃,那么恢复数据库的唯一方式就是利用备份。通常要每个月,每个星期甚至每天执行备份。然而,重做日志文件不能保存整体的有价值的事务处理。因此,我们需要在事务处理被覆写之前保存它们。

这就是引入归档器(archiver,ARCn)的地方。大多数产品数据库都会运行ARCHIVELOG模式中。

  

5.6.6          检查点

检查点(CheckPoint,CKPT)进程负责使用最新的检查点信息更新所有的控制文件和数据文件题头。这种操作称为检查点。数据库定稿器会周期性地将它的缓存写入到磁盘,它会存储检查点。正如我们以上提到的,日志切换也可以激活检查点。检查点信息会在数据库恢复期间使用。当SMON恢复数据库的时候,它会决定最后在数据文件中记录的检查点。必有要将数据文件头和控制文件中最后记录的检查点之后的、在线重做日志文件中的各个表项重新应用到数据文件。

用户数据库可以在每次出现重做日志切换的时候激活一个检查点。这是用户可以在数据库中规定的最小检查点频率。用户可以通过修改LOG_CHECKPOINT_INTERVAL和LOG_CHECKPOINT_TIMEOUT这样的init.ora参数来提高检查点事件的频率。

  • LOG_CHECKPOINT_INTERVAL可以告诉Oracle,在增量检查点之后,向重做日志文件写入多少个物理操作系统数据块就会触发检查点。
  • LOG_CHECKPOINT_TIMEOUT规定了增量检查点和最后一次写入重做日志之间的秒数。

在Oracle 9i标准版本上,这个设置的默认值是900秒(15分钟),Oracle
9i企业版本上的默认设置是1800秒(30分钟)。

为了验证用户检查点是否以所需频率激活,可以使用数据库参数LOG_CHECKPOINTS_TO_ALTER=true。

  3)日志缓冲区:

5.6.7          作业队列协调器,作业进程(CJQ0&Jnnn)

必发娱乐官方网站,Oracle提供了在Oracle中规划将要在数据库后台运行的进程或者作业(job)的功能。这些接受规划的作业可以在特定的日期和时间运行,并且可以为随后的执行指定时间间隔。例如,用户可以告诉在每天晚上12:00建立汇总表。通过采用这种方式,不用等待Oracle在实际的时间运行查询。就可以在第二天报告汇总信息。数据库中还有另外的功能,可以让用户有能力修改和移走已经向数据库提交的作业。

可以使用称为DBM_JOBS的数据词典视图查看在数据库中运行的作业。这样的视图还有USER_JOBS和ALL_JOBS。

  重做项描述对数据库进行的修改。它们写到联机重做日志文件中,以便在数据库恢复过程中用于向前滚动操作。然而,在被写入联机重做日志文件之前,事务首先被记录在称作重做日志缓冲区(redologbuffer)的SGA中。数据库可以周期地分批向联机重做日志文件中写重做项的内容,从而优化这个操作。重做日志缓冲区的大小(以字节为单位)由init.ora文件中的LOG_BUFFER参数决定。

5.6.8          恢复器

在Oracle中,可以使用单独的事务处理更新数据库中的数据。由于它要在分布式数据库上执行(换句话说,还有用户当前工作的数据库以外的其它数据库),所以这样的事务处理称为分布式事务处理。这对于许多必须保持同步的系统来讲十分有效。通常,客户最初登录的数据库会作为一个协调器,询问其它的数据库是否准备进行提交(例如数据更新)。

  • 如果所有数据库都发回确认响应,那么协调器就会发送一个消息,让提交在所有数据库上永久生效。
  • 如果有数据库因为没有准备好进行提交,发回否定的回答,那么整个事务处理都会进行回滚。

这个过程称为两阶段提交,是维护分布式数据库原子性的方式。如果在一个系统上进行更新,那么也必须在其它的系统上进行相同的更新。

在单独的Oracle实例中,PMON负责周期性启动,来判断是否有服务器进程发生了故障,因而必须要消除实例中的事务处理数据。

对于分布式事务处理,这项工作留给恢复器(recoverer,RECO)进程。如果远程数据库已经将它们的“准备状态”返回为YES,但是协调器还没有通知它们进行提交之前出现了错误,那么事务处理就会成为不确定的分布式事务处理(in-doubt
distributed
transaction),这就是恢复器进程的职责。恢复器将要试图联系协调器,并判定事务处理的状态,连接请求将会采用指定时间继续,直到成功。连接试图之间的时间会随着连接失败成指数增长。一旦连接到协调器,恢复器就会提交(或者回滚)事务处理。

注意:

如果在发送“准备状态”消息之前,或者协调器已经发出了提交或者回滚的命令之后出现故障,那么事务处理的结果就不会有疑问。

 

5.7     系统结构概貌

在图5-3中,用户将会了解Oracle体系结构的各种组件。在图示的中心是SGA,它包含了各种内存池(大型池、重做日志缓存、数据库缓存、共享池以及Java池)。我们还可以在SGA之下看到服务器进程(Snnn),它可以作为数据库缓存池、数据库文件和用户进程之间的中介。在左边的试问,可以看到归档器进程(ARCn),它可以与SGA和日志写入器协同工作,将数据离线存储到归档日志中。在图示的顶部,可以看到恢复进程,它可以与SGA和其它数据库进行通信,解决分布式事务处理中的故障。

 必发娱乐官方网站 14

图5-3 Oracle体系结构图示

在这个图示中另一个需要指出的要点是,进程、内存区域、文件和分布式数据库之间的通信方法。组件之间的箭头意味着可以进行某种形式的通讯,这个图示使用了不同的箭头来代表系统中进行的不同类型的通信。我们可以发现在恢复器进程和分布式数据库之间存在网络通信,因为这种通信使用了Oracle
Net服务。

 

  4)共享池:    

5.8     小结

  • 用户进程:可以使用专用服务器直接与服务器进程交互,或者也可以使用伴随共享服务器的调度程序与服务器进程进行交互。
  • 服务器进程:将数据从磁盘读入数据的缓存,进而实际加速数据库的I/O操作。
  • 各个后台进程:涉及在数据库中存储、修改和获取数据时移动的部分。
  • 文件:数据文件、临时文件、控制文件、参数文件、以及重做日志文件可以用来存储用户数据库的数据词典、应用数据、硬件结构、初始化参数、事务处理日志。用户使用了逻辑结构,将数据存储在表空间、段、区域,以及最终的最小粒度层次上的数据块中。
  • Oracle的共享全局区域:可以使文件I/O看起来比它实际的速度更快。Oracle可以将从磁盘读取的数据块存储在数据块缓存中,将由服务器进程执行的SQL语句存储在共享池中,并且在重做日志缓存中维护一个所有改变的运行日志。

文章根据自己理解浓缩,仅供参考。

摘自:《Oracle编程入门经典》 清华大学出版社

 

  SQL共享池存储数据字典缓存区及库缓存区(librarycache),即对数据库进行操作的语句信息。当数据块缓冲区和字典缓存区能够共享数据库用户间的结构及数据信息时,库缓存区允许共享常用的SQL语句。

  SQL共享池包括执行计划及运行数据库的SQL语句的语法分析树。在第二次运行(由任何用户)相同的SQL语句时,可以利用SQL共享池中可用的语法分析信息来加快执行速度。

  SQL共享池通过LRU算法来管理。当SQL共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间。如果SQL共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。

  SQL共享池的大小(以字节为单位)由init.ora文件参数SHARED_POOL_SIZE决定。

  

  5)大池:

  大池(LargePool)是一个可选内存区。如果使用线程服务器选项或频繁执行备份/恢复操作,只要创建一个大池,就可以更有效地管理这些操作。大池将致力于支持SQL大型命令。利用大池,就可以防止这些SQL大型命令把条目重写入SQL共享池中,从而减少再装入到库缓存区中的语句数量。大池的大小(以字节为单位)通过init.ora文件的LARGE_POOL_SIZE参数设置,用户可以使用init.ora文件的LARGE_POOL_MIN_ALLOC参数设置大池中的最小位置。Oracle8i已不用这个参数。作为使用LargePool的一种选择方案,可以用init.ora文件的SHARED_POOL_RESERVED_SIZE参数为SQL大型语句保留一部分SQL共享池。

  

  6)Java池:

  由其名字可知,Java池为Java命令提供语法分析。Java池的大小(以字节为单位)通过在Oracle8i引入的init.ora文件的JAVA_POOL_SIZE参数设置。init.ora文件的JAVA_POOL_SIZE参数缺省设置为10MB。

  

  7)多缓冲池:

  可以在SGA中创建多个缓冲池,能够用多个缓冲池把大数据集与其他的应用程序分开,以减少它们争夺数据块缓存区内相同资源的可能性。对于创建的每一个缓冲池,都要规定其LRU锁存器的大小和数量。缓冲区的数量必须至少比LRU锁存器的数量多50倍。

  创建缓冲池时,需要规定保存区(keeparea)的大小和再循环区(recyclearea)的大小。与SQL共享池的保留区一样,保存区保持条目,而再循环区则被频繁地再循环使用。可以通过BUFFER_POOL_KEEP参数规定来保存区的大小。例如: 保存和再循环缓冲池的容量减少了数据块缓冲存储区中的可用空间(通过DB_BLOCK_BUFFERS参数设置)。对于使用一个新缓冲池的表,通过表的storage子句中的buffer_pool参数来规定缓冲池的名字。例如,如果需要从内存中快速删除一个表,就把它赋予RECYCLE池。缺省池叫作DEFAULT,这样就能在以后用altertable命令把一个表转移到DEFAULT池。

 

  2、PGA:(Program Gloabl
Area,PGA)
一类没有共享的内存、专用于特定的服务器进程,并且只能由这个进程访问。

  PGA包含单个服务器进程或单个后台进程所需的数据和控制信息。PGA是在用户进程连接到数据库并创建一个会话时自动分配的,该区内保留每个与Oracle数据库连接的用户进程所需的内存。PGA为非共享区,只能单个进程使用,但一个用户会话结束后,PGA释放。

  注意:PGA和SGA的区别:

  1、PGA与SGA类似,都是Oracle数据库系统为会话在服务器内存中分配的区域。两者的作用不同,共享程度也不同。

  2、SGA系统全局区是对系统内的所有进程都是共享的。PGA程序全局区主要是为了某个用户进程所服务的。

 

  3、UGA:(User Global
Area,UGA)
这个内存区域会为用户进程存储会话状态。根据用户数据库是配置为专用服务器模式还是共享服务器模式,UGA可以作为SGA或者PGA的一部分。它为用户会话存储数据。

 

 

三、进程结构

  在Oracle实例中,进程分为两类:用户进程和Oracle进程。Oracle进程又分为两类:服务器进程和后台进程。下面分别来介绍这3种进程。

  1、用户进程

  用户进程在数据库用户请求连接Oracle服务器时启动。当一个用户运行一个应用程序,Oracle为用户建立一个用户进程。

  

  2、服务器进程

  服务器进程用于处理连接到该实例的用户进程的请求。客户向数据库发送的SQL语句最后都要由该进程接收并执行。服务器进程可以仅处理一个用户进程的请求,也可以处理多个用户进程的请求,所以分为专用服务器共享服务器

  listener.ora文件,代码server=dedicated,含义就是设置为专用服务器。

  它可以执行下列任务:

  1)对应用锁发出的SQL语句进行语法分析和执行。

  2)从磁盘(数据文件)中读入必要的数据块到SGA的共享数据库缓冲区(该快不在缓冲区时)。

  3)将结果返回给应用程序处理。

 

  3、后台进程

  后台进程随数据库而启动,用于完成各种维护任务,如将快写入磁盘,维护在线重做日志、清理异常中止的进程等。一个Oracle实例可以用许多后台进程,但他们不是一直存在。

  后台进程包括:

  1)PMON进程监控进程  

  该进程在用户进程出现故障时执行进程恢复,负责清理内存储区和释放该进程所使用的资源。例:它要重置活动事务表的状态,释放封锁,将该故障的进程的ID从活动进程表中移去。PMON还周期地检查调度进程(DISPATCHER)和服务器进程的状态,如果已死,则重新启动(不包括有意删除的进程)。

PMON有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

  

  2)SMON系统监控进程

  该进程实例启动时,执行实例恢复,还负责清理不再使用的临时段。在具有并行服务器选项的环境下,SMON对有故障CPU或实例进行实例恢复。SMON进程有规律地被呼醒,检查是否需要,或者其它进程发现需要时可以被调用。

  

  3)DBWR数据库写入进程  

该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个Oracle后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,DBWR的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,DBWR将管理缓冲存储区,使用户进程总可得到未用的缓冲区。

Oracle采用LRU(LEAST RECENTLY
USED)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使I/O最小。在下列情况预示DBWR
要将弄脏的缓冲区写入磁盘:

当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度时,该服务进程将通知DBWR进行写。该临界长度是为参数DB-BLOCK-WRITE-BATCH的值的一半。

当一个服务器进程在LRU表中查找DB-BLOCK-MAX-SCAN-CNT缓冲区时,没有查到未用的缓冲区,它停止查找并通知DBWR进行写。出现超时(每次3秒),DBWR
将通知本身。当出现检查点时,LGWR将通知DBWR.在前两种情况下,DBWR将弄脏表中的块写入磁盘,每次可写的块数由初始化参数DB-BLOCK-
WRITE-BATCH所指定。如果弄脏表中没有该参数指定块数的缓冲区,DBWR从LUR表中查找另外一个弄脏缓冲区。

如果DBWR在三秒内未活动,则出现超时。在这种情况下DBWR对LRU表查找指定数目的缓冲区,将所找到任何弄脏缓冲区写入磁盘。每当出现超时,DBWR查找一个新的缓冲区组。每次由DBWR查找的缓冲区的数目是为寝化参数DB-BLOCK-
WRITE-BATCH的值的二倍。如果数据库空运转,DBWR最终将全部缓冲区存储区写入磁盘。

在出现检查点时,LGWR指定一修改缓冲区表必须写入到磁盘。DBWR将指定的缓冲区写入磁盘。

在有些平台上,一个实例可有多个DBWR.在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。参数DB-WRITERS控制DBWR进程个数。

  

  4)LGWR日志写入进程  

该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个Oracle后台进程。LGWR进程将自上次写入磁盘以来的全部日志项输出,LGWR输出:

◆当用户进程提交一事务时写入一个提交记录。 
◆每三秒将日志缓冲区输出。 
◆当日志缓冲区的1/3已满时将日志缓冲区输出。 
◆当DBWR将修改缓冲区写入磁盘时则将日志缓冲区输出。

LGWR进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,LGWR可继续地写入该组的其它文件。

日志缓冲区是一个循环缓冲区。当LGWR将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。LGWR
通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。

注意:有时候当需要更多的日志缓冲区时,LWGR在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。

ORACLE使用快速提交机制,当用户发出COMMIT语句时,一个COMMIT记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(SCN),它同事务日志项一起记录在日志中。由于SCN记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。

  

  5)ARCH归档进程。

  该进程将已填满的在线日志文件拷贝到指定的存储设备。当日志是为ARCHIVELOG使用方式、并可自动地归档时ARCH进程才存在。

  

  6)CKPT检查点。  

该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由LGWR执行。然而,如果检查点明显地降低系统性能时,可使CKPT进程运行,将原来由LGWR进程执行的检查点的工作分离出来,由CKPT进程实现。对于许多应用情况,CKPT进程是不必要的。只有当数据库有许多数据文件,LGWR在检查点时明显地降低性能才使CKPT运行。
CKPT进程不将块写入磁盘,该工作是由DBWR完成的。初始化参数CHECKPOINT-PROCESS控制CKPT进程的使能或使不能。缺省时为FALSE,即为使不能。

   
由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。在Oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用:

1、完全检查点

   
在Oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:

(1)DBA手工执行alter system checkpoint的命令;

(2)数据库正常shutdown(immediate,transcational,normal)。

由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。因此Oracle从8i开始引入了增量检查点的概念。

2、 增量检查点

Oracle从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo
Block
Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置,以表示Instance
Recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。检查点位置发生变更后,Oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。

(1)fast_start_io_target

该参数用于表示数据库发生Instance
Recovery的时候需要产生的IO总数,它通过v$filestat的AVGIOTIM来估算的。比如我们一个数据库在发生Instance
Crash后需要在10分钟内恢复完毕,假定OS的IO每秒为500个,那么这个数据库发生Instance
Recovery的时候大概将产生500*10*60=30,000次IO,也就是我们将可以把fast_start_io_target设置为30000。

(2)fast_start_mttr_target

我们从上面可以看到fast_start_io_target来估算检查点位置比较麻烦。Oracle为了简化这个概念,从9i开始引入了fast_start_mttr_target这么一个参数,用于表示数据库发生Instance
Recovery的时间,以秒为单位。这个参数我们从字面上也比较好理解,其中的mttr是mean
time to
recovery的简写,如上例中的情况我们可以将fast_start_mttr_target设置为600。当设置了fast_start_mttr_target后,fast_start_io_target这个参数将不再生效,从9i后fast_start_io_target这个参数被Oracle废除了。

(3)log_checkpoint_timeout

该参数用于表示检查点位置和重做日志文件末尾之间的时间间隔,以秒为单位,默认情况下是1800秒。

(4)log_checkpoint_interval

该参数是表示检查点位置和重做日志末尾的重做日志块的数量,以OS块表示。

(5)90% OF SMALLEST REDO LOG

除了以上4个初始化参数外,Oracle内部事实上还将重做日志文件末尾前面90%的位置设为检查点位置。在每个重做日志中,这么几个参数指定的位置可能不尽相同,Oracle将离日志文件末尾最近的那个位置确认为检查点位置。

  

  7)RECO恢复进程。  

  该进程是在具有分布式选项时所使用的一个进程,自动地解决在分布式事务中的故障。一个结点RECO后台进程自动地连接到包含有悬而未决的分布式事务的其它数据库中,RECO自动地解决所有的悬而不决的事务。任何相应于已处理的悬而不决的事务的行将从每一个数据库的悬挂事务表中删去。

当一数据库服务器的RECO后台进程试图建立同一远程服务器的通信,如果远程服务器是不可用或者网络连接不能建立时,RECO自动地在一个时间间隔之后再次连接。

RECO后台进程仅当在允许分布式事务的系统中出现,而且DISTRIBUTED C
TRANSACTIONS参数是大于0。

 

  8)LCKn进程:是在具有并行服务器选件环境下使用,可多至10个进程(LCK0,LCK1……,LCK9),用于实例间的封锁。

  

  9)Dnnn进程(调度进程):

  该进程允许用户进程共享有限的服务器进程(SERVER
PROCESS)。没有调度进程时,每个用户进程需要一个专用服务进程(DEDICATEDSERVER
PROCESS)。对于多线索服务器(MULTI-THREADED
SERVER)可支持多个用户进程。如果在系统中具有大量用户,多线索服务器可支持大量用户,尤其在客户_服务器环境中。

  在一个数据库实例中可建立多个调度进程。对每种网络协议至少建立一个调度进程。数据库管理员根据操作系统中每个进程可连接数目的限制决定启动的调度程序的最优数,在实例运行时可增加或删除调度进程。多线索服务器需要SQL*NET版本2或更后的版本。在多线索服务器的配置下,一个网络接收器进程等待客户应用连接请求,并将每一个发送到一个调度进程。如果不能将客户应用连接到一调度进程时,网络接收器进程将启动一个专用服务器进程。该网络接收器进程不是Oracle实例的组成部分,它是处理与Oracle有关的网络进程的组成部分。在实例启动时,该网络接收器被打开,为用户连接到Oracle建立一通信路径,然后每一个调度进程把连接请求的调度进程的地址给予它的接收器。当一个用户进程作连接请求时,网络接收器进程分析请求并决定该用户是否可使用一调度进程。如果是,该网络接收器进程返回该调度进程的地址,之后用户进程直接连接到该调度进程。有些用户进程不能调度进程通信(如果使用SQL*NET以前的版本的用户),网络接收器进程不能将此用户连接到一调度进程。在这种情况下,网络接收器建立一个专用服务器进程,建立一种合适的连接。

 

四、存储结构

   Oracle数据库的存储结构分为逻辑存储结构和物理存储结构.

  必发娱乐官方网站 15
      1、物理存储结构
    
 物理存储结构主要描述Oracle数据库的外部存储结构,即在操作系统种如何组织、管理数据.
      从物理上看,数据库由控制文件、数据文件、重做日志文件和参数文件等操作系统文件组成
      因此,物理存储结构是和操作系统平台有关的。

  1)数据文件(Data File):

  是物理存储Oracle数据库数据的文件。每一个数据文件只与一个数据库相联系。 数据文件一旦被建立则不能修改其大小。一个表空间可包含一个或多个数据文件。一个数据文件只能属于一个表空间.

 

  2)重做日志文件(Redo Log File)

  记录所有对数据库数据的修改,以备恢复数据时使用。其特点如下:每一个数据库至少包含两个日志文件组。 日志文件组以循环方式进行写操作。每一个日志文件成员对应一个物理文件。

  日志开关(Log
Switch)是为实现日志文件组的循环使用而设置的。出现日志开关的情况如下:当一个日志文件组被填满时;关闭数据库时; DBA手动转移日志开关;

  镜像日志文件是为防止日志文件的丢失,在不同磁盘上同时维护两个或多个联机日志文件的副本。
    
其特点如下: 每个日志文件组至少包含两个日志文件成员。每组的成员数目相同。同组的所有成员同时被修改。同组的成员大小相同,不同组的成员大小可不同。

      3)控制文件(Control File)

  是一个较小的二进制文件,用于描述数据库结构。将数据库的物理文件映射到数据字典中的逻辑表格空间和联机重做日志文件。

      4)参数文件(Parameter File)

  用于启动实例时候的配置数据库。参数文件主要分为两种:

  一种是当建立数据库的时候,用户就可以运行初始化文件(也就是一种参数文件),规定数据库中所使用的各种设置值。文本参数文件的后缀名是init<SID>.ora。

  另一种是服务器参数文件,服务器参数文件的后缀名是SPFILE<SID>.ora,它可以管理数据库的参数和值。

  5)临时文件(Temporay File)

  Oracle中临时文件(Temporay
File)处理方式与标准数据文件稍有不同。这些文件确实包含数据,但是只用于临时操作。一旦建立它的会话,完成了操作,就会从数据库中将这些数据完全删除。

                                          

   2、逻辑结构        

逻辑存储结构主要描述Oracle数据库的内部存储结构,即从技术概念上描述在Oracle数据库种如何组织、管理数据。

必发娱乐官方网站 16
                                                     

  表空间是最大的逻辑单位,块是最小的逻辑单位。因此,逻辑存储结构是和操作系统平台无关的,是由Oracle数据库创建和管理的。

  1)表空间

  表空间(tablespace)是最大的逻辑单位,对应一个或多个数据文件,表空间的大小是它所对应的数据文件大小的总和。      

  Oracle
10g自动创建的表空间有:

  Example(实例表空间):示例表空间。

  Sysaux(辅助系统表空间):辅助系统表空间,用于减少系统负荷,提高系统的作业效率

  System(系统表空间):系统表空间,存放关于表空间的名称、控制文件、数据文件等管理信息,是最重要的表空间.它属于Sys、System两个schema(方案),仅被这两个或其他具有足够权限的用户使用。但是均不可删除或者重命名System表空间。  

  Temp(临时表空间):临时表空间存放临时表和临时数据,用于排序。

  Undotbs(撤销表空间):当我们队数据库表数据进行增加、修改、删除时,Oracle系统自动使用撤销表空间来临时存放修改前的数据。

  Users(用户的表空间): 用户表空间,永久存放用户对象和私有信息,也被成为数据表空间。

  一般地:系统用户使用system表空间,非系统用户使用Users表空间

 

  **2)段**

  段(Segment)是表空间中一个指定类型的逻辑存储结构,它由一个或多个区组成,段将占用并增长存储空间。

  引导段(Bootstrap Segment) :
存储数据字典表的定义

  临时段(Temporary Segment):
存储表排序操作期间简历的临时表的数据

  回滚段(Rollback Segment) :
存储修改之前的位置和值

  索引段(Index Segment) :
存储表上最佳查询的所有索引数据

  数据段(Date Segment) :
存储表中所有数据

 

  3)盘区

  盘区(Extent)是数据库存储空间分配的逻辑单位,一个区由一组数据块组成,区是由段分配的,分配的第一个区称初始区,以后分配的区称增量区。

 

  4)数据块

   数据库块(Database
Block)是数据库使用的I/O最小单元,又称逻辑块或ORACLE块。一个数据库块对应一个或多个物理块,块的大小由参数DB_BLOCK_SIZE确定。
       块的大小是操作系统块大小的整数倍.
       以Win2K为例,操作系统块(OS block)的大小为4kb,所以Oracle
Block的大小可以是4kb,8kb,16kb等等。
       如果块的大小为4kb,某表每行的数据是100
bytes.,如果某查询语句只返回1行数据,那么,在将数据读入到数据高速缓存时,读取的数据量时4kb而不是100
bytes.
       数据块由一下五部分组成  
       标题:包括通用的块信息,如块地址/段类型等,最佳大小为85-100bytes。
       表目录:存储聚集中表的信息,这些信息用于聚集段。
       行目录:包括这块中的有效行信息,允许使用每行开头的2bytes。 
       自由空间:这块中能插入或修改的一组空间。
       行数据:存储表或索引的数据。

 

  必发娱乐官方网站 17

  以上内容来源于网络!

相关文章