oracle回滚表分区及pfile

 感谢两篇文章给我很大帮助。它们的网址和内容是:

http://lovexueer.itpub.net/post/5072/49241
http://epub.itpub.net/4/2.htm


回滚段表空间损坏处理 12月26日(星期一)

测试环境:

OS :XP

DB:9201

本测试测试了如下情况:

a.正常关闭数据库,数据库(未)归档,回滚段表空间丢失,成功恢复

b.非正常关闭数据库,数据库非归档,有活动事务,回滚段表空间丢失,成功恢复

c.非正常关闭数据库,数据库归档,有活动事务,回滚段表空间丢失,恢复失败,目前不知原因

a.正常关闭数据库, 数据库(未)归档

如shutdown normal,shutdown immediate

1.正常关闭数据库,模拟回滚段表空间丢失

SQL> conn sys/test@jumper as sysdba

已连接。

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> host del D:oracleoradatajumperUNDOTBS01.DBF

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 126950220 bytes

Fixed Size 453452 bytes

Variable Size 109051904 bytes

Database Buffers 16777216 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件

ORA-01110: 数据文件 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'

2.确认回滚段表空间丢失

SQL> select file#,online_status,error from v$recover_file;

FILE# ONLINE_ status error

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

2 ONLINE FILE NOT FOUND

SQL> select name from v$datafile where file#=2;

NAME

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

D:ORACLEORADATAJUMPERUNDOTBS01.DBF

3.打开数据库

SQL> alter database datafile 'D:ORACLEORADATAJUMPERUNDOTBS01.dbf' offline drop;

数据库已更改。

SQL> alter database open;

数据库已更改。

4.创建新的回滚段表空间

SQL> select segment_name ,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

_SYSSMU1$ UNDOTBS1 OFFLINE

_SYSSMU2$ UNDOTBS1 OFFLINE

_SYSSMU3$ UNDOTBS1 OFFLINE

_SYSSMU4$ UNDOTBS1 OFFLINE

_SYSSMU5$ UNDOTBS1 OFFLINE

_SYSSMU6$ UNDOTBS1 OFFLINE

_SYSSMU7$ UNDOTBS1 OFFLINE

_SYSSMU8$ UNDOTBS1 OFFLINE

_SYSSMU9$ UNDOTBS1 OFFLINE

_SYSSMU10$ UNDOTBS1 OFFLINE

已选择11行。

SQL> create undo tablespace undots datafile 'undotbs02.dbf' size 100m autoextend on next 10m maxsize 200m

2 ;

表空间已创建。

SQL> alter system set undo_tablespace=undots;

系统已更改。

SQL> drop tablespace UNDOTBS1 including contents and datafiles;

表空间已丢弃。

SQL> select segment_name ,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

_SYSSMU11$ UNDOTS ONLINE

_SYSSMU12$ UNDOTS ONLINE

_SYSSMU13$ UNDOTS ONLINE

_SYSSMU14$ UNDOTS ONLINE

_SYSSMU15$ UNDOTS ONLINE

_SYSSMU16$ UNDOTS ONLINE

_SYSSMU17$ UNDOTS ONLINE

_SYSSMU18$ UNDOTS ONLINE

_SYSSMU19$ UNDOTS ONLINE

_SYSSMU20$ UNDOTS ONLINE

已选择11行。

5.重新启动

SQL> startup force;

ORACLE 例程已经启动。

Total System Global Area 126950220 bytes

Fixed Size 453452 bytes

Variable Size 109051904 bytes

Database Buffers 16777216 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL> select segment_name ,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

_SYSSMU11$ UNDOTS ONLINE

_SYSSMU12$ UNDOTS ONLINE

_SYSSMU13$ UNDOTS ONLINE

_SYSSMU14$ UNDOTS ONLINE

_SYSSMU15$ UNDOTS ONLINE

_SYSSMU16$ UNDOTS ONLINE

_SYSSMU17$ UNDOTS ONLINE

_SYSSMU18$ UNDOTS ONLINE

_SYSSMU19$ UNDOTS ONLINE

_SYSSMU20$ UNDOTS ONLINE

已选择11行。

SQL> show parameter undo

NAME TYPE VALUE

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

undo_management string AUTO

undo_retention integer 10800

undo_suppress_errors boolean FALSE

undo_tablespace string UNDOTS

通过上述方法,(未)归档都可以正常打开数据库

