2009年2月6日星期五

表空间、数据文件和控制文件

数据库(database)、表空间(tablespace)及数据文件(datafile)之间的联系与区别:
一个oracle数据库是由一个或多个表空间构成的,表空间是逻辑存储单元,这些表空间共同用于存储数据库中的数据。
oracle数据库中的每个表空间由一个或多个数据文件构成,数据文件是物理文件,这些文件由数据库所在的操作系统管理。
数据库的数据实际存储在构成各个表空间的数据文件中。
注:表空间由一个或多个数据文件组成。数据文件只能属于一个表空间。属于一个表空间的对象(object,例如表、索引等)可以跨越多个数据文件。

一、表空间
数据库是由一个或多个被称为表空间的逻辑单元构成的。表空间内的逻辑存储单位为段,段又可以继续划分为数据扩展,数据扩展是由一组连续的数据块构成的。
1、大文件表空间bigfile tablespace
在oracle中,用户可以创建大文件表空间,这样oracle数据库使用的表空间可以由一个单一的大文件构成,而不是若干小数据文件。这使得oracle可以发挥64位系统的威力,创建、管理超大的文件。在64位系统中,oracle的数据库的存储能力被扩展到了8EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)。
数据库默认创建的是小文件表空间,即oracle中传统的表空间类型。数据库中SYSTEM和SYSAUX表空间在创建时总是使用传统类型。
2、SYSTEM表空间
每个oracle数据库都包含一个名为SYSTEM的表空间,它在数据库创建时,由oracle自动创建。只要数据库处于开启(open)状态,SYSTEM表空间就一定是联机(online)状态。
管理员可以创建本地管理(locally managed)的SYSTEM表空间,或将已有的数据字典管理(dictionary managed)的SYSTEM表空间转换为本地管理,来发挥本地管理表空间的优势。
如果数据库中的SYSTEM表空间为本地管理的。那么此数据库中就不能创建数据字典管理的表空间。我们可以通过可移动表空间(transportable tablespace)功能向其中添加数据字典管理的表空间,但是这个表空间只能是只读的。
注:如果一个表空间为本地管理的,则不能将它转换为数据字典管理的。
SYSTEM表空间总是为整个数据库存储数据字典表。数据字典表存储在编号为1的数据文件中。
3、SYSAUX表空间
SYSAUX表空间是SYSTEM表空间的一个辅助性空间。在10g数据库创建,或从低版本升级到10g时,一定会创建SYSAUX表空间。
此外,SYSAUX表空间还被用来集中存储所有不应放在SYSTEM表空间的数据库元数据。使用SYSAUX表空间可以减少默认创建的表空间的数量。
在正常的数据库操作中,不允许移除、重命名SYSAUX表空间。SYSAUX表空间也不支持可驿动表空间功能。
4、撤销表空间undo tablespace
撤销表空间(undo tablespace)是一个特殊的表空间,只用于存储撤销信息(undo information)。用户不能在撤销表空间中创建段(例如表或索引)。一个数据库中可以没有撤销表空间,也可以有多个。在自动撤销管理模式(automatic undo management mode)下,每个实例有且仅有一个撤销表空间。oracle在撤销表空间内自动地创建和维护撤销段(undo segment),对撤销数据(undo data)进行管理。
5、默认的临时表空间
如果SYSTEM表空间是本地管理的,用户必须在创建数据库时定义一个默认的临时表空间(temporary tablespace)。本地管理的SYSTEM表空间不能作为默认的临时存储空间。
如果SYSTEM表空间是数据字典管理的,窃创建数据库时没有定义默认的临时表空间,那么oracle会将SYSTEM表空间作为默认的临时存储空间使用。此时用户在ALERT.LOG文件中会发现一条警告:建议创建默认的临时表空间,以后的oracle版本将会需要。
6、在数据库中使用多个表空间
一个小型数据库可能只需要使用SYSTEM表空间,但是oracle建议用户至少创建一个额外的表空间来存储用户数据,使之与系统的数据字典信息(data dictionary information)分离。这使得用户在进行数据库管理操作时更灵活,并减少由于数据字典对象(dictionary object)与用户方案对象(schema object)处于同一数据文件而导致竞争。
7、表空间内的空间管理
表空间内为各个方案对象(schema object)分配空间的单位是数据扩展。oracle采用两种方式监控表空间内,空间的已用/可用情况:
本地管理的表空间(locally managed tablespace):通过位图(bitmap)管理数据扩展
数据字典管理的表空间(dictionary managed tablespace):通过数据字典管理数据扩展
当用户创建表空间时,需要选择空间管理方式。在此之后,用户还可以通过DBMS_SPACE_ADMIN PL/SQL包改变管理方式。
注:当用户在创建表空间时没有指定数据扩展的管理方式,默认使用本地管理。
8、多种数据块容量
oracle支持在数据库中使用多种数据块容量(multiple block size)。SYSTEM表空间使用标准数据块容量(standard block size)。这个容量在数据库创建时被设定,可以为任何有效值。用户可以使用DB_BLOCK_SIZE初始化参数(initialization parameter)设定标准数据块容量。数据块容量的合法值(legitimate value)范围是2K到32K。
在初始化参数(initalization parameter file)或服务器参数文件(server parameter file)中,用户可以为数据缓存(buffer cache)内的不同子缓存区(subcache)设定不同的数据块容量(block size)。子缓存区也可以在实例(instance)运行时配置。此外用户还可以创建使用不同数据块容量的表空间。但是SYSTEM表空间及绝大多数表空间还是使用标准数据块容量(standard block size)。
注:一个分区对象(partitioned object)的所有分区(partition)所在的表空间必须使用相同的数据块容量。
多种数据块容量功能主要用于从OLTP数据库向企业级数据仓库(enterprise data warehouse)迁移(transporting)表空间时使用。这有助于在拥有不同数据块容量的数据库间迁移数据。
9、联机/脱机表空间
数据库管理员可以在数据库处于开启(open)状态时,将除SYSTEM表空间之外的任何表空间联机(online)(可访问)或者脱机(offline)(不可访问)。SYSTEM表空间在数据库处于开启状态时总是处于联机状态,因为oracle需要使用其中的数据字典。
表空间通常处于联机状态,以便数据库用户访问其中的数据。但是数据库管理员可以在对表空间进行维护、备份或恢复操作时,令表空间脱机(offline)。
10、只读表空间
使用只读表空间(read-only tablespace)的主要目的是为了避免对静态且容量大的数据库内容进行备份和恢复操作。oracle不会更新只读表空间内的数据,因为这类表空间的数据文件可以放置正在CD-ROM或WORM之类的只读介质(read-only media)上。
注:用户只能将一个表空间联机到创建它的数据库,因此只读表空间(read-only tablespace)技术不适合用于存档(archiving)。
只读表空间不能被修改。如果需要更新一个只读表空间,首要要使表空间可读写。在更新后,还可以将表空间恢复到只读状态。
因为只读表空间不能被修改,只要没有将只读表空间置于可读写状态,就无需对其进行重复的备份操作。当用户需要恢复数据库时,也没必要恢复只读空间。
11、排序操作使用的临时表空间
用户可以为排序操作(sort operation)指定一个或多个专用的临时表空间(temporary tablespace),这可使排序操作所需的空间管理工作更高效。使用专用的临时表空间进行排序,可以有效地避免频繁的排序空间分配与回收而造成的空间管理操作(space management operation)。一个SQL语句可以同时使用多个临时表空间(temporary tablespace)进行排序。例如当用户为一个大表创建索引时所需的排序操作就可以在多个临时表空间上进行。
所有会用到排序(sort)的数据库操作,例如连接(join),创建索引,排序(order by),计算汇总(group by),及手机优化器(optimizer)所需的统计信息,都可以利用临时表空间。在RAC(real application cluster)环境中使用临时表空间带来的性能提升更加显著。
12、在数据库之间移动表空间
用户可以利用可移动表空间(transportable tablespace)将oracle数据库的一部分移动到另一个数据库中,这种操作还可以跨平台。用户可以在数据库间复制表空间,即首先克隆一个表空间再加入到另一个数据库;用户也可以在数据库间移动表空间,即从一个oracle数据库移出一个表空间,并放入另一个数据库。
通过可移动表空间(transportable tablespace)迁移数据与使用export/import相比,速度可以提高几个数量级。因为使用可移动表空间技术只需复制数据文件,并整合表空间元数据(tablespace metadata)即可。用户在使用可移动表空间时还可以同时迁移索引数据,因此数据被移动后无需重建索引。
用户可以跨平台移动表空间(跨平台移动表空间并不支持所有平台,但支持大多数平台),跨平台移动表空间的用途有:
使内容提供者(content provider)向其在不同平台上使用oracle的客户发送结构化数据(structured data)变得简单、高效。
简化了从数据仓库环境(data warehouse enviroment)向数据集市环境(data mart enviroment)发布数据的工作。数据集市通常运行在更小的平台上。
在异构的集群(heterogeneous cluster)中共享只读表空间(read only tablespace)。
在不同平台间迁移数据库
二、数据文件datafile
oracle数据库中每个表空间都是由一个或多个物理数据文件构成的。一个数据文件只能由一个数据库的一个表空间使用。
oracle为表空间创建数据文件时,分配的磁盘空间总和为用户指定的存储容量加上管理开销所需的文件头空间。当数据文件被创建后,oracle所在的系统负责清除文件的数据及授权信息,并将它分配给oracle使用。如果文件很大,这个过程会消耗较长时间。oracle数据库中的第一个表空间总是SYSTEM表空间,因此oracle在创建数据库时总是将第一个数据文件分配给SYSTEM表空间。
1、数据文件的内容
当一个数据文件首次被创建时,为其分配的磁盘空间被格式化为oracle格式,此时其中尚不包含任何用户数据。oracle将使用这些空间存储属于(与此数据文件对应的)表空间的段,这些空间专为oracle使用。随着表空间内数据增长,oracle使用数据文件中的可用空间为段分配新的数据扩展。
属于一个表空间的各个方案对象(schema object)的数据,在物理上,存储于构成此表孔吉爱你的一个或多个数据文件中。需要注意的是,并不是一种类型的方案对象需要存储在特定的数据文件中,相反,一个数据文件可以存储表空间内各种类型的方案对象。oracle为表空间内的方案对象分配空间时可以使用一个或多个数据文件。也就是说,方案对象是可以跨数据文件的。除非使用表分布(striping)技术(数据可以分布存储在多个磁盘上),否则数据库管理员和用户都不能控制方案对象使用哪个数据文件。
2、数据文件的容量
用户可以在数据文件被创建后改变其容量,也可以在创建时设定数据文件随表空间内方案对象(schema object)的增长而动态增长。这个功能可以减少表空间内数据文件的数量,从而简化数据文件的管理操作。
注:当然用户使用的操作系统中也要有足够的空间供数据文件扩展。
3、脱机数据文件
除了SYSTEM表空间之外,用户可以随时将任何表空间置为联机(online)或脱机(offline)状态。此时一个表空间的所有数据文件也被作为一个整体同时被置为联机或脱机状态。
4、临时数据文件
本地管理的临时表空间使用临时的数据文件(临时文件),这样的文件与普通数据文件类似,但有以下区别:
临时文件总是被设置为NOLOGGING模式。
用户不能将临时文件设置为只读
用户不能使用ALTER DATABASE语句创建临时文件
介质恢复(media recovery)不能使识别临时文件,BACKUP CONTROLFILE不会产生与临时文件有关的信息,CREATE CONTROLFILE不能设置与临时文件有关的信息
当用户创建临时文件或改变其容量时,oracle并不保证按照用户指定的文件容量为其分配磁盘空间。在某些文件系统中(例如UNIX)磁盘块(disk block)并不会在文件创建或改变容量时分配,而是在其被使用之前才分配。
注:这样会使得临时文件创建与改变容量操作执行更快,但是随着临时文件的使用可能会导致磁盘空间不足。
临时文件(tempfile)信息可以从DBA_TEMP_FILES数据字典及V$TEMPFILE动态性能视图(dynamic performance view)中查询,但是不存在于DBA_DATA_FILES或V$DATAFILE视图中。
三、控制文件
数据库控制文件(control file)是一个二进制文件,供数据库启动及正常工作时使用。在数据库运行过程中,控制文件会被oracle修改,因此数据库处于开启(open)状态时,控制文件必须可写。如果控制文件因故不能访问,数据库也将无法正常工作。
每个控制文件只能供一个oracle数据库使用。
1、控制文件的内容
控制文件中包含了其所属数据库的信息,实例的在启动、及正常工作期间都需要存取这些信息。控制文件的内容只能由oracle修改,数据库管理员或用户都不应编辑控制文件。
控制文件主要包含以下内容:
数据库名(database name)
数据库创建时的时间戳(timestamp)
属于此数据库的数据文件及重做日志文件(redo log file)的名称与存储位置
表空间信息
脱机的数据文件(datafile offline ranges)
日志离世信息(the log history)
归档日志(archived log)信息
备份集(backup set)与备份块(backup piece)信息
数据文件与重做日志的备份信息
数据文件复制信息
当前的日志序列号(log sequence number)
检查点(checkpoint)信息
数据库名和数据库创建时间戳都来源于数据库创建过程。数据库名既可以来自DB_NAME初始化参数中的设定值,也可以来自CREATE DATABASE语句中的指定值。
每当添加、重命名、或移除数据库中的数据文件及重做日志文件时,控制文件就会更新以反映这些数据库物理结构变化。进行这些记录的目的是:
oracle可以藉此在数据库启动(startup)时识别打开的数据文件和重做日志文件
oracle可以藉此在恢复数据库时识别当前可用及需要恢复的文件
因此,用户每次更改数据库的物理结构后(使用ALTER DATABASE语句),一定要及时备份控制文件。
控制文件还被用于保存检查点信息。每隔三秒钟,检查点进程(checkpoint porcess,CKPT)将会在控制文件中记录重做日志(redo log)检查点的位置(checkpoint position)信息。当数据库恢复时,重做日志中此点之前的重做条目(redo entry)都无需恢复,因为这些数据已经被写入数据文件中。
注:这里的数据库恢复,是指类似服务器突然断电,导致缓存中的数据没有写入数据文件,当数据库再启动时,控制文件会根据检查点,使用重做条目,来对数据库进行恢复,这样做可以减少恢复数据库所用的时间,不用从一开始进行恢复。如果保存完整的重做日志,则可以恢复到任何时候的数据库状态。
2、多重控制文件
如同重做日志文件(redo log file)一样,oracle也可以为一个数据库同时维护多个完全相同的控制文件。通过在不同磁盘上为一个数据库存储多重控制文件(multiple control file),可以有效地避免控制文件的单点脆弱性(single point of failure)。当一个包含控制玩呢间的磁盘发生故障时,如果oracle试图访问这个控制文件就会导致当前的实例出现故障。但如果其他磁盘中存在此控制文件的备份,实例就可以被立即重新启动而无需进行数据库恢复。
如果一个数据库的所有控制文件永久丢失了,那么实例将中止且需要进行介质恢复(media recovery)。如果没有当前控制文件的副本而必须使用较早的备份,那么介质恢复过程将会比较复杂。因此oracle强烈建议用户遵循以下规则:
在每个数据库中使用多重控制文件(multiple control file)
将控制文件的副本存储在不同的物理磁盘上
使用操作系统的镜像功能(operatin system mirroring)
监控备份工作

