本节将描述Oracle在AIX上运行所涉及实施和使用的框架性概念,包含如下的内容:
■ Oracle在AIX上的运行结构和特征;
■ Oracle RDBMS的关键组成部分;
■ Oracle数据库服务器常用概念、用语;
■ 数据库结构化查询语言——SQL;
■ 数据库访问的实现、SQL的执行。
Oracle运行在AIX上,提供着数据的存储和管理服务。数据即信息,Oracle数据库就是应用系统中存储数据信息的一个集中存储位置、一种存取方法的商品化实现。AIX是承载Oracle运行的底层平台,进行着CPU调度、内存调度、存储管理、文件管理、网络驱动等系统运行和维护工作。
作为对应用系统的支持来说,数据库常用来存储三种不同类型的数据。
■ 常用类型数据,也称为标量数据类型,诸如表示名字、地址的字符、数字、日期等数据。
■ 复杂类型和大对象:诸如声音、视频、地理信息、图画、工程制图等非规范性数据。
■ 用户定义数据类型数据:用户根据自己的应用需要定义的数据类型,以及对应存储的数据。
这些数据存储在数据库中,支持着用户的数据请求和处理,典型操作有下面的三种:数据库加入、删除、更改,如图1-28 所示。
不仅如此,在生产环境下,数据库还必须以可靠的方式、可接受的速度、可以支持的多用户并发服务,执行上述所有这些操作。
图1-28 数据库的功能
因此,UNIX系统是典型的多任务操作系统环境,往往是Oracle这样的大中型数据库的首选平台,例如AIX、HP-UX、Solaris(Sparc)等。一般而言,在整体应用环境下,每套UNIX主机承担一组服务,例如Oracle数据库服务、Sybase数据库服务、中间件(如WebLogic)服务、打印服务器、NFS服务等,如图1-29 所示。
图1-29 数据库在应用系统中的作用
Oracle往往处于整体应用环境中的中心节点位置,并以AIX作为其操作系统平台,以期使用AIX的处理能力:
■ 对使用CPU计算能力的支持;
■ 对内存调度上的支持;
■ 对存储的管理和使用的支持;
■ 对网络通信的支持;
■ 系统安全性的要求等。
Oracle运行在AIX上,申请了AIX物理内存区间的一部分作为自己的共享内存结构,用于Oracle各进程间的IPC通信。Oracle在AIX上派生的若干后台进程在AIX的调度下,提供着Oracle服务器的各种服务。Oracle数据存储在磁盘介质上,依赖AIX逻辑卷管理器进行统一的管理和维护,如图1-30 所示。
图1-30 Oracle运行在AIX的系统架构
在生产环境下,数据库往往在一套独占的UNIX服务器上运行(或者是RS6000 中VIOS上的一个WPAR分区),这意味着数据库服务器系统不必顾及其他不应有的工作载荷,以及其他载荷会对服务器造成的工作压力。
本书也将假设Oracle会在一套独占模式下的AIX中运行,这套环境可能是一个单节点的RS6000 AIX环境,也可能是一套RS6000 的RAC集群系统或PowerHA高可用环境。
Oracle数据库从进入中国时较为初始的Oracle 5 版本(软盘介质),到今天成为业界领袖的Oracle 11g R2(DVD光盘介质),前后二十余年。发展至今,Oracle经历了由主机系统到客户/服务器体系结构(Client/Server),再到基于互联网的 N 层体系架构,其功能得到不断扩展化,但其内部构架在不断丰富功能性和扩展性的前提下,体系结构基本稳定。
因此,本章中的大多数内容从原理上可以适用于Oracle 7、Oracle 8、Oracle 8i、Oracle 9i、Oracle 10g、Oracle 11g的各个版本,目前的最新版本是Oracle Database 11g R2。但从管理细节上,差别还是很明显的。
在一套处于启动运行状态下的Oracle环境中,Oracle这套“可执行应用程序”一般可以看成是由例程(Instance)和数据库(Database)两大部分组成。其中,实例是执行其功能的后台进程和对应申请的内存区域范围,数据库是承载数据的存储介质。其结构如图1-31 所示。
图1-31 Oracle存储在AIX系统下
这里需要澄清一个概念:Oracle实例是Oracle在当前运行状态下启动的所有后台进程和申请的内存地址的逻辑集合。或者说,它仅是一个概念而已。而且只有在Oracle系统启动的情况下,实例才会存在。
那么Oracle实例是如何组成的呢?也就是说,在启动的过程中,Oracle都申请了什么系统资源?
我们先看其内存结构。在AIX中,当启动Oracle实例后,Oracle从AIX VMM申请了如图1-32 所示内存结构中的共享内存段作为其SGA区(系统全局区),同时,Oracle各种后台进程所占据的各内存区段称为PGA区(程序全局区)。
图1-32 Oracle运行在AIX中的内存分配
Oracle启动所申请的共享内存区段用于Oracle 系统全局区,即图1-32 所示的OracleSGA部分。SGA包含如下几个主要内存区域。
■ 数据高速缓存区域:存放最近使用的数据库数据块。
■ 重做日志缓冲区:存放当前产生的事务日志信息。
■ 共享池:存放常用数据库数据字典信息和SQL、PLSQL信息。
■ 其他内存结构:诸如大池、Stream池、Java池等内存结构。
这些内存结构总称为SGA(System Global Area)。把SGA放大,其内部结构和作用如图1-33 所示。
图1-33 Oracle使用AIX内存后的内部分配
如果站在AIX的角度,查看当前系统的共享内存信息,相信你可以得到类似的结果,并了解到下面的ipcs结果中ID号为 1048577、大小为 293MB、属主为Oracle的共享内存段有什么作用。
Oracle启动后,不仅将向操作系统申请内存结构,还派生出若干用于执行具体操作的后台进程(程序模块)。这些进程主要包括SMON、PMON、DBWR、CKPT、LGWR、ARCH等,如图1-34 所示。
图1-34 Oracle的后台进程
这些后台进程在Oracle实例启动后,都可以从AIX上查到对应的进程信息:
通过这些后台进程,Oracle就可以实现从磁盘读取或写入数据(dbwr进程),把日志信息写入日志文件(lgwr进程)、监控Oracle进程状态并维护进程状态(pmon),把日志归档处理(arch)等操作。
有了Oracle实例,我们就可以进行Oracle数据库的操作了。简而言之,Oracle数据库是Oracle实例操作的一组操作系统文件或存储设备的集合。对于数据库,我们把它分为三种不同作用的文件:
■ 存放数据的数据文件。
■ 存放系统结构信息的控制文件。
■ 存放事务日志的重做日志文件。
数据文件用于存放数据库中的业务数据,所有的表、索引、物化视图、簇表、大对象数据等皆存放于此。日志文件用于存放数据库事务信息,维护和保证数据库的可恢复性。控制文件存放了当前数据库的结构信息、运行状态信息、备份信息等。Oracle的若干后台进程就是用来操作这些Oracle的数据库文件的,如图1-35 所示。
图1-35 Oracle中数据在AIX中的存放
到此为止,一套Oracle数据库系统就全部在AIX上构成了。下面我们从更多细节角度,来了解Oracle数据库的实例结构和物理结构。
如前所述,Oracle实例是我们启动Oracle后,可执行应用程序所派生的后台进程和申请的内存结构构成的集合。SGA(System Global Area)特指Oracle实例中共享的内存段。所谓共享,即它由所有用户进程、后台进程所共享,通过IPC机制访问和使用。
启动Oracle时,Oracle将自动分配SGA。关闭例程后,Oracle将释放SGA所占用的内存空间。SGA主要包括数据高速缓存、重做日志缓冲区、共享池、流池、Java池、大池等主要部分,如图1-36 所示。其中,数据高速缓存、重做日志缓冲区、共享池占据主要功能位置,其他在个别场景下使用。
在Oracle 10g、Oracle 11g中,这几块缓存区域都可以通过SGA_TARGET参数进行设置(在Oracle 11gR1、Oracle 11gR2 中引入了两个新参数MEMORY_MAX_TARGET、MEMORY_TARGET也用于Oracle内存管理)。在设置SGA_TARGET参数后,下面的缓存结构将在SGA_TARGET范围内自动分配:
■ 数据高速缓存,对应 DB_CACHE_SIZE参数。
■ 共享池,对应SHARED_POOL_SIZE参数。
■ 大池,对应LARGE_POOL_SIZE参数。
■ Java池,对应JAVA_POOL_SIZE参数。
■ Stream池,对应STREAMS_POOL_SIZE参数。
图1-36 Oracle分配和使用SGA
但在Oracle 10g以前的版本中的设置是不同的。在Oracle 9i中参数略有不同,在Oracle 8i和之前版本,各个缓冲区和池的尺寸需要单独设置,这给管理员带来了莫大的挑战!
数据高速缓存是位于SGA中的一个缓存区,保存最近从数据文件中读取到的数据块。当应用提出数据请求时,很大的可能是用户所需的数据已经位于数据高速缓存中。这样的话,Oracle将直接从数据高速缓存中读取数据并返回给应用,不必再从数据文件中直接读取数据。但如果所需的数据不在数据高速缓存中,Oracle将不得不从数据文件中读取数据到数据高速缓存,然后再从数据高速缓存中读取数据并返回给用户。
用户进程需要向数据文件写入数据时,也是先写入数据高速缓存。数据高速缓存中修改过的块被标记为脏缓存块(Dirty Buffer)。在某个特定的时候,脏缓存块由DBWn后台进程成批地写入到数据文件中。
注意上述过程,Oracle数据块已经在数据高速缓存中经过缓存化处理,这显然会提高I/O的效率。但在AIX上,文件系统也有缓存,文件操作也会被缓存化处理。那么,一个Oracle数据块是不是会被缓存两次呢?
会的,因此这需要进行AIX操作系统的相应调整。
数据高速缓存用于存放最近访问的数据库中数据块的数据,因此,数据高速缓存被分割为许多小缓冲区块,其缓冲区块的大小与数据库默认数据块大小一致。
数据块即数据文件中存放数据的最小I/O单位。数据块的大小由参数db_block_size在创建数据库时指定,一旦指定便不能修改,数据缓存区块尺寸同时被确定。对于已启动的数据库来说,其大小可以通过下面的查询获得:
因此,对上述系统来说,默认缓冲区缓存块的尺寸也是 8KB。
如果Oracle数据库是 8i或之前的版本,则所有表空间的数据块尺寸完全一致,缓存块的尺寸也会一致。但从Oracle 9i开始,到目前的Oracle 11g版本,Oracle允许表空间使用不同的数据块尺寸。其中,初始化参数DB_BLOCK_SIZE只用于定义标准数据块的尺寸,系统表空间将采用这个数据块尺寸。另外的参数DB_ n K_CACHE_SIZE定义非标准块的缓存区块尺寸,用来存放非标准数据块大小的表空间。在Oracle 10g中这些参数分别是:
上面的查询结果显示了几种不同尺寸的缓存区块可能性,即db_2k_cache_size、db_4k_cache_size、db_8k_cache_size、db_16k_cache_size、db_32k_cache_size,它们分别用来存放从 2KB开始到 32KB大小的数据块。db_cache_size用来强制指定标准数据高速缓存的尺寸。
上述查询结果显示db_cache_size设置为“0”,这不是表示没有,而是表示Oracle设定采用自动的内存管理方式,无须设定具体的数据高速缓存值。这是Oracle 10g与Oracle 11g中的设置方式。如果环境是Oracle 9i,则不是如此,下面查询Oracle 9i Enterprise Edition For AIX中数据缓存的设定:
上面的结果表示,数据缓存设定为 32MB(33554432B)。
对于任何一个指定大小的数据高速缓存而言,其空间大小是有上限的。因此,使用过程中的争用以及争用带来的替换操作是必然结果。Oracle采用LRU(最近最少使用)算法管理数据高速缓存的争用,这点和AIX文件系统缓存的替换策略相同。
通过数据高速缓存及其使用的LRU替换策略,保留在高速缓存总的数据在理论上都应该是比较“热”的数据。这样,常用数据就会驻留缓存,减少物理I/O的出现。一般而言,Oracle无论进行查询操作或是事务操作(带有数据变更的操作),都会在数据高速缓存中完成。这就可以充分利用高速缓存速度快的优点,并且依赖于热数据在高速缓存中出现的概率。
按照数据高速缓存的使用情况,一部分缓存区块中的数据可能处于修改过、未写盘的状态,也就是脏缓存块(Dirty Buffer)状态。处于空闲状态的、可以被替换的空闲缓存块称为空闲块(Free Buffer)状态和服务器进程正在存取的忙缓冲区块状态。
数据高速缓存中的脏缓存块并非产生后立刻写盘,而是通过DBWn进程写入数据文件。这样就会导致很多的硬盘I/O操作,进而形成性能上的障碍。Oracle对此的优化是——只有在满足一定的条件后DBWn后台进程才会进行写入操作,争取一次性、批量性将脏缓存块写入数据文件。
这样做将有效降低物理I/O操作总数,避免DBWn进程与其他进程之间发生I/O方面的冲突。
一般而言,激活DBWn进程进行写盘的可能条件如下:
■ 数据库缓存中的脏缓存块总数达到一个上限值。
■ 执行增量检查点或完全检查点。
■ 空闲缓存块少到一定数量。
■ 发生超时(3 秒)。
■ 表空间状态改变,如置为脱机状态、只读状态。
■ 删除或截断一个表。
■ 利用ALTER TABLESPACE…BEGIN BACKUP命令将表空间置为备份状态。
如需写盘,数据高速缓存将使用LRU算法(最近最少使用)来选择要写的缓存块。最大的可能是DBWn将那些标记为“脏缓存块”和“冷缓存块”写入数据文件。
由于DBWn的写盘操作与数据是否提交并没有太大的关系,所以,不仅已提交数据可以被写入数据文件,未提交数据也可能被同时写入数据文件,成为数据文件中事实存在的脏数据。因此,并不是写入数据文件的数据就一定是对的。
Oracle为了维护数据库中数据的正确性,设定了自动恢复机制。该机制确保可以利用日志数据和还原记录来回退数据文件中已存的、未提交的不准确数据。
每次Oracle数据库系统重新启动时,启动的倒数第二个阶段即是数据的前滚,确保已提交数据写盘。最后阶段即用来进行数据库数据的回退操作,防止未提交数据在数据库中的驻留,如图1-37 所示。
图1-37 Oracle数据缓存的维护算法
在用户的操作过程中,事务不断提交给服务器执行,这就产生了日志信息。日志记录了用户“要做什么”和“做以前什么样”以及“要做成什么样”。
这就是Oracle中重要的重做日志。显然,重做日志提供了系统的可恢复性实现手段。重做日志缓冲区(Redo Log Buffer)即是服务器日志记录的技术手段。日志信息首先写入重做日志缓冲区,然后在一定的机会下写入到联机重做日志文件。
重做日志缓冲区是一个循环结构。随着事物的产生,Oracle不断向缓冲区写入重做记录(称为redo entry)。写盘时,LGWR后台进程从缓冲区中读取重做记录,写入联机重做日志文件。缓冲区中的重做记录被写入联机重做日志文件之后,相应的缓冲区内容即将被清空,过程如图1-38 所示。
图1-38 重做日志的写盘操作
重做日志缓存的大小可能对数据库性能产生一些影响。如果数据库的DML操作频繁,那么在这个数据库中将会产生较多的重做记录,因此应设置较大的重做日志缓冲区,减少重做日志文件的I/O次数。
重做日志缓冲区的尺寸由初始化参数 LOG_BUFFER定义,通过下面的命令可以看到当前的配置情况:
可见,当前配置的重做日志缓存为 7MB左右。
共享池(Shared Pool)用于存放最近执行的SQL、PLSQL语句和数据字典信息,其尺寸由初始化参数SHARED_POOL_SIZE定义。共享池主要由库高速缓存(LibraryCache)和数据字典高速缓存(Dictionary Cache)两部分组成,如图1-39 所示。
图1-39 共享池的作用
库高速缓存用于存放最近执行的SQL语句信息,包括SQL/PLSQL文本、编译伪代码、SQL执行计划。其中,SQL/PLSQL文本部分可用于比对系统正在执行的SQL/PLSQL,伪代码是根据执行计划编译过的可执行代码,是SQL/PLSQL操作的具体执行过程。
库高速缓存包含若干上下文区(Context Area),每个上下文区都包含相应SQL语句的执行计划。这些上下文区称为共享游标,当客户端运行SQL语句时,服务器进程首先会检查共享游标是否存在,如果存在,则按照其存储的执行计划直接执行语句;如果不存在,则生成SQL语句执行计划,并将其存放到相应的上下文区中,然后执行该SQL语句。通过共享游标机制,SQL/PLSQL语句的解析次数可以有效降低,节省对应的解析成本,提升SQL/PLSQL语句的执行性能。
在很多系统中,SQL/PLSQL的解析效率堪忧,表现在硬解析的大量存在,造成大量的CPU载荷,运行效率低下。
共享池中的另一部分是数据字典高速缓存(Dictionary Cache),用于存放数据库数据字典信息。数据字典信息是用来记录、表述数据库结构的元数据。任何数据库操作都不能跨越对数据字典中数据的引用。
在Oracle 9i中,共享池通过参数shared_pool_size进行设置:
在Oracle 11g及Oracle 10g中,通过设置MEMORY_TARGET或SGA_TARGET间接设置,无须直接设定。例如下面在Oracle 10g中的设置:
SGA除了包含共享池、数据缓存和重做日志缓冲区之外,还提供了三个内存结构:大缓冲池(Large Pool)、Java池(Java Pool)和Stream池(Stream Pool)。
大池是Oracle SGA中的一个相对独立的内存空间,主要用于以下三方面:
■ 共享服务器模式下的用户连接;
■ 数据库备份恢复操作中大的内存结构需求;
■ 并行SQL下的内存需求。
Java池用于存放Java代码。从Oracle 8i起,Oracle内嵌了Java虚拟机并支持Java组件的运行。设置Java池用来服务于Java对象的运行。其尺寸由初始化参数JAVA_POOL_SIZE定义。如果要在Oracle数据库中安装Java VM,必须配置Java池,并且其尺寸应该大于 20MB。
Stream池用于启动Oracle Stream的复制环境。
在Oracle 11g及Oracle 10g中,大池、Java池、Stream池无须设置,自动管理。在Oracle 9i及其以前版本中,对应的参数分别为large_pool_size和java_pool_size:
SGA采用共享模式服务于所有Oracle后台进程。对于客户连接所创建的服务器进程来说,这些服务器进程却是相互独立的,其集合称为程序全局区(Program Global Area,PGA)。PGA用于存放服务器进程的数据和控制信息,它独立于SGA,当用户连接到Oracle时派生。Oracle Server会为每个服务器进程分配相应的PGA,如图1-40 所示。
图1-40 AIX中Oracle用户进程和后台服务器进程的关系
在Oracle 9i及Oracle 10g中,通过系统参数pga_aggregate_target来指定所有服务器进程总计占用的最大PGA内存空间。
在Oracle 11g中,两个新参数memory_max_target和memory_target用来自动指定SGA和PGA的尺寸,无须设置pga_aggregate_target,这称为自动内存管理AMM。例如,下面是Oracle11gR2 中采用的相关参数:
对于每个Oracle的进程,其PGA部分随进程的产生而产生,Oracle自动分配PGA。当进程终止时Oracle又会自动释放PGA所占用的内存空间。从细节上讲,PGA由排序区(Sort Area)、会话信息(Session Information)、游标状态(Cursor Stat)以及堆栈空间(Stack Space)四部分组成。
■ 排序区(Sort Area):用于存放排序操作所产生的临时数据,这是决定PGA尺寸的主要因素。排序是SQL执行中的一种常态操作,当SQL语句中有Distinct、Order By、Group By、Union等类型的排序操作时,Oracle将进行执行过程的排序。
■ 会话信息(Session Information):当应用系统访问Oracle时,一个会话将代表这个连接。会话信息包括用户所具有的权限、角色以及会话的性能统计信息等。
■ 游标状态(Cursor State):运行SQL语句时,Oracle会在共享池中为该SQL语句分配上下文区,游标就是指向该SQL指令上下文区的指针。而PGA中的游标状态即指出当前SQL语句所处的状态。
■ 堆栈空间(Stack Space):用于存放会话的变量信息。
在Oracle 11g中,关于程序全局区的设置进行了再次优化。通过设置自动内存管理机制(在默认情况下),管理员只需设置Oracle整体内存的使用上限即可,无须设置pga_aggregate_target参数。在Oracle 11g中,该参数设置为 0,通过设置两个Oracle新参数memory_max_target、memory_target即可。
启动Oracle例程时,Oracle不仅会分配系统全局区SGA,还会启动后台进程。关闭Oracle例程时,Oracle既要释放SGA所占用的内存空间,又要释放后台进程所占用的CPU和内存资源。下面的进程查看命令列出了当前系统中运行的Oracle后台进程(其中进程 430312 是监听进程,不是实例的后台进程)。
上面是一套单节点数据库中运行Oracle 11g的进程结构。Oracle提供了若干个后台进程,本节主要介绍其中较为常用的几个后台进程SMON、PMON、DBWR、LGWR、CKPT和ARCH。其作用如图1-41 所示。
图1-41 Oracle中的几个最关键后台进程
SMON(System Monitor)用于执行例程恢复、合并空间碎片并释放临时段的操作。当数据库出现例程失败,如发生UPS断电、RS6000 部件损坏等故障时,由于SGA中的高速缓存数据尚未写入到磁盘文件,因此这些文件可能处于不一致状态。当数据库重新打开时,后台进程SMON会自动执行例程恢复,通过前滚操作重做已提交的事务,通过后滚操作回退未提交的事务。
PMON(Process Monitor)用于监视服务器进程的执行,并且在服务器进程失败时清除(杀死)该服务器进程。
一种常见情况是,当一个用户连接到Oracle数据库服务器时,Oracle为该用户创建对应的服务器进程。如果用户进程意外终止,则PMON进程在一定的时间周期内回退该用户的当前事务,释放该进程所占用的锁资源和其他资源,最后杀死该服务器进程。
DBWR(Database Writer)称为数据库读写盘进程,用于将数据高速缓存的脏缓存块写入到数据文件中。
在默认情况下只有一个DBWR进程,进程名为DBW0,通过设置初始化参数db_writer_processes最多可以定义 20 个DBWR进程,因此操作系统上DBWR进程名将表现为DBW n (DBW0、DBW1、DBW2…)。
当执行DML操作后,DBWR服务器进程会在某个时刻将被修改过的数据缓存块(称为脏块)由后台进程DBWR写入到数据文件中。所谓“某个时刻”,是指在出现以下情况时:
■ 系统发出检查点(CheckPoint);
■ 服务器进程不能找到空闲缓冲区;
■ 删除或截断表;
■ 使表空间脱机或备份(ALTER TABLESPACE…OFFLINE / BEGIN BACKUP)。
当执行DML或DDL语句时,服务器进程会将事务信息写到重做日志缓冲区中,然后开始实际的操作,修改数据高速缓存。注意,这就是数据库一般采用的日志前写的做法,也就是先记载要发生的改变,再进行数据修改。另外,如果数据高速缓存中有大量脏数据块需要写入数据文件,Oracle会首先将事务信息写入重做日志。除此之外,LGWR进程也会在如下事件发生时触发:
■ 提交事务(COMMIT);
■ 每隔 3 秒钟;
■ 重做日志缓冲区已有三分之一填满;
■ 在DBWR进程将脏缓冲区数据写入到数据文件之前。
CKPT(Checkpoint Process)用于发出检查点事件(即Checkpoint事件——事实上,CKPT更应该说是一个事件,它用来触发其他事件)。
检查点用于内存和硬盘数据的同步,包括数据库数据文件、控制文件和重做日志的同步。发出检查点后,后台进程CKPT将检查点发生时的系统改变号(System ChangeNumber,SCN)写到控制文件和数据文件的头数据块(文件头)中,同时触发后台进程DBWR(DBW0~DBW n ),将所有脏数据块写入数据文件中。其过程如图1-42 所示。
图1-42 CKPT进程和DBW n 进程的关系
另外,发出检查点后,不仅后台进程CKPT和DBWR要开始工作,LGWR也会被调用,将重做日志缓冲区写入到联机重做日志中,从而确保数据文件、控制文件和重做日志的一致性。
CKPT进程的主要几个触发时机为:
■ 日志组的切换;
■ 数据库实例的关闭(SHUTDOWN ABORT关闭除外);
■ 手工发出检查点命令(ALTER SYSTEM CHECKPOINT语句);
■ 由初始化参数fast_start_mttr_target控制的检查点发送。
ARCH进程用于将重做日志备份为归档日志,这样,重做日志的内容不会在日志切换中丢失。该后台进程在ARCHIVELOG模式(档案模式)下产生并运行。其过程如图1-43 所示。
图1-43 日志的归档操作
ARCH进程在默认情况下只有一个进程ARC0 存在,通过设置初始化参数log_archive_max_rocesses最多可以定义 10 个归档进程(ARC0~ARC9)。
另外,一般没有必要设置该参数,Oracle将基于当前的工作载荷自动增加和减少归档进程数。
总体来说,数据库由数据文件、日志文件、控制文件三种主要文件组成。
数据文件(Data File)存储真正的数据库数据,这些数据包括用于描述数据库系统结构的系统数据,也就是常说的数据字典数据、用户数据,包括表的数据、表上定义的索引数据等。
当建立数据库或创建表空间时,数据文件被添加到数据库中。但是Oracle并不能直接操纵数据文件,而是将一到多个数据文件逻辑合并为“表空间”。通过表空间这个逻辑结构来存储和管理数据。其关系如图1-44 所示。
图1-44 Oracle通过表空间来组织数据文件
通过表空间这个“数据文件的集合”,用户数据可以间接地被放置在数据文件上。因此,表空间这个概念和AIX中“卷组”的概念较为相近。
在运行状态下,SQL执行过程中所产生临时表和工作表称为“临时段”,被Oracle系统自动放置在临时表空间中,数据库事务过程中所产生的回滚数据被Oracle系统自动放置在还原段中。
系统中数据文件的配置信息可以通过下面的查询语句获得:
日志文件,全称为联机重做日志(Redo Log)文件,用于记录数据库事务的发生过程。或者说,日志文件全景记录了数据库的变化过程。其作用就是在有朝一日数据库需要“重做”时,例如需要进行例程恢复或介质恢复时,可以使用重做日志进行事务的“回放”并据此“重做”。在默认情况下对Oracle执行DDL(Create table…、Alter index…等)、DML(insert into、Update set、delete from等)操作时,事务变化会被写到重做日志缓冲区,然后通过LGWR进程写入重做日志文件。
Oracle数据库要求至少两个重做日志组来循环使用,工程上一般至少设置 3~5 个重做日志组,如图1-45 所示。
图1-45 Oracle将循环使用日志文件
在图1-45 中,数据库包含 3 个日志组,每个组有两个成员,LGWR进程将事务信息写入到其中一个日志组中。日志组 1 写满后,Oracle自动切换到日志组 2,以此类推,切换到日志组 3;再后回到日志组 1,完成一次循环。
系统中日志文件的配置信息可以通过下面的查询语句获得:
控制文件(Control File)是Oracle记录数据库结构、数据库状态、数据库事务状态、数据库恢复状态的中心信息节点。每个Oracle数据库至少要包含一个控制文件,生产系统一般要有三个控制文件。这些控制文件互为镜像,提供系统在控制信息上的高可用性保证。在打开和使用Oracle时,Oracle将引用控制文件的内容,并将当前状态信息写入控制文件。
一套控制文件只能服务于一套Oracle数据库系统,无论这套Oracle系统拥有几个集群节点。控制文件中记载了如下信息:
■ 数据文件的位置和大小。
■ 日志文件的位置和大小。
■ 数据库属性、创建事件。
■ 日志使用序列号、系统改变号信息。
■ 日志切换历史、归档信息。
■ 数据库备份状态、备份文件状态。
……
系统中控制文件的配置信息可以通过下面的查询语句获得:
在Oracle数据库中,数据文件记载了数据,日志文件记载了日志记录,控制文件描述了数据库结构和状态。除去这三种主要文件外,还需要若干支撑文件,以提供数据库运行和系统恢复使用。
由于数据库日志是循环使用的,因此,日志文件的覆盖将是一种必要的操作。这就带来系统在数据恢复上的问题:覆盖后的日志文件中记载的日志条目将无条件丢失。其后果是数据库的历史数据不可能完成恢复。因此,Oracle数据库提供了两种日志数据管理模式:档案模式与非档案模式,分别对应在运行状态下日志文件的切换备份和切换不备份。
归档日志(Archive Log)就是当数据库运行在档案模式下,联机重做日志在切换后进行的日志备份。
显然,归档日志是联机重做日志的历史备份。每一次联机重做日志的切换操作都会产生一个对应的归档日志,这样,数据库操作的历史记录得以保存。当数据库出现介质损坏需要进行事务恢复时,使用数据库的备份,加上归档日志的日志记录和联机重做日志的当前事务信息,数据库即可得以完全恢复。
如图1-46 所示,数据库运行在档案模式(ARCHIVELOG)下,LGWR先将事务变化写入到日志组 1,当日志组 1 写满后,LGWR会将事务变化写入到日志组 2,并且调用ARCH进程将日志组 1 的内容保存到归档日志 1,以次类推。当日志循环回日志组 1时,归档日志 1、2、3 已经产生了。日志组 1 这时的被覆盖,将不再会影响到日志的永久性存储了。
图1-46 Oracle中不断产生归档日志
当前系统运行模式可以通过下面的查询语句获得:
数据库启动,其运行参数记载在数据库参数文件中。参数文件(Parameter File)中声明了Oracle实例启动所需的所有非默认参数。从Oracle 9i开始,参数文件可以有两种体现方式:文本参数文件(称为pfile)和服务器参数文件(称为spfile)。
参数文件的默认位置为$ORACLE_HOME/dbs目录,其中环境变量$ORACLE_HOME指定了Oracle数据库软件的系统安装路径。在下面的例子中,用户以oracle用户的身体登录UNIX,在$ORACLE_HOME/dbs目录下找到了spfile<实例名>.ora,也就是数据库对应的服务器参数文件。可能还会有init<实例名>.ora,即文本参数文件。例如对数据库实例orcl来说,服务器参数文件是spfileorcl.ora,文本参数文件是initorcl.ora。
在这两种参数文件中,文本参数文件是纯文本的,可以使用任何文本操作工具对其进行打开和读写操作,下面是一个文本参数文件的内容,如图1-47 所示。
图1-47 数据库文本性参数文件pfile
上面的参数表明:服务器实例名为orcl,数据库名为orcl,数据块尺寸为 8KB,同时也表明数据库使用内存的方式和容量等内容。
另一种服务器参数文件是二进制文件,它不能使用文本操作工具进行写操作,但打开浏览还是可以的,其内容和文本参数文件类似,如图1-48 所示。
图1-48 Oracle中的服务器参数文件spfile
口令文件是在Oracle中用来验证超级用户信息的文件。超级用户是在Oracle中可以执行启动关闭实例、创建数据库、执行备份和恢复等操作的特殊用户。在用DBCA工具创建数据库时,会自动创建一个特权用户SYS。
口令文件存储位置和服务器参数文件相同,也在$ORACLE_HOME/dbs目录下,在下面的例子中,数据库实例orcl的口令文件为orapworcl。
Oracle运行状态下的运行日志文件(注意,不是数据库联机重做日志)称为“警告文件”。该文件记录了数据库发生过的事件和错误,并按照时间顺序连续写入。
通过使用警告文件,我们可以查看数据库“发生了什么”,例如数据块损坏、日志切换、非默认初始化参数使用、系统关闭启动等信息。
各种Oracle后台进程都可能会有对应的日志信息产生,这些日志文件称为“跟踪文件”,因为其文件后缀名是.trc(在Oracle 11g中是.trc和.trm,)。关于数据库警告文件和跟踪文件的记录和生成,参见图1-49。
警告文件存储在由参数background_dump_dest指定的路径下(Oracle 11g中为DIAGNOSTIC_DEST参数),名称为alert_<SID>.log:
图1-49 Oracle中跟踪文件的位置
上面的查询告诉我们警告文件的位置在/db/diag/rdbms/orcl/orcl/trace路径下。该路径下一定有一个alert_orcl.log文件。下面我们来查找警告文件和跟踪文件:
由于警告文件按照时间顺序记录数据库中的操作信息和错误信息,所以一般查看警告文件时应该从后向前查看。因此,可能常用的命令是tail -100 alert_orcl.log(查看警告文件的最后一百行)或者tail -f alert_orcl.log,该命令可以实时查看新生成的日志。
而且随着时间的推移,警告文件会越来越大,定期备份和删除该文件也是必要的。如果删除了警告文件,Oracle在生成新的警告消息时,自动建立新的警告预警文件,并随即写入内容。
注意,在Oracle11g中,DIAGNOSTIC_DEST参数取代了Oracle 10g及以前版本的background_dump_dest参数。设置此路径可以通过设置DIAGNOSTIC_DEST参数实现。
在警告文件所在目录中,还会有若干后缀名为.trc的文件。这些文件称为后台进程跟踪文件,用于记录后台进程的警告或错误消息,每个后台进程都可能有相应的跟踪文件。
在Oracle 11g中添加了扩展的错误诊断功能,用于协助错误的发现、诊断和解决,我们称之为Automatic Diagnostic Repository(ADR),这些诊断数据也会存放在相同的路径下。另外,在Oracle 11g中,DIAGNOSTIC_DEST参数取代了Oracle 10g及以前版本的background_dump_dest参数。
对于服务于客户端进程的服务器进程来说,也会有对应的跟踪文件,用于记录服务器进程的相关信息,主要内容包括SQL语句的跟踪。通过使用这些服务器进程跟踪文件,可以截获用户执行的SQL操作,判断SQL执行路径及执行代价,并据此分析和诊断SQL语句性能,进行SQL的调整和优化。
这个功能默认是未启动的,需要激活数据库的SQL跟踪功能,如图1-50 所示。
图1-50 数据库跟踪文件
那么,数据库对象是如何放置在表空间上的呢?我们来看图1-51。
第一,在一个数据库中,所有存放数据的数据文件被按照表空间的方式予以逻辑划分。因此,反过来看,数据库由若干表空间构成。这就构成了图1-51 中①的关系——表空间(Tablespace)在逻辑上组成了数据库。
第二,一个表空间由若干数据文件组成,也就是图1-51 中②的关系。在UNIX中,既可以使用文件系统存储数据文件,同时,使用原始设备(裸设备)也是一种常见做法,也就是图1-51 中③的关系。
图1-51 Oracle在AIX实施中的存储使用(非网格Grid安装状态)
第三,Oracle在创建表空间的时候,将表空间所占用的物理空间(来自于文件系统或裸设备)“格式化”为一个一个的Oracle数据块(Oracle Block),每个块具有一个唯一标号,逻辑上以标号连接,构成链表,也就是图1-51 中的关系④。
Oracle块也是Oracle在数据文件上执行I/O操作的最小单位,其尺寸为OS块(例如,512B)的整数倍。从Oracle 9i开始,一般数据块默认尺寸都是 8KB。
所谓执行I/O操作的最小单位,是指如果这个数据块属于某个表,而这个数据块只放置了一行数据,这行数据只占用 100 字节。当查询这行数据时,Oracle会将整个数据块,读取出来,而不是仅操作 100 字节。
第四,当我们创建数据库对象——数据表、索引、簇表、物化视图——时,将使用逻辑上的数据块。Oracle一次将一组连续相邻的数据块分配给表使用,一组这样的数据块称为一个盘区(Extent),也就是图1-51 中的关系⑤。
第五,当数据库对象(数据表、索引、簇表、物化视图等)的数据量增加后,Oracle将再次分配新的盘区(Extent)给数据库对象。这些盘区的集合称为“段”,也就是图1-51 中的关系⑥。
因此,段(Segment)是用于存储特定数据库对象(表、索引、簇等)中数据的一个或多个盘区的集合。Oracle中常用的段种类如下。
■ 表段:也称数据段,存储表中的所有数据。
■ 索引段:用于存储索引数据。
■ 临时段:用于存放排序操作所产生的临时数据,这些数据也常称为工作表。
■ 还原段:用于存放事务所修改数据的前影像(未修改前的数值)。
■ 其他段种类的段,如大对象段、引导段(bootstrap段)等。
通过段的概念,表空间得以使用,也就是图1-51 中的关系⑦。在一套按照默认创建的Oracle数据库中,包含SYSTEM表空间、SYSAUX表空间、临时表空间、UNDO表空间、数据表空等。其中,SYSTEM表空间存放数据字典数据,称为系统表空间;SYSAUX表空间(Oracle 10g/11g)存储数据库辅助信息,称为辅助表空间;USERS和EXAMPLE表空间存放表演示数据,姑且称之为“学习”表空间;INDX索引表空间(在Oracle 9i中)用于存放索引数据,称为索引表空间;TEMP表空间用于存放临时数据,当然就是临时表空间了;UNDOTBS1 表空间用于存放UNDO数据,称为还原表空间。
最后,形成如图1-52 所示运行在AIX上的一套完整数据库结构。
图1-52 运行在AIX上的一套完整Oracle结构
当客户应用访问Oracle数据库时,首先要连接到Oracle数据库,然后执行数据库访问操作。这里共涉及三个问题:
■ 客户端环境和客户连接。
■ 用户验证和会话建立。
■ SQL执行和访问过程。
应用程序访问Oracle数据库,首先需要连接到Oracle,再进行数据库数据的访问。客户端运行的应用程序,也就是运行在客户端的应用进程,称为用户进程。当这个用户进程试图连接到Oracle时,Oracle在服务器端为用户进程派生一个对应的服务进程,该进程被称为服务器进程。用户进程与服务器进程一一对应(在默认情况下),关系如图1-53 所示。
图1-53 用户进程与服务器进程一一对应
为构造如图1-53 所示的访问结构,应用客户端、数据库服务器端都有各自应做的配置需要完成。例如客户端到服务器的网络连接、客户端软件的安装、数据库连接配置等。对于Oracle数据库服务器而言,则配置和启动对应的网络服务,如图1-54 所示。
在第4章中存在针对如图1-54 所示内容配置的任务说明,以完成客户端到服务器的网络连接和设置。
图1-54 用户进程与服务器进程通过网络通信
客户端设置完成后,如果服务器处于运行状态,则客户端用户进程可以连接数据库服务器,并由Oracle创建对应的服务器进程,构建出基于TCP/IP的网络间通信通道——称之为“会话”(Session)。由于在默认情况下用户进程和服务器进程一一对应,因此一个会话将为一个特定用户连接服务。
Oracle数据库一一对应的会话建立方式,称为独占式数据库连接。与此对应,Oracle还支持一对多关系下的连接方式,即一个服务器进程服务于多个用户进程,这称为共享方式下的用户连接。
图1-55 中,一套Oracle系统既存在独占式连接,也有共享式连接。共享模式连接的用户会话分享若干服务器进程,独占模式下的用户会话独占服务器进程。
图1-55 共享客户连接方式
在下面的示例中,用户使用SQL*Plus工具连接到Oracle,建立了一个独占式会话:
对于关系数据库应用,无论Oracle或Sybase,其标准输入为“SQL”,标准输出为“SQL结果集”。下面讨论SQL在Oracle中是如何被处理的。
任何SQL语句(游标或光标)的执行,都会经过解析(Parse)、执行(Execute)和提取数据(Fetch)三个阶段,如图1-56 所示。
图1-56 Oracle中SQL游标的执行过程
SQL解析
解析(Parse)用于检查SQL语句的语法和语义,生成SQL语句的执行计划,并将SQL语句和执行计划存放到共享池中。在解析期间,用户进程首先将SQL语句发送到服务器进程,然后服务器进程会执行以下操作:
① 搜索共享池中库高速缓存,并检查是否存在相同的SQL语句。如果在库高速缓存中存在同一语句及其执行计划,则直接执行该SQL语句。这就是为什么共享池中要有库缓存这一项。
② 当SQL语句不存在时,服务器进程会检查该SQL语句的语法和语义,以确定表名、列名及权限是否正确,最后生成执行计划、完成SQL的伪代码编译。这需要若干次系统数据字典的访问。这就是为什么共享池中要有数据字典缓存这一项。
③ 申请各种需要的系统资源、如栓、锁、缓存块等操作。
SQL执行
执行(Execute)是指经过语句解析之后,生成了最终的执行计划,服务器进程按照执行计划中所安排的步骤执行SQL语句。过程涉及以下两点:
① 确定被查询或处理的数据所在数据块,是否已经被读取到数据缓冲区中。如果数据已经在缓冲区中,则直接提取数据。这样将不进行物理I/O的操作,能够有效地提高效率。这也是为什么数据库服务器要有大的共享缓存区域的原因。
② 若数据不在缓冲区中,则DBWr进程将数据从数据文件读取到数据高速缓存中。
SQL提取数据
执行语句之后,被选择行所在数据块将被读取到缓冲区中。在提取数据阶段,服务器进程将被查询或处理的数据返回到用户进程。
如果SQL语句是DML(Insert、Delete、Update)操作的,则在SQL执行中,因为涉及数据修改,需要记录事务的变化内容及变化过程。因此还需要做到以下三点:
① 数据排他类型锁的申请和获予,防止其他用户修改相同数据。
② 将数据变化内容(SQL语句、数据块变化、还原块变化)写入到重做日志缓冲区。
③ 复制缓冲区中数据块的原始值到还原表空间中,修改或将新数据写入数据高速缓存的数据块中。
DML语句往往要配合于事务控制语句COMMIT或ROLLBACK。当客户端运行COMMIT语句提交事务时,Oracle立刻将事务变化信息从日志缓存写到操作系统的联机日志文件中,并释放事务所占用的表锁和行锁。为效率考虑,Oracle采用了快速提交机制,即提交时只将日志缓存中的事务变化信息写入联机重做日志,而数据高速缓存中还未写盘的脏数据块不会写入数据文件,而会单独等待检查点写入硬盘。
这样,一套在AIX上运行的Oracle数据库服务器就这样服务了。
在本书的后续章节中将涉及如下内容:
■ AIX环境的准备、服务状态管理。
■ AIX上存储环境的准备,为Oracle存储空间的准备。
■ Oracle在AIX上的环境构建及数据库实现。
■ Oracle在AIX上的服务状态管理、系统管理。
■ Oracle在AIX上的集群系统实现和管理。
■ AIX上系统的备份体系构建。
■ Oracle在AIX上的备份环境和备份实施。
■ AIX上Oracle数据库服务器的系统灾难恢复。
■ AIX上针对Oracle系统的优化配置和Oracle优化配置。