b.非正常关闭数据库(数据库未归档)

如shutdown abort或crash

1.生成测试数据

SQL> conn test/test@jumper

已连接。

SQL> truncate table test;

表已截掉。

SQL> insert into test values(1);

已创建 1 行。

2.非正常关闭数据库,删除回滚段表空间

再打开一窗口

SQL> shutdown abort

ORACLE 例程已经关闭。

SQL> host del D:oracleoradatajumperUNDOTBS01.DBF

3.创建启动参数文件

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件

ORA-01110: 数据文件 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'

SQL> create pfile from spfile;

文件已创建。

SQL> shutdown immediate

ORA-01109: 数据库未打开

已经卸载数据库。

ORACLE 例程已经关闭。

4.修改启动参数文件D:oracleora92databaseinitjumper.ora,moun数据库

原来参数:

undo_management='AUTO'

undo_tablespace='UNDOTBS1'

修改为:

undo_management='manual'

undo_tablespace='system'

_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

5.SQL> startup mount pfile=D:oracleora92databaseinitjumper.ora

ORACLE 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

5.确认undo表空间丢失

SQL> select file#,error from v$recover_file;

FILE# ERROR

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

2 FILE NOT FOUND

SQL> select name from v$datafile where file#=2;

NAME

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

D:ORACLEORADATAJUMPERUNDOTBS01.DBF

6.打开数据库

SQL> alter database datafile 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF' offline drop;

数据库已更改。

SQL> recover database;

完成介质恢复。

SQL> alter database open;

数据库已更改。

SQL> conn test/test@jumper;

已连接。

SQL> select *from test;

ID

----------

1

7.创建新的ROLLBACK 表空间

SQL> select * from v$rollname;

USN NAME

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

0 SYSTEM

SQL> select segment_name,tablespace_name,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

_SYSSMU1$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU2$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU3$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU4$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU5$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU6$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU7$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU8$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU9$ UNDOTBS1 NEEDS RECOVERY

_SYSSMU10$ UNDOTBS1 NEEDS RECOVERY

已选择11行。

SQL> drop rollback segment "_SYSSMU1$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU2$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU3$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU4$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU5$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU6$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU7$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU8$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU9$";

回退段已删除。

SQL> drop rollback segment "_SYSSMU10$";

回退段已删除。

SQL> drop tablespace UNDOTBS1 including contents and datafiles;

表空间已丢弃。

SQL> select segment_name,tablespace_name ,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

SQL> create undo tablespace undots datafile 'D:oracleoradatajumperundotbs02.dbf' size 10m ;

表空间已创建。

SQL> select segment_name,tablespace_name ,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

_SYSSMU11$ UNDOTS OFFLINE

_SYSSMU12$ UNDOTS OFFLINE

_SYSSMU13$ UNDOTS OFFLINE

_SYSSMU14$ UNDOTS OFFLINE

_SYSSMU15$ UNDOTS OFFLINE

_SYSSMU16$ UNDOTS OFFLINE

_SYSSMU17$ UNDOTS OFFLINE

_SYSSMU18$ UNDOTS OFFLINE

_SYSSMU19$ UNDOTS OFFLINE

_SYSSMU20$ UNDOTS OFFLINE

已选择11行。

8.打开数据库

修改参数如下:

undo_management='AUTO'

undo_tablespace='UNDOTS'

去掉如下参数

._CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

SQL> startup mount pfile=D:oracleora92databaseinitjumper.ora

ORACLE 例程已经启动。

Total System Global Area 126950220 bytes

Fixed Size 453452 bytes

Variable Size 109051904 bytes

Database Buffers 16777216 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

SQL> alter database open;

数据库已更改。

SQL> select segment_name,tablespace_name ,status from dba_rollback_segs;

SEGMENT_NAME TABLESPACE_NAME STATUS

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

SYSTEM SYSTEM ONLINE

_SYSSMU11$ UNDOTS ONLINE

_SYSSMU12$ UNDOTS ONLINE

_SYSSMU13$ UNDOTS ONLINE

_SYSSMU14$ UNDOTS ONLINE

_SYSSMU15$ UNDOTS ONLINE

_SYSSMU16$ UNDOTS ONLINE

_SYSSMU17$ UNDOTS ONLINE

_SYSSMU18$ UNDOTS ONLINE

_SYSSMU19$ UNDOTS ONLINE

_SYSSMU20$ UNDOTS ONLINE