数据块、数据扩展和段

一、数据块data block
oracle以数据块(data block)的形式管理数据库的数据文件中的存储空间。数据块是数据库使用的最小数据单元。每个操作系统都有一个块大小(block size,根据每个操作系统而不同)。oracle请求数据时使用的是oracle数据块的整数倍,不是操作系统的块。
标准的块大小,是由初始化参数中的DB_BLOCK_SIZE来指定的。此外,我们可以最多指定5个非标准的块大小。
注:指定的块大小最好是操作系统的块大小的整数倍,以避免不必要的I/O操作。oracle数据块是oracle能使用、分配的最小存储单元。
数据块的结构(format):
1、header(common and variable):头部包含了块的大致信息,比如块地址和段类型(例如是数据段还是索引段)
2、table directory:数据块的这个部分包含了在这个块中拥有行(rows)的那个表的信息
3、row directory:数据块的这个部分包含了在这个块中实际存储的行的信息(包括在行数据区域row data area中每个行片row piece的地址)
注:在一个数据块的开销中分配了row directory以后,除非这个行被删除,否则这个空间是不会被回收(reclaim)的
4、overhead 开销:data block header、table directory和row directory综合起来被称为开销overhead。开销中的有些值是大小固定的。但是数据块的总开销是变量。平均来讲,数据块的开销为84-107字节
5、row data:数据块的这个部分包含了表或者索引数据。行可以跨越多个数据块
6、free space:空闲空间存储新插入的行,或者当某个行的进行更新时,可能需要的额外空间
二、数据扩展extent
数据扩展是数据库存储空间分配的逻辑单元,它是由一些列连续的数据块组成的。一个或多个数据扩展轮流组成一个段(segment)。当在一个段中已经存在的空间全部被使用后,oracle会将一个新的数据扩展分配给这个段。
三、段segment
一个段segment是一系列的数据扩展(extent),其中存储了表空间(tablespace)内各种逻辑存储结构的数据。例如,对每个表,oracle分配了一个或多个数据扩展来组成那个表的数据段;对每隔索引,oracle分配了一个或多个数据扩展来组成它的索引段。
1、数据段data sgement
在oracle数据库中的一个数据段包含了下面这些中的数据:
非分区表或非簇表
分区表的一部分
一个簇表
当用户使用CREATE语句创建表或者簇的时候,oracle会创建相应的数据段。表或簇的存储参数用来决定相应的数据段的数据扩展如何被分配。用户可以使用CREATE或ALTER语句直接设定这些存储参数。这些参数会影响与对象(object)相关的数据段的存储和访问(retrieval)效率。
2、索引段index segment
oracle数据库中每个非分区索引(nonpartitioned index)有一个索引段来容纳它所有的数据。对一个分区索引(partitional index)而言,每个分区有一个索引段来容纳它的数据。
我们可以使用CREATE INDEX语句,来为每个索引或每个分区的索引创建索引段。在这个语句中,我们可以设索引段的存储参数以及索引段应该存储在那个表空间。索引段的存储参数将会影响数据的存储和访问效率。
注:表的数据段与其相关的索引段不一定要存储在同一表空间中,可以将两者存储在不同的磁盘上,来提高效率。因为在两个磁盘上,因此可以同时进行两者的操作。
3、临时段temporary segement
当处理查询时,oracle经常需要为SQL语句的解析(parsing)和执行(execution)的中间结果(intermediate stage)准备临时空间。oracle会自动分配称为临时段的磁盘空间。例如:当进行排序操作的时候就需要使用临时段。当排序操作可以在内存中执行,或可以利用索引执行时,不必创建临时段。
以下语句的执行可能会使用临时段:
CREATE INDEX
SELECT ... ORDER BY
SELECT DISTINCT ... (DISTINCT 清楚的、明确的)
SELECT ... GROUP BY
SELECT ... UNION (UNION 结合)
SELECT ... INTERSECT (INTERSECT 交叉)
SELECT ... MINUS
有些不能使用索引的关联操作(unindexed join),或者需要在子查询间建立相互关系(correlated subquery),也有可能需要使用临时段。
oracle可以为临时表(temporary table)及其索引分配临时段,临时表中的数据只在会话(session)或事务(transaction)的运行期内存在。
4、自动撤销管理automatic undo management
oracle中保存了用于恢复对数据库操作的信息。例如事务中所有操作的记录。oracle可以利用撤销信息完成以下工作:
回滚(rollback)一个活动的事务
恢复(recover)一个已经结束的事务
提供读完整性(read consistency)
恢复语句的逻辑错误(当执行了一个逻辑错误的语句后,oracle可以进行撤销操作)
自动撤销管理是基于撤销表空间的。用户使用撤销表空间来管理撤销信息,这样就不用创建多个大小不一的回滚段。
自动撤销管理消除(eliminate)了管理回滚字段的复杂性(complexity),使用户只需专注于控制撤销信息的保存期限。oracle强烈建议用户使用撤销表空间,避免使用回滚段。系统能够自动调整撤销信息在撤销表空间内的保存时间,以供需要使用撤销信息的查询使用。如果正在使用的撤销表空间中有足够的空降,用户可以为为UNDO_RETENTION(retention 保留)参数设定一个最低阀值(low threshold value),这样系统中的撤销信息至少在此值指定的时期内被保留。
用户可以使用V$UNDOSTAT视图来监视撤销表空间的使用情况,并对其进行配置以提高效率。V$UNDOSTAT能够显示各种与撤销空间及相关事务有关的统计信息,例如当前实例(instance)中使用了多少撤销空间。

