数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle中的pfile和spfile详解


发布日期:2020年04月20日
 
Oracle中的pfile和spfile详解

i 以前Oracle 使用pfile 存储初始化参数配置这些参数在实例启动时被读取任何

修改需要重起实例才能生效使用spfile 您能够使用ALTER SYSTEM 或ALTER SESSION

来动态修改那些可动态修改的参数任何更改能够立即生效您能够选择使更改只应用于当前实

例还是同时应用到spfile这就使得任何对spfile 的修改都能够在命令行完成我们能够完全

告别手工修改初始化参数文档这就大大减少了人为错误的发生

SPFILE 是个二进制文档能够使用RMAN 进行备份这样实际上Oracle 把参数文档也

纳入了备份恢复管理

除了第一次启动数据库需要PFILE(然后能够根据PFILE 创建SPFILE)我们能够不再需

要PFILEORACLE 强烈推荐使用spfile应用其新特性来存储和维护初始化参数配置

创建SPFILE

缺省的ORACLE 使用PFILE 启动数据库SPFILE 必须由PFILE 创建新创建的SPFILE

在下一次启动数据库时生效CREATE SPFILE 需要SYSDBA 或SYSOPER 的权限

语法如下

CREATE SPFILE[=SPFILENAME] FROM PFILE[=PFILENAME]

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 位于第 行:

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

这也能够用来判断当前是否使用了SPFILE 文档

然而意外的时Oracle 并没有向其他文档相同在运行期间保持锁定让我们作以下试验

SQL> host rename SPFILEEYGLENORA SPFILEEYGLENORABAK

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

系统已更改

SQL> host dir *ora

驱动器E 中的卷是Doc

卷的序列号是CEFF

E:\Oracle\OraiR\database 的目录

: PWDeyglenORA

个文档 字节

个目录 可用字节

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

alter system set db_cache_size=M scope=spfile

*

ERROR 位于第 行:

ORA: 无法打开文档

OSD: 无法打开文档

O/SError: (OS ) 系统很难找到指定的文档

SQL> host rename SPFILEEYGLENORABAK SPFILEEYGLENORA

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

系统已更改

SQL>

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

使用SPFILE

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

数文档

a spfile${ORACLE_SID}ora

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

NT: ${ORACLE_HOME}\database

b spfileora

缺省目录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\initora;

您不能以同样的方式指定spfile但是能够创建一个包含spfile 参数的pfile 文档指向

spfile

SPFILE 是个自Oraclei 引入的初始化参数类似于IFILE 参数SPFILE 参数用于定

义非缺省路径的spfile 文档

您能够在PFILE 链接到SPFILE 文档同时在PFILE 中定义其他参数假如参数重复配置

后读取的参数将取代先前的配置

PFILE 参数的使用例如:

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

SQL> startup

ORACLE 例程已启动

Total System Global Area bytes

Fixed Size bytes

Variable Size bytes

Database Buffers bytes

Redo Buffers 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\OraiR\database\SPFILEEYGLENORA

log_archive_start = false

能够预见这个log_archive_start 参数配置将会代替SPFILE 中的配置

SQL> startup pfile=e:\initeyglenora

ORACLE 例程已启动

Total System Global Area bytes

Fixed Size bytes

Variable Size bytes

Database Buffers bytes

Redo Buffers bytes

数据库装载完毕

数据库已打开

SQL> show parameter spfile

NAME TYPE

VALUE

spfile string

E:\Oracle\OraiR\database\SPF

ILEEYGLENORA

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 增加了一个新选项SCOPESCOPE 参数有三个可选值

MEMORY SPFILE BOTH

MEMORY:只改变当前实例运行

SPFILE:只改变SPFILE 的配置

BOTH:改变实例及SPFILE

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 bytes

Fixed Size bytes

Variable Size bytes

Database Buffers bytes

Redo Buffers bytes

数据库装载完毕

数据库已打开

SQL> show parameter timed_statistics

NAME TYPE

VALUE

timed_statistics boolean

TRUE

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 bytes

Fixed Size bytes

Variable Size bytes

Database Buffers bytes

Redo Buffers bytes

数据库装载完毕

数据库已打开

SQL> show parameter timed_statistics

NAME TYPE

VALUE

timed_statistics boolean

FALSE

SQL>

. 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 bytes

Fixed Size bytes

Variable Size bytes

Database Buffers bytes

Redo Buffers bytes

数据库装载完毕

数据库已打开

SQL> show parameter timed_statistics

NAME TYPE

VALUE

timed_statistics boolean

TRUE

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

ALTER SYSTEM SET sql_trace=FALSE SCOPE=BOTH

*

ERROR 位于第 行:

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

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

系统已更改

.您也能够在数据库shutdown 时创建和修改spfile例如

SQL> show sga

Total System Global Area bytes

Fixed Size bytes

Variable Size bytes

Database Buffers bytes

Redo Buffers bytes

SQL> shutdown immediate

数据库已关闭

已卸载数据库

ORACLE 例程已关闭

SQL> create pfile from spfile;

文档已创建

SQL> create spfile from pfile;

文档已创建

SQL>

是否使用了spfile

判断是否使用了SPFILE能够使用以下方法

.查询v$parameter 动态视图假如以下查询返回空值那么您在使用pfile

SQL> SELECT namevalue FROM v$parameter WHERE name=spfile;

NAME

VALUE

spfile

%ORACLE_HOME%\DATABASE\SPFILE%ORACLE_SID%ORA

.或您能够使用SHOW 命令来显示参数配置假如以下结果value 列返回空值

么说明您在使用pfile:

SQL> SHOW PARAMETER spfile

NAME TYPE

VALUE

spfile string

%ORACLE_HOME%\DATABASE\SPFILE%

ORACLE_SID%ORA

.查询v$spparameter 视图

假如以下查询返回表示您在使用pfile否则表明您使用的是spfile:

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

COUNT(*)

               

上一篇:SQL*Loader详细使用教程:命令行参数

下一篇:SQL命令查询Oracle存储过程信息