已选择11行。

SQL> conn test/test@jumper ;

已连接。

SQL> select * from test;

ID

----------

1

SQL>create spfile from pfile

文件已创建

9.重新exp /imp,分析所有对像,防止有坏的数据块

select 'analyze table '||table_name ||' validate structure cascade ' from dba_tables

c.非正常关闭数据库(数据库归档)

如shutdown abort或crash

1.生成测试数据

SQL> conn test/test@jumper

已连接。

SQL> truncate table test;

表已截掉。

SQL> insert into test values(1);

已创建 1 行。

2.非正常关闭数据库,删除回滚段表空间

再打开一窗口

SQL> shutdown abort

ORACLE 例程已经关闭。

SQL> host del D:oracleoradatajumperUNDOTBS01.DBF

3.创建启动参数文件

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件

ORA-01110: 数据文件 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'

SQL> create pfile from spfile;

文件已创建。

SQL> shutdown immediate

ORA-01109: 数据库未打开

已经卸载数据库。

ORACLE 例程已经关闭。

4.修改启动参数文件D:oracleora92databaseinitjumper.ora,moun数据库

原来参数:

undo_management='AUTO'

undo_tablespace='UNDOTBS1'

修改为:

undo_management='manual'

undo_tablespace='system'

_CORRUPTED_ROLLBACK_SEGMENTS=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

SQL> startup mount pfile=D:oracleora92databaseinitjumper.ora

ORACLE 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

数据库装载完毕。

5.确认undo表空间丢失

SQL> select file# from v$recover_file;

FILE#

----------

2

SQL> select name from v$datafile where file#=2;

NAME

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

D:ORACLEORADATAJUMPERUNDOTBS01.DBF

6.打开数据库

SQL> alter database datafile 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF' offline drop;

数据库已更改。

SQL> recover database;

完成介质恢复。

SQL> alter database open;

alter database open

*

ERROR 位于第 1 行:

ORA-01092: ORACLE 例程终止。强行断开连接

查看alter.log文件报以下错误

ALTER DATABASE RECOVER database

Sun Dec 25 14:12:17 2005

Media Recovery Start

Starting datafile 1 recovery in thread 1 sequence 28

Datafile 1: 'D:ORACLEORADATAJUMPERSYSTEM01.DBF'

Starting datafile 3 recovery in thread 1 sequence 28

Datafile 3: 'D:ORACLEORADATAJUMPERINDX01.DBF'

Starting datafile 4 recovery in thread 1 sequence 28

Datafile 4: 'D:ORACLEORADATAJUMPERTOOLS01.DBF'

Starting datafile 5 recovery in thread 1 sequence 28

Datafile 5: 'D:ORACLEORADATAJUMPERUSERS01.DBF'

Media Recovery Log

Recovery of Online Redo Log: Thread 1 Group 1 Seq 28 Reading mem 0

Mem# 0 errs 0: D:ORACLEORADATAJUMPERREDO01.LOG

Media Recovery Complete

Completed: ALTER DATABASE RECOVER database

Sun Dec 25 14:12:27 2005

alter database open

Sun Dec 25 14:12:28 2005

Beginning crash recovery of 1 threads

Sun Dec 25 14:12:28 2005

Started first pass scan

Sun Dec 25 14:12:28 2005

Completed first pass scan

138 redo blocks read, 0 data blocks need recovery

Sun Dec 25 14:12:29 2005

Started recovery at

Thread 1: logseq 28, block 2, scn 0.139909

Recovery of Online Redo Log: Thread 1 Group 1 Seq 28 Reading mem 0

Mem# 0 errs 0: D:ORACLEORADATAJUMPERREDO01.LOG

Sun Dec 25 14:12:29 2005

Ended recovery at

Thread 1: logseq 28, block 140, scn 0.160187

0 data blocks read, 0 data blocks written, 138 redo blocks read

Crash recovery completed successfully

Sun Dec 25 14:12:29 2005

LGWR: Primary database is in CLUSTER CONSISTENT mode

Thread 1 advanced to log sequence 29

Thread 1 opened at log sequence 29

Current log# 2 seq# 29 mem# 0: D:ORACLEORADATAJUMPERREDO02.LOG

Successful open of redo thread 1.

Sun Dec 25 14:12:29 2005

SMON: enabling cache recovery

Sun Dec 25 14:12:30 2005

ARC0: Evaluating archive log 1 thread 1 sequence 28

