DBA入门之Oracle数据库参数文件
参数文件是一个包含一系列参数及参数对应值的操作系统文件,它有一下两种类型:
初始化参数文件(Initialization Parameters Files):Oracle 9i之前Oracle一直采用pfile方式存储初始化参数,该文件为文本文件;
服务器参数文件(Server Parameter Files):从Oracle 9i开始,Oracle引入了spfile文件,该文件为二进制格式;
从操作系统上,也可以看出这两者的区别:
[oracle@czjie ~]$ cd $ORACLE_HOME/dbs
[oracle@czjie dbs]$ ls
hc_czjie.dat initdw.ora lkORCL spfileORCL.ora
hc_ORCL.dat init.ora orapwORCL spfileORCL.ora.bak
initczjie.ora initORCL.ora.bak spfile.ora.bak sqlnet.log
[oracle@czjie dbs]$ file initORCL.ora
initORCL.ora.bak: ASCII text
[oracle@czjie dbs]$ file spfileORCL.ora
spfileORCL.ora: data
在9i以前,Oracle使用pfile存储初始化参数设置,参数文件的修改需要手工进行,这些参数在实例启动时被读取,通过pfile的修改需要重启实例才能生效;从Oracle 9i开始,Oracle引入spfile文件,使用spfile用户可以通过ALTER SYSTEM或者ALTER SESSION来修改参数,而不再需要通过手工修改。对于动态参数,所有更改可以立即生效,同事用户可以选择使更改只应用于当前实例还是同事应用到spfile,对于静态参数,只能变更应用到spfile文件,这些变更在数据库重启后生效。
这就是的所有对spfile的修改都可以通过命令行完成,我们可以彻底告别手工修改初始化参数文件的历史,这就大大减少了人为错误的发生。
另外spfile是一个二进制文件,可以使用rman进行备份,这样实际上Oracle把参数文件也纳入了Oracle的备份恢复体系。
1. PFILE和SPFILE
除了第一次启动数据库需要pifle(然后可以根据pfile创建spfile),用户可以不再需要pfile,Oracle强烈推荐使用spfile,应用其特性来存储和维护初始化参数的设置。
当使用DBCA自定义(不使用模板)创建数据库时,再最后一个步骤,可以选择“生成数据库创建脚本”复选框,如下图所示,通过这个脚本,可以研究Oracle是怎样创建的数据库,也可以通过脚本执行,按步骤地手工创建数据库。
下面以Linux为例,在scrips目录下,通常可以看到这样一些脚本(根据安装选项不同,脚本可能不同):
[oracle@czjie ~]$ cd /opt/ora10g/admin/czjie/scripts/
[oracle@czjie scripts]$ ls -al
总计 44
drwxr-x--- 2 oracle oinstall 4096 11-22 16:08 .
drwxr-x--- 9 oracle oinstall 4096 11-22 16:08 ..
-rw-r----- 1 oracle oinstall 1910 11-22 16:08 cloneDBCreation.sql
-rw-r----- 1 oracle oinstall 236 11-22 16:08 CloneRmanRestore.sql
-rwxr-xr-x 1 oracle oinstall 652 11-22 16:08 czjie.sh
-rwxr-xr-x 1 oracle oinstall 668 11-22 16:08 czjie.sql
-rw-r----- 1 oracle oinstall 2462 11-22 16:08 initczjieTemp.ora
-rw-r----- 1 oracle oinstall 2449 11-22 16:08 init.ora
-rw-r----- 1 oracle oinstall 1159 11-22 16:08 postDBCreation.sql
-rw-r----- 1 oracle oinstall 622 11-22 16:08 postScripts.sql
-rw-r----- 1 oracle oinstall 1332 11-22 16:08 rmanRestoreDatafiles.sql
手工创建过程通常可以通过czjie.sh批处理文件执行开始,系统会根据脚本自动执行创建过程。
这里存在一个init.ora文件(或init.ora<时间戳>),这个文件是根据用户创建数据库之前定义的参数自动生成的,该参数被用来创建过程中启动数据库,通过cloneDBCreation.sql可以看到这个引用:
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool /opt/ora10g/admin/czjie/scripts/cloneDBCreation.log
Create controlfile reuse set database "czjie"
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
Datafile
'/opt/ora10g/oradata/czjie/system01.dbf',
'/opt/ora10g/oradata/czjie/undotbs01.dbf',
'/opt/ora10g/oradata/czjie/sysaux01.dbf',
'/opt/ora10g/oradata/czjie/users01.dbf'
LOGFILE GROUP 1 ('/opt/ora10g/oradata/czjie/redo01.log') SIZE 51200K,
GROUP 2 ('/opt/ora10g/oradata/czjie/redo02.log') SIZE 51200K,
GROUP 3 ('/opt/ora10g/oradata/czjie/redo03.log') SIZE 51200K RESETLOGS;
exec dbms_backup_restore.zerodbid(0);
shutdown immediate;
startup nomount pfile="/opt/ora10g/admin/czjie/scripts/initczjieTemp.ora";
Create controlfile reuse set database "czjie"
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
Datafile
'/opt/ora10g/oradata/czjie/system01.dbf',
'/opt/ora10g/oradata/czjie/undotbs01.dbf',
'/opt/ora10g/oradata/czjie/sysaux01.dbf',
'/opt/ora10g/oradata/czjie/users01.dbf'
LOGFILE GROUP 1 ('/opt/ora10g/oradata/czjie/redo01.log') SIZE 51200K,
GROUP 2 ('/opt/ora10g/oradata/czjie/redo02.log') SIZE 51200K,
GROUP 3 ('/opt/ora10g/oradata/czjie/redo03.log') SIZE 51200K RESETLOGS;
alter system enable restricted session;
alter database "czjie" open resetlogs;
alter database rename global_name to "czjie";
ALTER TABLESPACE TEMP ADD TEMPFILE '/opt/ora10g/oradata/czjie/temp01.dbf' SIZE 20480K REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED;
select tablespace_name from dba_tablespaces where tablespace_name='USERS';
select sid, program, serial#, username from v$session;
alter database character set INTERNAL_CONVERT WE8ISO8859P1;
alter database national character set INTERNAL_CONVERT AL16UTF16;
alter user sys identified by "&&sysPassword";
alter user system identified by "&&systemPassword";
alter system disable restricted session;
在数据库创建完成之后,Oracle调用postDBCreation.sql脚本进行一系列的后续处理,最后Oracle通过init.ora文件创建了spfile文件,该脚本的内容大致如下:
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
spool /opt/ora10g/admin/czjie/scripts/postDBCreation.log
connect "SYS"/"&&sysPassword" as SYSDBA
set echo on
create spfile='/opt/ora10g/product/10.2.0/db_1/dbs/spfileczjie.ora' FROM pfile='/opt/ora10g/admin/czjie/scripts/init.ora';
shutdown immediate;
connect "SYS"/"&&sysPassword" as SYSDBA
startup ;
alter user SYSMAN identified by "&&sysmanPassword" account unlock;
alter user DBSNMP identified by "&&dbsnmpPassword" account unlock;
select 'utl_recomp_begin: ' || to_char(sysdate, 'HH:MI:SS') from dual;
execute utl_recomp.recomp_serial();
select 'utl_recomp_end: ' || to_char(sysdate, 'HH:MI:SS') from dual;
host /opt/ora10g/product/10.2.0/db_1/bin/emca -config dbcontrol db -silent -DB_UNIQUE_NAME czjie -PORT 1521 -EM_HOME /opt/ora10g/product/10.2.0/db_1 -LISTENER LISTENER -SERVICE_NAME czjie -SYS_PWD &&sysPassword -SID czjie -ORACLE_HOME /opt/ora10g/product/10.2.0/db_1 -DBSNMP_PWD &&dbsnmpPassword -HOST czjie -LISTENER_OH /opt/ora10g/product/10.2.0/db_1 -LOG_FILE /opt/ora10g/admin/czjie/scripts/emConfig.log -SYSMAN_PWD &&sysmanPassword;
spool /opt/ora10g/admin/czjie/scripts/postDBCreation.log
这就是从Oracle 10g开始的pfile和spfile的交接。
建议每个视图深入学习Oracle的用户都仔细研究一下自动建库的脚本,深入了解该过程非常有助于深入学习Oracle。
2. SPFILE的创建
从Oracle 9i开始,缺省情况下,Oracle使用spfile自动启动数据库,从上一届的数据库创建过程也可以看到,spfile必须由pfile创建,新创建的spfile在下一次启动数据库时生效。
CREATE SPFILE需要sysdba或者sysoper的权限,具体语法如下:
CREATE SPFILE[=’SPFILE-NAME’] FROM PFILE[=’PFILE-NAME’]
例如:
SQL>create spfile from pfile;
缺省情况下,spfile创建到一下系统缺省目录。
对于UNIX,目录为$ORACLE_HOME/dbs;
对于NT,目录为$ORACLE_HOME\database;
如果SPFILE已经存在,那么创建会返回一下错误:
SQL> create spfile from pfile;
create spfile from pfile
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance
这也可以用来判断当前是否使用了spfile文件。
随着spfile的引入,Oracle同时引入了一个视图用以记录spfile的参数设置信息,这个视图是v$spparameter。
然而意外的是,Oracle并没有像其他文件一样,在运行期间保持锁定,由于运行期并不锁定spfile,所以spfile可能会意外丢失,如果发生此类情况,Oracle会不允许使用create spfile from pfile缺省命令来重建spfile(因ORA-32002错误而失败),通常可以创建一个自定义名称的spfile文件,然后重命名为缺省名称即可。
3. SPFILE的搜索顺序
重新启动数据库,使用startup命令,Oracle将会按照一下顺序在缺省目录中搜索参数文件。
(1) spfile<ORACLE_SID>.ora,其缺省目录如下:
UNIX:$ORACLE_ISD/dbs
NT:%ORACLE_HOME%\database
(2) spfile.ora,其缺省目录如下:
UNIX:$ORACLE_ISD/dbs
NT:%ORACLE_HOME%\database
(3) init<ORACLE_SID>.ora,其缺省目录如下:
UNIX:$ORACLE_ISD/dbs
NT:%ORACLE_HOME%\database
创建了spfile,重新启动数据库,Oracle会按照顺序搜索一上目录,spfile将会自动生效。
4. 使用PFILE/SPFILE启动数据库
如果想使用pfile启动数据库,则可以在启动时指定pfile或者删除spfile:
SQL>startup pfile=’/opt/ora10g/admin/czjie/pfile/init.ora’
不能以同样的方式指定spfile,但是可以创建一个包含spfile参数的pfile文件,指向spfile。Spifle是一个自oracle 9i引入的初始化参数,类似于IFILE参数。Spfile参数用于定义非缺省路径的spifle文件。
可以在pfile链接到spifle文件,同事在pfile中定义其他参数,如果参数重复设置,后读取的参数将取代先前的设置。
查看例程当前使用的参数文件类型:
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /opt/ora10g/product/10.2.0/db_
1/dbs/spfileORCL.ora
如果Valus存在返回值,则说明当前使用spfile,没有返回值则说明使用pfile。
SQL> startup pfile='/opt/ora10g/initORCL.ora';
ORACLE instance started.
Total System Global Area 218103808 bytes
Fixed Size 1266680 bytes
Variable Size 71306248 bytes
Database Buffers 142606336 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
5. 修改参数
可以通过ALTER SYSTEM或者导入导出来更改spfile的内容。
从Oracle 9i开始,ALTER SYSTEM命令增加了一个新的选项scope。Scope参数有3个可选值:memory、spfile和both。
Memory:只改变当前实例运行,重启启动数据库后失效。
Spfile:只改变spfile的设置,不改变当前实例运行,重启启动数据库后生效
Both:同事改变实例及spfile,当前更改立即生效,重新启动数据库仍然有效。
针对RAC环境,ALTER SYSTEM还可以指定SID参数,对不同实例进行不同设置。所以通过spfile修改参数的完整命令如下:
Alter system set <parameter_name>=<value> scope=memory|spfile|both [sid=<sid_name>]
下面通过简单的例子来看一下scope参数的几个用法。
1. scope=memory
修改当前实例的db_cache_advice参数为OFF:
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string ON
SQL> alter system set db_cache_advice=off scope=memory;
System altered.
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
如果观察alter_<sid>.log文件,可以发现其中记录了如下一行:
Wed Nov 23 16:04:08 2011
ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=MEMORY;
如果重新启动数据库,这个更改将会丢失:
SQL> startup force
ORACLE instance started.
Total System Global Area 218103808 bytes
Fixed Size 1266680 bytes
Variable Size 113249288 bytes
Database Buffers 100663296 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string ON
也就是说scope=memory的修改影响,不会跨越数据库的重新启动。
2. scope=spfile
当指定scope=spfile时,当前实例运行不受影响:
SQL> alter system set db_cache_advice=off scope=spfile;
System altered.
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string ON
同样可以从alert_<sid>.log文件中看到这个修改:
Wed Nov 23 16:09:00 2011
ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=SPFILE;
这个修改将在下次数据库启动后生效:
SQL> startup force;
ORACLE instance started.
Total System Global Area 218103808 bytes
Fixed Size 1266680 bytes
Variable Size 113249288 bytes
Database Buffers 100663296 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
但是需要知道的是,对于静态参数,只能指定scope=spfile进行修改。
通过scope=spfile修改的参数,虽然对当前实例无效,但是其参数值可以从v$spparameter视图中查询得到:
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
SQL> alter system set db_cache_advice=on scope=spfile;
System altered.
SQL> select name,value from v$spparameter where name='db_cache_advice';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
db_cache_advice
ON
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
3. scope=both
使用both选项实际上等同于不带参数的ALTER SYSTEM语句。
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
SQL> alter system set db_cache_advice=off scope=both;
System altered.
SQL> alter system set db_cache_advice=off;
System altered.
SQL> show parameter db_cache_ad
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_advice string OFF
在alter_<sid>.log文件中,可以看到如下信息:
Wed Nov 23 16:14:50 2011
ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=BOTH;
Wed Nov 23 16:15:00 2011
ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=BOTH;
注意不带scope参数和scope=both实际上是等价的。如果修改静态参数,那么需要指定spfile参数,不能指定both参数,否则数据库将会报错。
4. 在关闭数据库状态修改spfile
可以在数据库shutdown时创建和修改spfiel,例如:
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> create pfile from spfile;
File created.
所以如果不慎错误地西欧该了参数导致数据库无法启动时,可以通过创建pfile文件,修改其中的参数,再由pfile创建spfile的方式解决,最后由spfile正常启动数据库。
例如,如下设置了db_block_buffers参数之后,数据库在下次启动时将会出错,因为该参数与db_cache_size不兼容:
SQL> alter system set db_block_buffers=1000 scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORA-00824: cannot set sga_target due to existing internal settings, see alert log for more information
此时可以由spfile创建pfile文件:
SQL> create pfile from spfile;
File created.
然后修改参数文件,删除其中的db_block_buffers参数:
*.db_block_buffers=1000
然后由pfile创建spfile启动数据库:
SQL> create spfile from pfile;
File created.
SQL> startup
ORACLE instance started.
Total System Global Area 218103808 bytes
Fixed Size 1266680 bytes
Variable Size 113249288 bytes
Database Buffers 100663296 bytes
Redo Buffers 2924544 bytes
Database mounted.
Database opened.
Spfile的修改和使用方式,是一定要熟练的。
提示:这是修改spifle的第二种方式,通过这种方式,我们可以快速修正spfile中的错误参数定义。
在spfile引入之初,很多人因为其使用和修改复杂而拒绝使用spfile,仍然沿用pfile文件,其实不要小看spfile文件,spfile可以在数据库中通过命令动态修改的特性,是Oracle 10g中很多自动化特性的实现基础。
应当熟悉这样一个事实,Oracle经常在现行版本中为下一个版本做准备,并优先推出部分功能,这些功能因为其超前可能显得不够实用,而当这些特性在新版本中再次出现时,我们才忽然知道,这些特性原来是如此的不可缺少。
下面以Oracle 10g的自动共享内存调整特性(具体内容将在后续文章中介绍)来做一个简单说明。当再Oracle 10g中设置了SGA_TARGET参数启用了自动SGA调整之后,Oracle会同时启用一系列的新的隐含参数来控制SGA各组件的大小。如果足够细心,大家可能从alert_<SID>.log文件中注意到,每次启动这些参数的设置通常都是不同的,下面从生产环境总摘录两个片段给大家参考。
第一个启动信息:
Thu Jan 19 14:38:43 2006
Starting ORACLE instance (normal)
••
LICENSE_MAX_USERS = 0
SYS auditing is disabled
Starting up ORACLE RDBMS Version: 10.2.0.1.0.
System parameters with non-default values:
processes = 150
__shared_pool_size = 75497472
__large_pool_size = 4194304
__java_pool_size = 4194304
__streams_pool_size = 0
spfile = +ORADG/danaly/spfiledanaly.ora
sga_target = 943718400
••
db_block_checksum = FULL
db_block_size = 8192
__db_cache_size = 851443712
第二个启动信息:
Wed Apr 5 12:01:02 2006
Starting ORACLE instance (normal)
……
LICENSE_MAX_USERS = 0
SYS auditing is disabled
ksdpec: called for event 13740 prior to event group initialization
Starting up ORACLE RDBMS Version: 10.2.0.1.0.
System parameters with non-default values:
processes = 150
__shared_pool_size = 113246208
__large_pool_size = 4194304
__java_pool_size = 12582912
__streams_pool_size = 0
spfile = +ORADG/danaly/spfiledanaly.ora
sga_target = 943718400
……••
db_block_checksum = FULL
db_block_size = 8192
__db_cache_size = 805306368
这些参数的不同就是Oracle自动调整的结果,通过spfile的的动态修改,这些参数值可以跨越数据库重启动而继续生效。
提示:由于spfile是一个二进制文件,所以不能通过手工方式去修改,很多朋友通过手工修改而导致spfile损坏,是的spfile不能用来启动数据库,我们要引以为戒。
6.重置spfile中设置的参数
虽然并不常用,但是Oracle仍然提供了重置参数的方法。当想恢复某个参数为缺省值时,可以使用如下命令:
alter system reset parameter <scope=memory|spfile|both> sid=’sid|*’
该命令通常用于RAC环境中,在单实例环境中,需要指定sid=’*’;,reset一个参数,Oracle将从spfile文件中去除该参数:
[oracle@czjie dbs]$ strings spfileORCL.ora |grep open
*.open_cursors=300
SQL> alter system reset open_cursors scope=spfile sid='*';
System altered.
[oracle@czjie dbs]$ strings spfileORCL.ora |grep open
[oracle@czjie dbs]$
可以看到,reset之后open_cusors参数在spfile文件中不再存在。
6. 是否使用了spfile
判断是否使用了spfile,可以使用一下集中方法。
(1) 查询v$parameter动态视图,如果一下查询返回空值,那么你在使用pfile:
SQL> select name,value from v$parameter where name='spfile';
NAME
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
Spfile
/opt/ora10g/product/10.2.0/db_1/dbs/spfileORCL.ora
(2) 或者可以使用show命令(实际上,show命令的结果同样来自v$parameter视图)来显示参数设置,如果以下结果value列返回空值,那么说明你在使用pfile:
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /opt/ora10g/product/10.2.0/db_
1/dbs/spfileORCL.ora
(3) 查询v$spparameter视图,如果以下查询返回0值,标示你在使用pfile,否则表明你使用的是spfile:
SQL> select count(*) from v$spparameter where value is not null;
COUNT(*)
----------
28
或者使用一下查询,如果true值返回非0值,那么说明使用的是spfile:
SQL> select isspecified,count(*) from v$spparameter group by isspecified;
ISSPEC COUNT(*)
------ ----------
TRUE 29
FALSE 232
更为直接的:
SQL> select decode(count(*),1,'spfile','pfile') used from v$spparameter where rownum=1 and isspecified='TRUE';
USED
------
Spfile
7. spfile的备份和恢复
在本章开头提到,Oracle把spfile也纳入了RMAN的备份恢复策略当中,如果配置了控制文件自动备份(autoback),那么Oracle会在数据库发生重大变化(如增减表空间)时自动进行控制文件及spfile文件的备份。
下面来看一下这个过程。
(1) 设置控制文件自动备份:
[oracle@czjie ~]$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Wed Nov 23 17:31:45 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1294662348)
RMAN> configure controlfile autobackup on;
using target database control file instead of recovery catalog
new RMAN configuration parameters:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
new RMAN configuration parameters are successfully stored
RMAN> exit
Recovery Manager complete.
这个设置可以在数据库中通过如下方式查询得到:
SQL> select * from v$rman_configuration;
CONF# NAME
---------- -----------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
1 CONTROLFILE AUTOBACKUP
ON
(2) 记录数据库变化:
SQL> create tablespace czjie datafile '/opt/ora10g/oradata/czjie01.dbf' size 5M;
Tablespace created.
如果新创建一个表空间,这个时候检查alert_<sid>.log文件,可以在其中发现这样的备份信息:
Wed Nov 23 17:35:45 2011
create tablespace czjie datafile '/opt/ora10g/oradata/czjie01.dbf' size 5M
Wed Nov 23 17:35:46 2011
Starting control autobackup
Control autobackup written to DISK device
handle '/opt/ora10g/flash_recovery_area/ORCL/autobackup/2011_11_23/o1_mf_s_767986546_7dshmms2_.bkp'
Completed: create tablespace czjie datafile '/opt/ora10g/oradata/czjie01.dbf' size 5M
(3) 使用自动备份恢复spfile文件:
[oracle@czjie ~]$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Wed Nov 23 17:40:54 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1294662348)
RMAN>restore spfile to '/tmp/spfileORCL.ora' from autobackup;
Starting restore at 23-NOV-11
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=149 devtype=DISK
recovery area destination: /opt/ora10g/flash_recovery_area
database name (or database unique name) used for search: ORCL
channel ORA_DISK_1: autobackup found in the recovery area
channel ORA_DISK_1: autobackup found: /opt/ora10g/flash_recovery_area/ORCL/autobackup/2011_11_23/o1_mf_s_767986546_7dshmms2_.bkp
channel ORA_DISK_1: SPFILE restore from autobackup complete
Finished restore at 23-NOV-11
RMAN> exit
Recovery Manager complete.
[oracle@czjie dbs]$ ls -l /tmp/spfileORCL.ora
-rw-r----- 1 oracle oinstall 3584 11-23 17:41 /tmp/spfileORCL.ora
同样可以通过这种方法恢复自动备份的控制文件,示例如下:
[oracle@czjie ~]$ rman target /
Recovery Manager: Release 10.2.0.4.0 - Production on Wed Nov 23 17:44:12 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ORCL (DBID=1294662348)
RMAN> restore controlfile to '/tmp/conrtol01.ctl' from autobackup;
Starting restore at 23-NOV-11
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=148 devtype=DISK
recovery area destination: /opt/ora10g/flash_recovery_area
database name (or database unique name) used for search: ORCL
channel ORA_DISK_1: autobackup found in the recovery area
channel ORA_DISK_1: autobackup found: /opt/ora10g/flash_recovery_area/ORCL/autobackup/2011_11_23/o1_mf_s_767986546_7dshmms2_.bkp
channel ORA_DISK_1: control file restore from autobackup complete
Finished restore at 23-NOV-11
RMAN> exit
Recovery Manager complete.
[oracle@czjie ~]$ ls -l /tmp/conrt*
-rw-r----- 1 oracle oinstall 7061504 11-23 17:45 /tmp/conrtol01.ctl
Oracle 9i自动备份控制文件的功能给我们带来了极大的收益,通过自动备份,在数据库出现紧急状况的时候,用户可能可以从这个自动备份中获得更为有效及时的控制文件。
有一点还要说明的是,如果数据库无法mount,就不能使用如上方式恢复自动备份的控制文件或者参数文件。
8. 导出spfile文件
Spfile文件可以导出为文本文件,使用导出、创建过程可以向spfile中添加参数。
SQL> create pfile='/opt/ora10g/initORCL.ora' from spfile;
File created.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
initORCL.ora文件的具体内容如下:
ORCL.__db_cache_size=100663296
ORCL.__java_pool_size=8388608
ORCL.__large_pool_size=4194304
ORCL.__shared_pool_size=100663296
ORCL.__streams_pool_size=0
*.aq_tm_processes=0
*.audit_file_dest='/opt/ora10g/admin/ORCL/adump'
*.background_dump_dest='/opt/ora10g/admin/ORCL/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/opt/ora10g/oradata/ORCL/control01.ctl','/opt/ora10g/oradata/ORCL/control02.ctl','/opt/ora10g/oradata/ORCL/control03.ctl'
*.core_dump_dest='/opt/ora10g/admin/ORCL/cdump'
*.db_block_size=8192
*.db_cache_advice='OFF'
*.db_cache_size=25165824
*.db_domain='192.168.1.106'
*.db_file_multiblock_read_count=16
*.db_name='ORCL'
*.db_recovery_file_dest_size=2147483648
*.db_recovery_file_dest='/opt/ora10g/flash_recovery_area'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ORCLXDB)'
*.job_queue_processes=10
*.nls_length_semantics='BYTE'
*.pga_aggregate_target=71303168
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.resource_manager_plan=''
*.sga_target=218103808
*.sql_trace=FALSE
*.undo_management='AUTO'
*.undo_retention=900
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/opt/ora10g/admin/ORCL/udump'
对于单机Oracle数据库,每个参数以一个“*”开头,这意味着该参数可以影响所有的实例;而对于并行环境(RAC),可以看到,不同实例的参数设置可以不同,这时候可以用实例名称来代替“*”,例如:
ORCL.__db_cache_size=100663296
ORCL.__java_pool_size=8388608
ORCL.__large_pool_size=4194304
ORCL.__shared_pool_size=100663296
ORCL.__streams_pool_size=0
生成pfile之后,可以使用这个pfile,或者手动修改其中的参数以启动数据库。
比如在更改数据库的归档模式,修改这个pfile,增加一行:
*.log_archive_start=true
然后再使用这个pfile启动数据库。
作者:czjie
出处:http://www.cnblogs.com/czjie/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。