壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3075|回复: 1

Oracle9i新特点举例讲解:SPFILE的使用

[复制链接]
发表于 2006/11/6 20:33:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
在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>
 楼主| 发表于 2006/11/6 20:35:52 | 显示全部楼层
. 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)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 07:04 , Processed in 0.015334 second(s), 16 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表