ARC0: Beginning to archive log 1 thread 1 sequence 28

Creating archive destination LOG_ARCHIVE_DEST_1: 'D:ORACLEORADATAJUMPERARCHIVE1_28.DBF'

ARC0: Completed archiving log 1 thread 1 sequence 28

Sun Dec 25 14:12:30 2005

Errors in file d:oracleadminjumperudumpjumper_ora_3360.trc:

ORA-00704: 引导程序进程失败

ORA-00604: 递归 SQL 层 2 出现错误

ORA-00376: 此时无法读取文件 2

ORA-01110: 数据文件 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'

Sun Dec 25 14:24:06 2005

Error 704 happened during db open, shutting down database

USER: terminating instance due to error 704

Instance terminated by USER, pid = 3796

ORA-1092 signalled during: alter database open...

对应的jumper_ora_3360.trc错误如下:

Dump file d:oracleadminjumperudumpjumper_ora_3360.trc

Sun Dec 25 14:12:19 2005

ORACLE V9.2.0.1.0 - Production vsnsta=0

vsnsql=12 vsnxtr=3

Windows 2000 Version 5.1 Service Pack 2, CPU type 586

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.1.0 - Production

Windows 2000 Version 5.1 Service Pack 2, CPU type 586

Instance name: jumper

Redo thread mounted by this instance: 1

Oracle process number: 10

Windows thread id: 3360, image: ORACLE.EXE

*** SESSION ID:(9.3) 2005-12-25 14:12:19.000

----- Redo read statistics for thread 1 -----

Read rate (ASYNC) = 69Kb/sec => 138 blocks in 1s

Read buffer = 8192Kb (16384 blocks)

Longest record = 0Kb

Record moves = 0/223 (0%)

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

----- Redo read statistics for thread 1 -----

Read rate (ASYNC) = 69Kb/sec => 138 blocks in 1s

Read buffer = 8192Kb (16384 blocks)

Longest record = 0Kb

Record moves = 0/223 (0%)

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

*** 2005-12-25 14:12:29.000

KCRA: start recovery claims for 0 data blocks

*** 2005-12-25 14:12:29.000

KCRA: buffers claimed = 0/0, eliminated = 0

ORA-00704: 引导程序进程失败

ORA-00604: 递归 SQL 层 2 出现错误

ORA-00376: 此时无法读取文件 2

ORA-01110: 数据文件 2: 'D:ORACLEORADATAJUMPERUNDOTBS01.DBF'

怪了,归档模式恢复不成功,而非归档模式恢复成功?

从后台日志来看,归档模式下用序列为28的日志作了介质恢复,然后将此日志归档后,报了启动错误

是不是归档进程后,数据库仍然去读老的回滚表空间,造成打开数据库不成功?而非归档就成功启动了。

原因在那里?


=============================


9i新特点:SPFILE的使用
作者:盖国强 (ITPUB:Eygle)

 

在Oracle9i中,一个新的文件被引入-spfile,spfile用于服务器端,管理初始化参数。

 

在9i以前,Oracle使用pfile存储初始化参数设置,这些参数在实例启动时被读取,任何修改需要重起实例才能生效;使用spfile你可以使用ALTER SYSTEM或者ALTER SESSION来动态修改那些可动态修改的参数,所有更改可以立即生效,你可以选择使更改只应用于当前实例还是同时应用到spfile。这就使得所有对spfile的修改都可以在命令行完成,我们可以彻底告别手工修改初始化参数文件,这就大大减少了人为错误的发生。

 

SPFILE是一个二进制文件,可以使用RMAN进行备份,这样实际上Oracle把参数文件也纳入了备份恢复管理。

 

除了第一次启动数据库需要PFILE(然后可以根据PFILE创建SPFILE),我们可以不再需要PFILE,ORACLE强烈推荐使用spfile,应用其新特性来存储和维护初始化参数设置。

              创建SPFILE

缺省的,ORACLE使用PFILE启动数据库,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 位于第 1 行:

ORA-32002: 无法创建已由例程使用的 SPFILE


这也可以用来判断当前是否使用了SPFILE文件。

然而意外的时,Oracle并没有向其他文件一样,在运行期间保持锁定,让我们作以下试验:

SQL> host rename SPFILEEYGLEN.ORA SPFILEEYGLEN.ORA.BAK

SQL> alter system set db_cache_size=24M scope=both;