2009年2月1日星期日

参数及参数文件

在oracle数据库中,有一系列的初始化参数用来进行数据库约束和资源限制,这些参数通常存储在一个参数文件中,在数据库实例启动时读取并加载。
一、初始化参数的分类
按照得出方式不同,初始化参数可以分为3类:推导参数、操作系统依赖参数和可变参数。
1、推导参数(Derived Parameters)
推导参数通常来自于其他参数的运算,依赖其他参数得出。所以这类参数通常不需要修改。如果强制修改,那么修改值会覆盖推导值。
2、操作系统依赖参数
某些参数的有效值或者取值范围依赖或者受限于操作系统。如db_cache_size参数,设置oracle使用的内存大小,该参数的最大值就要受限于物理内存。这一类参数通常被称为操作系统依赖参数。
3、可变参数
可变参数通常可以调整,有些设置的是限制条件,如OPEN_CURSORS;有的参数是设置容量,如DB_CACHE_SIZE等。这类参数通常可以为DBA或最终用户调整,从而产生限制或性能变化。
初始化参数通常还有一些其他分类方式:
按照修改方式划分,初始化参数又可以分为静态参数和动态参数。静态参数只能在参数文件中修改,在重新启动后才能生效;动态参数可以动态调整,调整后通常可以立即生效。
按照获取方式不同,初始化参数又可以分为显式参数和隐含参数:
显式参数可以通过v$parameter查询得到;而隐含参数通常以"_"开头,必须通过查询系统表才能获得这些参数(不建议修改隐含参数)。
二、参数文件
参数文件是一个包含一系列参数及参数对应值的操作系统文件,它有以下两种类型:
初始化参数文件(Initialization Parameters Files):oracle 9i之前oracle一直采用pfile方式存储初始化参数,该文件为文本文件。
服务器参数文件(Server Parameter Files):从oracle 9i开始,oracle引入了spfile文件,该文件为二进制格式。
在9i以前,oracle使用pfile存储初始化参数设置,参数文件的修改需要手工进行,这些参数在实例启动时被读取,通过pfile的修改需要重起实例才能生效;从9i开始,oracle引入spfile文件,使用spfile,用户可以通过ALTER SYSTEM或者ALTER SESSION来修改参数,而不再需要通过手工修改。对于动态参数,所有更改可以立即生效,同时用户可以选择更改只应用于当前实例还是同时应用到spfile。对于静态参数,只能将变更应用到spfile文件,这些变更在数据库重启后生效。
所有对spfile的修改都可以通过命令行完成。(oracle备份恢复体系)
1、pfile和spfile
第一次启动数据库时需要pfile,然后可以根据pfile创建spfile,此后用户可以不再需要pfile。
注:当使用DBCA自定义创建数据库时,在最后一个步骤,可以选择“生成数据库创建脚本”,通过这个脚本,可以研究oracle是怎样创建的数据库,也可以通过脚本执行,按步骤手工创建数据库。
2、spfile的创建
从9i开始,缺省情况下,oracle使用spfile启动数据库。其实spfile必须由pfile创建,新创建的spfile在下一次启动数据库时生效。
CREATE SPFILE需要SYSDBA或者SYSOPER权限,具体语法如下:
CRESTE SPFILE[='SPFILE-NAME'] FROM PFILE[='PFILE-NAME']
缺省情况下,spfile创建到以下系统缺省目录。
对于unix,目录为$oracle_home/dbs
对于NT,目录为$oracle_home\database
如果spfile已经存在,那么创建会返回错误:ORA-32002:无法创建已由例程使用的SPFILE。可以通过这个来判断当前是否使用了spfile文件。
随着spfile的引入,oracle同时引入了一个视图用以记录spfile的参数设置信息,这个视图是v$spparameter。
注:运行期间,spfile并不锁定,所以spfile可能会意外丢失,如果发生类似情况,oracle会不允许使用create spfile from pfile缺省命令来重建spfile(因为ORA-32002错误而失败),通常可以创建一个自定义名称的spfile文件,然后重命名为缺省名称即可。
3、spfile的搜索顺序
使用startup命令重新启动数据库,oracle会按照以下顺序在缺省目录中搜索参数文件。
(1)spfile$oracle_sid.ora,其缺省目录如下:
unix:$oracle_home/dbs/
NT:%oracle_home%\database
(2)spfile.ora,其缺省目录如下:
unix:$oracle_home/dbs/
NT:%oracle_home%\database
(3)init$oracle_sid.ora,其缺省目录如下:
unix:$oracle_home/dbs/
NT:%oracle_home%\database
创建了spfile,重新启动数据库,oracle会按顺序搜索以上目录,spfile就会自动生效。
注:可以修改默认目录。
4、使用pfile/spfile启动数据库
如果想使用pfile启动数据库,则可以在启动时指定pfile或者删除spfile:
SQL>startup pfile="E:\oracle\admin\test\pfile\init.ora";
不能以同样的方式指定spfile,但是可以创建一个包含spfile参数的pfile文件,将spfile参数的值指向spfile。spfile是一个自oracle 9i引入的初始化参数,类似IFILE参数。spfile参数用于定义非缺省路径的spfile文件。
可以在pfile连接到spfile文件,同时在pfile中定义其他参数,如果参数重复设置,后读取的参数将取代先前的设置。
在RAC(real application clusters 真正应用集群)系统中经常使用,由于在RAC中,用户通常需要把spfile存储在共享磁盘上,所以常规的做法就是通过定义pfile文件,在pfile文件中对spfile文件进行重定向。
注:通过在pfile中调用spfile,使用后设置的参数覆盖spfile中的参数设置,是解决spfile中参数设置错误的一种方法。
5、修改参数
可以通过alter system或者导入导出来更改spfile的内容。
从oracle9i开始,alter system命令增加了一个新的选项scope。scope参数有3个可选值:memory、spfile和both。
memory:只改变当前实例运行,重新启动数据库后失败。
spfile:只该改变spfile的设置,不改变当前实例运行,重新启动数据库后生效。
both:同时改变实例及spfile,当前更改立即生效,重新启动数据库后仍然有效。
针对RAC环境,alter system还可以指定SID参数,对不同实例进行不同设置。
完整命令:
alter system set = scope = memory spfile both [sid=]
注:对于静态参数,只能指定scope=spfile进行修改。通过scope=spfile修改的参数,虽然对当前实例无效,但是其参数值可以从v$spparameter视图中查询得到。
注:不带scope参数和scope=both实际上是等价的。如果修改静态参数,那么需要指定spfile参数,不能指定both参数,否则数据库将会报错。
在RAC环境中,如果不指定SID名称,或者指定为“*”,那么修改缺省的对所有实例都生效。
注:在RAC环境中,不同实例的undo_tablespace设置是不同的,当修改一个实例的undo表空间时,一定要注意指定相应的实例,以避免修改错误。
如果不慎错误地修改了参数导致数据库无法启动,我们可以通过spfile创建pfile文件,然后修改pfile中的参数(将错误修改的参数再改正回来),再由pfile创建spfile的方式解决,最后由spfile正常启动数据库。
注:由于spfile是一个二进制文件,所以不能通过手工方式修改,手工修改会导致spfile损坏,使得该spfile不能启动数据库。
6、重置spfile中设置的参数
恢复某个参数为缺省值:
alter system parameter sid='sid*'
注:该命令通常用于RAC环境中,在单实例环境中,需要指定sid='*',reset一个参数,oracle将从spfile文件中删除该参数。
7、导出spfile文件
spfile文件可以导出为文本文件,可以使用导出、创建过程可以向spfile中添加参数。
create pfilei='e:\test.ora' from spfile;
注:对于单机数据库,导出的文件中,每个参数以一个"*"开头,这意味着该参数可以影响所有的实例;而对于并行环境(RAC),可以看到不同实例的参数设置可以不同,这时可以用实例名称来替换"*"。
生成了pfile之后,可以使用这个pfile,或者手动修改其中的参数以启动数据库(用修改后的pfile生成spfile,然后启动数据库)。