系统已更改。

SQL> host dir *.ora

 驱动器 E 中的卷是 Doc

 卷的序列号是 980C-8EFF

 

 E:/Oracle/Ora9iR2/database 的目录

 

2003-02-10  14:35                2,048 PWDeyglen.ORA

               1 个文件          2,048 字节

               0 个目录    150,347,776 可用字节

 

SQL> alter system set db_cache_size=24M scope=spfile;

alter system set db_cache_size=24M scope=spfile

*

ERROR 位于第 1 行:

ORA-27041: 无法打开文件

OSD-04002: 无法打开文件

O/S-Error: (OS 2) 系统找不到指定的文件。

 

SQL> host rename SPFILEEYGLEN.ORA.BAK SPFILEEYGLEN.ORA

 

SQL> alter system set db_cache_size=24M scope=spfile;

系统已更改。

SQL>

估计Oracle以后会想办法来锁定这个文件。

              使用SPFILE

重新启动数据库,使用startup命令,Oralce将会按照以下顺序在缺省目录中搜索参数文件:

a.        spfile${ORACLE_SID}.ora  

缺省目录 UNIX: ${ORACLE_HOME}/dbs/                            NT:   ${ORACLE_HOME}/database

b.       spfile.ora             

缺省目录 UNIX: ${ORACLE_HOME}/dbs/                            NT:   ${ORACLE_HOME}/database

c.      init${ORACLESID}.ora      

缺省目录 UNIX: ${ORACLE_HOME}/dbs/                            NT:   ${ORACLE_HOME}/database or     ${ORACLE_HOME}/admin/db_name/pfile/

创建了spfile,重新启动数据库,Oracle会按顺序搜索以上目录,spfile就会自动生效。

 

              使用pfile/spfile启动数据库

如果你想使用pfile启动数据库,你可以在启动时指定pfile或者删除spfile.

SQL> startup pfile='E:/Oracle/admin/eyglen/pfile/init.ora';

你不能以同样的方式指定spfile,但是可以创建一个包含spfile参数的pfile文件,指向spfile.

SPFILE是一个自Oracle9i引入的初始化参数,类似于IFILE参数。 SPFILE参数用于定义非缺省路径的spfile文件。

你可以在PFILE链接到SPFILE文件,同时在PFILE中定义其他参数,如果参数重复设置,后读取的参数将取代先前的设置。

PFILE参数的使用,例如:

这是我们使用SPFILE启动的情况,

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。


SQL> SHOW parameter log_archive_start

 

NAME                                 TYPE           VALUE

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

log_archive_start                    boolean        TRUE

SQL> SHOW parameter spfile

 

NAME                 TYPE       VALUE

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

spfile               string     %ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA

SQL>

我们修改PFILE文件内容如下:

#Pfile link to SPFILE

SPFILE= 'E:/Oracle/Ora9iR2/database/SPFILEEYGLEN.ORA'

log_archive_start = false


可以预见这个log_archive_start参数设置将会代替SPFILE中的设置:

SQL> startup  pfile='e:/initeyglen.ora'

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。


SQL> show parameter spfile

 

NAME               TYPE    VALUE

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

spfile             string  E:/Oracle/Ora9iR2/database/SPFLEEYGLEN.ORA


SQL> SHOW parameter log_archive_start


NAME                                 TYPE       VALUE

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

log_archive_start                    boolean    FALSE


然后我们可以使用ALTER SYSTEM方式将修改固定到SPFILE.

SQL> ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;

 

系统已更改。

 

所以你也可以通过如上方式在启动时修改初始化参数。比我们在本文最后介绍的导入导出方法要简便的多。

 

              修改参数

可以通过ALTER SYSTEM或者导入导出来更改SPFILE的内容。

ALTER SYSTEM增加了一个新选项:SCOPE。SCOPE参数有三个可选值:MEMORY 、SPFILE 、BOTH。

MEMORY:只改变当前实例运行

SPFILE:只改变SPFILE的设置

BOTH:改变实例及SPFILE

1. SCOPE=MEMORY

SQL> SHOW parameter timed_statistics

NAME                                 TYPE     VALUE

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

timed_statistics                     boolean  TRUE

SQL> ALTER SYSTEM SET timed_statistics=FALSE SCOPE=MEMORY;

 

系统已更改。

 

SQL> SHOW parameter timed_statistics

 

NAME                                 TYPE     VALUE

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

timed_statistics                     boolean  FALSE

 

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL> show parameter timed_statistics

 

NAME                                 TYPE       VALUE

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

timed_statistics                     boolean    TRUE

 

2. SCOPE=SPFILE

SQL> show parameter timed_statistics

 

NAME                                 TYPE       VALUE

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

timed_statistics                     boolean    TRUE

 

SQL> ALTER SYSTEM SET timed_statistics=FALSE SCOPE=SPFILE;

 

系统已更改。

 

SQL> show parameter timed_statistics

 

NAME                                 TYPE       VALUE

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

timed_statistics                     boolean    TRUE

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> STARTUP

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。


SQL> SHOW parameter timed_statistics

 

NAME                                 TYPE       VALUE

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

timed_statistics                     boolean    FALSE

SQL>

 

3. SCOPE = BOTH

使用BOTH选项实际上等同于不带参数的ALTER SYSTEM语句。

注意:如果修改静态参数,那么需要指定SPFILE参数,否则将会报错。

SQL> SHOW parameter timed_statistics

NAME                                TYPE      VALUE

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

timed_statistics                    boolean   FALSE

SQL> ALTER SYSTEM SET timed_statistics=TRUE SCOPE=BOTH;

系统已更改。

SQL> SHOW parameter timed_statistics

NAME                                 TYPE       VALUE

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

timed_statistics                     boolean    TRUE

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL>STARTUP

ORACLE 例程已经启动。

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL> SHOW parameter timed_statistics

NAME                                 TYPE        ALUE

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

timed_statistics                     boolean     TRUE

SQL> ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH;

ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH

                 *

ERROR 位于第 1 行:

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

SQL> ALTER SYSTEM SET sql_trace=FALSE SCOPE=SPFILE;

系统已更改。

 

4.你也可以在数据库shutdown时创建和修改spfile,例如:

SQL> show sga

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

 

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

 

SQL> create pfile from spfile;

文件已创建。

SQL> create spfile from pfile;

文件已创建。

SQL>

 

 

              是否使用了spfile

判断是否使用了SPFILE,可以使用以下方法:

1.查询v$parameter动态视图,如果以下查询返回空值,那么你在使用pfile.

 SQL> SELECT name,value FROM v$parameter WHERE name='spfile';

 

NAME                   VALUE

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

spfile                 %ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA

 

2.或者你可以使用SHOW命令来显示参数设置,如果以下结果value列返回空值,那么说明你在使用pfile:

 

SQL> SHOW PARAMETER spfile

 

NAME                      TYPE    VALUE

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

spfile                    string  %ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA

 

 3.查询v$spparameter视图

如果以下查询返回0值,表示你在使用pfile,否则表明你使用的是spfile:

SQL> SELECT COUNT(*) FROM v$spparameter WHERE value IS NOT NULL;

  COUNT(*)

----------

        32

 

或者使用以下查询,如果true值返回非0值,那么说明我们使用的是spfile.

SQL> SELECT   isspecified, COUNT (*) FROM v$spparameter

2 GROUP BY isspecified;

ISSPECIFIED    COUNT(*)

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

FALSE               226

TRUE                 33


更为直接的:

SQL> select decode(count(*), 1, 'spfile', 'pfile' ) USED

  2  from v$spparameter

  3  where rownum=1 and isspecified='TRUE'

  4  /


USED

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

spfile

 

 

              导出SPFILE文件

SPFILE文件可以导出为文本文件,使用导出、创建过程你可以向SPFILE中添加参数。

SQL> create pfile='e:/initeyglen.ora' from spfile;

文件已创建。

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

 

Initeyglen.ora文件的内容:

*.aq_tm_processes=1

*.background_dump_dest='e:/Oracle/admin/eyglen/bdump'

*.compatible='9.2.0.0.0'

*.control_files='e:/Oracle/oradata/eyglen/control01.ctl',

'e:/Oracle/oradata/eyglen/control02.ctl',

'e:/Oracle/oradata/eyglen/control03.ctl'

*.core_dump_dest='e:/Oracle/admin/eyglen/cdump'

*.db_block_size=8192

*.db_cache_size=25165824

*.db_domain=''

*.db_file_multiblock_read_count=16

*.db_name='eyglen'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=eyglenXDB)'

*.fast_start_mttr_target=300

*.hash_join_enabled=TRUE

*.instance_name='eyglen'

*.java_pool_size=33554432

*.job_queue_processes=10

*.large_pool_size=8388608

*.open_cursors=300

*.pga_aggregate_target=25165824

*.processes=150

*.query_rewrite_enabled='FALSE'

*.remote_login_passwordfile='EXCLUSIVE'

*.shared_pool_size=50331648

*.sort_area_size=524288

*.sql_trace=FALSE

*.star_transformation_enabled='FALSE'

*.timed_statistics=TRUE

*.undo_management='AUTO'

*.undo_retention=10800

*.undo_tablespace='UNDOTBS1'

*.user_dump_dest='e:/Oracle/admin/eyglen/udump'

 

然后我们可以使用这个pfile,或者手动修改其中的参数以启动数据库。

 

我们修改这个pfile,增加一行:

 

*.log_archive_start=true

 

使用这个PFILE启动数据库:

 


SQL>STARTUP pfile='e:/initeyglen.ora'

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL> SHOW parameter log_archive_start

NAME                                 TYPE      VALUE ------------------------------------ --------  ------------

log_archive_start                    boolean   TRUE

SQL>

 

然后我们可以使用新的PFILE创建SPFILE

SQL> CREATE spfile FROM pfile='e:/initeyglen.ora';

文件已创建。

 

重新启动数据库,新的SPFILE生效。

 

SQL> STARTUP

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL> SHOW parameter spfile

 

NAME                    TYPE    VALUE

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

spfile                  string  %ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA

SQL> show parameter log_archive_start

 

NAME                    TYPE    VALUE

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

log_archive_start       boolean TRUE

SQL>

              关于920的PFILE

在$ORACLE_BASE/admin/db_name/spfile下,你很可能可以看到一个类似这样
[init.ora.192003215317]名字的文件,这就是初始化参数文件,只是跟上了时间戳。

 

对于Oracle920,缺省的就使用spfile启动,但是这个spfile 不是凭空而来,而是根据这个文件创建而来,你可以去掉这个长后缀,就是标准的pfile文件了。

 

如果你想要使用pfile启动数据库,那么你可以把spfile改名,NT缺省位于$ORACLE_HOME/database下,这样Oracle就不会使用这个spfile了 。

 

你使用create pfile from spfile命令创建的pfile,也应该在这个目录下

 

以下是一个完整的例子:

 

E:/Oracle/Ora9ir2/database>dir *.ora

 驱动器 E 中的卷是 Doc

 卷的序列号是 980C-8EFF

 

 E:/Oracle/Ora9iR2/database 的目录

 

2003-02-26  10:49                1,028 INITeyglen.ORA

2003-02-10  14:35                2,048 PWDeyglen.ORA

2003-02-26  11:05                3,584 SPFILEEYGLEN.ORA

               3 个文件          6,660 字节

               0 个目录    937,455,616 可用字节

 

E:/Oracle/Ora9iR2/database> SQLPLUS /nolog

 

SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 2月 26 11:16:29 2003

 

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

 

SQL> CONNECT / as sysdba

已连接到空闲例程。

 

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。

SQL> SHOW parameter spfile

 

NAME                 TYPE     VALUE

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

spfile               string   %ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> host rename SPFILEEYGLEN.ORA SPFILEEYGLEN.ORA.bak

 

SQL> host dir *.ora

 驱动器 E 中的卷是 Doc

 卷的序列号是 980C-8EFF

 

 E:/Oracle/Ora9iR2/database 的目录

 

2003-02-26  10:49                1,028 INITeyglen.ORA

2003-02-10  14:35                2,048 PWDeyglen.ORA

               2 个文件          3,076 字节

               0 个目录    937,435,136 可用字节

 

SQL> STARTUP

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。


SQL> SHOW parameter spfile

NAME                                 TYPE        VALUE

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

spfile                               string

SQL>

SQL> host rename SPFILEEYGLEN.ORA.bak SPFILEEYGLEN.ORA

 

SQL> SHUTDOWN immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  135338868 bytes

Fixed Size                   453492 bytes

Variable Size             109051904 bytes

Database Buffers           25165824 bytes

Redo Buffers                 667648 bytes

数据库装载完毕。

数据库已经打开。


SQL> SHOW parameter spfile

 

NAME                   TYPE     VALUE

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

spfile                 string   %ORACLE_HOME%/DATABASE/SPFILE%ORACLE_SID%.ORA

SQL>

 

 

(END)

 








 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值