暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

深入解析oracle中的参数及参数文件

原创 time 2022-09-27
1047

参数及参数文件 参数及参数文件 在 Oracle 数据库中,有一系列的初始化参数用来进行数据库约束和资源限制,这些参数 通常存储在一个参数文件中,在数据库实例启动时读取并加载。 初始化参数对数据库来说非常重要,很多参数通过合理的调整可以极大的ᨀ高数据库性 能。本章对初始化参数和参数文件进行相关探讨。 3.1初始化参数的分类 按照得出方式不同,初始化参数可以分为三类: 3.2.1 推导参数(Derived Parameters) 推导参数通常来自于其他参数的运算,依赖其他参数得出。所以这类参数通常不需要修 改。如果强制修改,那么修改值会覆盖推导值。 常见的此类参数有很多,例如:SESSIONS 参数,在 Oracle 11gR2 文档中,该参数按以下 公式运算得出: (1.5 * PROCESSES) + 22 缺省的,当 PROCESSES 被修改时,此参数会自动计算并生效。以下是一个示范数据库 中这两个参数的设置: SQL> select name,value from v$parameter where name in ('processes','sessions'); NAME VALUE -------------------- -------------------- processes 200 sessions 322 Processes 参数代表操作系统上能够并发向 Oracle 数据库发起的连接进程数量。如果该参 数设置过低,则在应用并非高时,超过 Processes 数量的进程将无法连接到数据库。所以在规 划数据库时,合理设置 Processes 参数是十分重要的。但是注意,很多时候由于应用的异常可 能导致业务环境的进程数量激增,所以在生产环境中对进程数量进行必要监控是必需的。 以下是一个生产环境中遇到的相关案例,数据库告警日志文件中记录了如下错误: Thu Jul 17 14:40:18 2008 Process J001 died, see its trace file Thu Jul 17 14:40:18 2008 kkjcre1p: unable to spawn jobq slave process 日志ᨀ示 J001 进程死掉,数据库不能创建 JOBQ 的从属进程(Slave Process)。由于 Job 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·2· 进程是动态创建的,如果数据库的进程数量超过,就可能出现 JOB 进程无法创建的问题。检 查相关的 TRACE 文件,可以发现如下错误信息: Died during process startup with error 20 (seq=14510) OPIRIP: Uncaught error 20. Error stack: ORA-00020: maximum number of processes (500) exceeded 数据库的ᨀ示是,最大数量的进程数量 500 超过,数据库不再允许更多的进程连接,此 时新的连接请求都会收到错误ᨀ示,甚至 DBA 也无法登陆数据库。除了重启数据库之外,可 以通过 Kill 掉部分进程,然后通过 DBA 身份连接到数据库,诊断分析并解决具体问题。 但是由于 processes 参数是静态参数,修改该参数后需要重新启动数据库才能生效。在数 据库启动时,会预先为 Processes 分配内存地址空间,并向 Shared Pool 注册,所以该参数无法 动态修改。缺省的每个进程会在共享池中分配 4 Bytes 的注册空间: SQL> select name,value from v$parameter where name ='processes'; NAME VALUE -------------------- ------------------------------ processes 150 SQL> select * from v$sgastat where name='processes'; POOL NAME BYTES ------------ -------------------- ---------- shared pool processes 600 通常在创建数据库时,建议将该参数修改为 500: SQL> alter system set processes=500 scope=spfile; System altered. 重启之后可以看到数据库进程内存分配的变化: SQL> select name,value from v$parameter where name ='processes'; NAME VALUE ------------------------------ ------------------------------ processes 500 SQL> select * from v$sgastat where name='processes'; POOL NAME BYTES ------------------------ ------------------------------ ---------- shared pool processes 2000 3.2.2 操作系统依赖参数 某些参数的有效值或者取值范围依赖或者受限于操作系统,比如 db_cache_size 参数,设 置 Oracle 使用的 Buffer Cache 内存大小,该参数的最大值就要受限于物理内存。这一类参数 通常被称为操作系统依赖参数。 3.2.3 可变参数 第 1 章 章名章名章名章名章名 ·3· 可变参数包含绝大多数潜在影响系统性能的可调整参数,某些可变参数设置的是限制条 件,如 OPEN_CURSORS;有的参数是设置容量,如 DB_CACHE_SIZE 等。这类参数通常可 以为 DBA 或最终用户调整,从而产生限制或性能变化,对 Oracle 至关重要。 初始化参数通常还有一些其他分类方式: 按照修改方式划分,初始化参数又可以分为静态参数和动态参数。 静态参数只能在参数文件中修改,在重新启动后方能生效;动态参数可以动态调整,调 整后通常可以立即生效。 按照获取方式不同,初始化参数又可以分为显示参数和隐含参数。 显示参数可以通过 v$parameter 查询得到;而隐含参数通常以“_”开头,必须通过查询 系统表方能获得。 总之,虽然分类方式不同,但是参数都是这些,我们更多需要了解的是这些参数的用途。 3.2.4 废弃参数 由于 Oracle 数据库的参数众多,在新版本中可能废弃很多旧的参数,了解这些废弃参数,明 确废弃原因,是 DBA 需要关注的内容之一. 在 Oracle Database 11gR2 中,有大约 130 个参数被废弃: SQL> select * from v$version where rownum <2;> select count(*) from V$OBSOLETE_PARAMETER; COUNT(*) ---------- 131 SQL> select * from V$OBSOLETE_PARAMETER; NAME ISSPE ---------------------------------------------------------------- ----- spin_count FALSE use_ism FALSE lock_sga_areas FALSE instance_nodeset FALSE 这个视图的创建语句如下: SQL> select view_definition from v$fixed_view_definition 2 where view_name='GV$OBSOLETE_PARAMETER'; VIEW_DEFINITION 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·4· --------------------------------------------------------------------------------------- select inst_id,kspponm,decode(ksppoval,0,'FALSE','TRUE') from x$ksppo 底层的 X$SPPO 是这些废弃参数的来源. 3.2.5 初始化参数的获取 Oracle 的初始化参数可以通过 V$PARAMETER 视图查询得到,在 SQL*PLUS 之中,我 们经常可以通过 show parameter 命令来显示某些参数的设置值,例如(以下输出来自 Oracle10gR2 环境): SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 900M sga_target big integer 900M 使用 sql_trace 的跟踪当前会话,可以获得 show parameter 的内部操作,跟踪大致步骤如下: alter session set sql_trace=true; show parameter sga alter session set sql_trace=false 在 user_dump_dest 目录下找到刚刚生成的跟踪文件,可以发现 SQL*Plus 的 Show 命令的 本质是通过如下一条 SQL 查询得到的数据库参数: SELECT NAME NAME_COL_PLUS_SHOW_PARAM,DECODE(TYPE,1,'boolean',2,'string',3, 'integer',4,'file',5,'number', 6,'big integer', 'unknown') TYPE, DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM FROM V$PARAMETER WHERE UPPER(NAME) LIKE UPPER('%sga%') ORDER BY NAME_COL_PLUS_SHOW_PARAM,ROWNUM 注意这里的 UPPER 函数的应用使得 show 命令可以忽略大小写,在 Oracle 8.1.5 中还并不 是这个样子,一条 show parameter SGA/sga 在 Oracle 8.1.5 中的输出结果是不同的: SQL> select * from v$version where rownum <2;> show parameter sga NAME TYPE VALUE ------------------------------ ------- ---------------------------------------- lock_sga boolean FALSE pre_page_sga boolean FALSE SQL> show parameter SGA 第 1 章 章名章名章名章名章名 ·5· 在 Oracle 8.1.5 中,这条后台的 SQL 是如下模样: SELECT SUBSTR (NAME, 1, 36) NAME, DECODE (TYPE, 1, 'boolean', 2, 'string', 3, 'integer') TYPE, SUBSTR (VALUE, 1, 20) VALUE FROM v$parameter WHERE NAME LIKE '%SGA%' ORDER BY NAME 如果再细致一点观察前面的 SQL,也许你会发现一些奇怪的地方,这就是两个字段别名 的设置: NAME NAME_COL_PLUS_SHOW_PARAM DISPLAY_VALUE VALUE_COL_PLUS_SHOW_PARAM 执行 show parameter 命令的输出并未显示这两个别名,原因何在呢? 我们知道,当启动SQL*Plus工具时,会自动调用$ORACLE_HOME/sqlplus/admin/glogin.sql 文件执行一系列的参数设置(可以通过修改这个参数文件来变更 SQL*Plus 登录后的一些显 示),打开这个文件可以发现如下两行定义: -- Defaults for SHOW PARAMETERS COLUMN name_col_plus_show_param FORMAT a36 HEADING NAME COLUMN value_col_plus_show_param FORMAT a30 HEADING VALUE 这就是原因所在。 最常见的对于 glogin.sql 的修改是增加用户名和数据库ᨀ示,可以在该文件中增加如下一 行: set sqlprompt "_user @ _connect_identifier>" 常用的设置还有 set sqlprompt "&_user> " set sqlprompt "_user _privilege> " 此后登陆 SQL*Plus 就会自动在ᨀ示符前显示用户名和实例信息,从 Oracle10g 开始,每 次会话创建都会自动调用 glogin.sql 文件,而 Oracle10g 之前则只会在 SQL*Plus 启动时调用该 文件: [oracle@danaly admin]$ sqlplus eygle/eygle SQL*Plus: Release 10.2.0.1.0 - Production on Fri Feb 15 23:46:00 2008 Copyright (c) 1982, 2005, Oracle. All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, Oracle Label Security, OLAP and Data Mining Scoring Engine options EYGLE @ danaly>connect / as sysdba Connected. SYS @ danaly>connect eygle/eygle Connected. EYGLE @ danaly> 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·6· 继续前面的讨论,show parameter 既然是从 V$PARAMETER 视图来查询参数设置,那么 这个视图的定义就决定了能够获得的内容输出。 通过 V$PARAMETER 视图的创建语句我们可以观察到,实际上 V$PARAMETER 视图过滤 掉了以“_”开头的一系列参数: SELECT x.inst_id, x.indx + 1, ksppinm, ksppity, ksppstvl, ksppstdf, DECODE (BITAND (ksppiflg / 256, 1), 1, 'TRUE', 'FALSE'), DECODE (BITAND (ksppiflg / 65536, 3), 1, 'IMMEDIATE', 2, 'DEFERRED', 3, 'IMMEDIATE', 'FALSE'), DECODE (BITAND (ksppstvf, 7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE'), DECODE (BITAND (ksppstvf, 2), 2, 'TRUE', 'FALSE'), ksppdesc, ksppstcmnt FROM x$ksppi x, x$ksppcv y WHERE (x.indx = y.indx) AND ((TRANSLATE (ksppinm, '_', '#') NOT LIKE '#%') OR (ksppstdf = 'FALSE') ) 这些以“_”开头的初始化参数通常被称为隐含参数,Oracle 通常不建议修改这些参数, 但是因为某些隐含参数有着特殊的功能,逐渐被越来越多的人所熟知。 从 V$PARAMETER 视图的创建语句中我们可以发现,这个视图实际上是建立在两个底层 数据字典表 X$KSPPI 和 X$KSPPCV 之上的。 通过以下查询我们可以从内部表直接获得所有参数及其᧿述信息: SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.KSPPDESC PDESC FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.indx = y.indx AND x.ksppinm LIKE '%&par%'; 比较常用的几个隐含参数有: NAME VALUE PDESC ------------------------------ ---------- ------------------------------------------------ _allow_resetlogs_corruption FALSE allow resetlogs even if it will cause corruption _offline_rollback_segments offline undo segment list _corrupted_rollback_segments corrupted undo segment list 在后文我们会介绍一下这几个参数的重要用途。 3.2.6 初始化参数的可选项目 Oracle 的很多参数具有多个不同的可选值,可以通过 V$PARAMETER_VALID_VALUES 来进行查询,例如以下查询获得 cursor_sharing 参数的三个可选设置: SQL> select * from V$PARAMETER_VALID_VALUES where name like '%cursor%'; NUM NAME ORDINAL VALUE ISDEFAULT ---------- ------------------------------ ---------- -------------------- ---------- 901 cursor_sharing 1 FORCE FALSE 第 1 章 章名章名章名章名章名 ·7· 901 cursor_sharing 2 EXACT TRUE 901 cursor_sharing 3 SIMILAR FALSE 这个视图是基于 X$KSPVLD_VALUES 建立起来的,也可以查询 X$视图来直接获得这些 设置选项: SQL> SELECT 2 INST_ID, 3 PARNO_KSPVLD_VALUES pvalid_par#, 4 NAME_KSPVLD_VALUES pvalid_name, 5 VALUE_KSPVLD_VALUES pvalid_value, 6 DECODE(ISDEFAULT_KSPVLD_VALUES, 'FALSE', '', 'DEFAULT' ) pvalid_default 7 FROM 8 X$KSPVLD_VALUES 9 WHERE 10 LOWER(NAME_KSPVLD_VALUES) LIKE LOWER('%&1%') 11 ORDER BY 12 pvalid_par#,pvalid_default,pvalid_Value 13 / Enter value for 1: cursor old 10: LOWER(NAME_KSPVLD_VALUES) LIKE LOWER('%&1%') new 10: LOWER(NAME_KSPVLD_VALUES) LIKE LOWER('%cursor%') INST_ID PAR# PARAMETER VALUE DEFAULT ---------- ------ ------------------------------------ -------- ------- 1 901 cursor_sharing EXACT DEFAULT 1 cursor_sharing FORCE 1 cursor_sharing SIMILAR 1 1003 _optimizer_extended_cursor_sharing NONE 1 _optimizer_extended_cursor_sharing UDO 3.2参数文件 参数文件是一个包含一系列参数及参数对应值的操作系统文件。 参数文件有两种类型: u 初始化参数文件(Initialization Parameters Files)- Oracle9i 之前 Oracle 一直采用 pfile 方式存储初始化参数,该文件为文本文件。可以手工修改。 u 服务器参数文件(Server Parameter Files)- 从 Oracle9i 开始,Oracle 引入的 spfile 文 件,该文件为二进制格式,不能通过手工修改。 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·8· 从操作系统上我们也可以看到这两者的区别,INIT 文件为 ASCII 文本文件,SPFILE 为数 据文件: [oracle@jumper oracle]$ cd $ORACLE_HOME/dbs [oracle@jumper dbs]$ file initconner.ora initconner.ora: ASCII text [oracle@jumper dbs]$ file spfileconner.ora spfileconner.ora: data 在 9i 以前,Oracle 使用 pfile 存储初始化参数设置,参数文件的修改需要手工进行,这些 参数在实例启动时被读取,通过 pfile 的修改需要重起实例才能生效;从 Oracle9i 开始,Oracle 引入 spfile 文件,使用 spfile 你可以通过命令来修改参数(如在 SQL*Plus 中通过 ALTER SYSTEM 修改参数),不再需要通过手工修改,对于动态参数所有更改可以立即生效,同时你 可以选择使更改只应用于当前实例还是同时应用到 spfile ,对于静态参数我们只能将变更应用 到 spfile 文件,这些变更在数据库重启后生效。 SPFILE 的引入使得对于参数的修改都可以在命令行完成,我们可以彻底告别手工修改初 始化参数文件的历史,这就大大减少了人为错误的发生。 另外 SPFILE 是一个二进制文件,可以使用 RMAN 进行备份,这样实际上 Oracle 把参数 文件也纳入了 Oracle 的备份恢复体系。 随着SPFILE的引入,一个新的视图V$SPPARAMETER被引入,这个视图用于记录SPFILE 文件中设置的初始化参数: SQL> select sid,name,value from v$spparameter where value is not null; SID NAME VALUE ---------- ------------------------------ ------------------------------------------ * processes 1000 * sessions 555 * sga_target 1241513984 …………… smsdb1 instance_number 1 smsdb2 instance_number 2 * undo_management AUTO smsdb1 undo_tablespace UNDOTBS1 smsdb2 undo_tablespace UNDOTBS2 注意查询输出结果中的 SID 项,如果 SID 为“*”则意味着参数设置对 RAC 集群中的所 有实例有效,如果是指定了实例名称的,则只对相应实例生效;对于单实例数据库,则 SID 项设置皆为“*”( 通过 sql_trace 或者 autotrace 功能可以发现,v$spparameter 视图是建立在一 个新的 X$KSPSPFILE 数据字典表之上的)。 3.2.1 PFILE 和 SPFILE 除了第一次启动数据库需要 PFILE(然后可以根据 PFILE 创建 SPFILE),数据库可以不 第 1 章 章名章名章名章名章名 ·9· 再需要 PFILE,ORACLE 强烈推荐使用 spfile,应用其新特性来存储和维护初始化参数设置。 当使用 DBCA 自定义(不使用模版)创建数据库时,在最后一个步骤,选择生成数据库 创建脚本,可以将创建数据库所需要执行的脚本保存下来。通过这些脚本,可以进一步研究 Oracle 数据库的创建过程(当然也可以通过手工执行这些脚本,手工创建数据库): 以 Windows 为例,在 scripts 目录下,通常可以看到这样一些脚本(根据安装选项不同, 脚本可能不同): C:\oracle\admin\eygle\scripts>dir 2005-01-06 13:23 918 CreateDB.sql 2005-01-06 13:23 631 CreateDBCatalog.sql 2005-01-06 13:23 134 CreateDBFiles.sql 2005-01-06 13:23 781 eygle.bat 2005-01-06 13:23 2,847 init.ora 2005-01-06 13:24 409 postDBCreation.sql 手工创建过程通常可以通过 eygle.bat 批处理文件执行开始,系统会根据脚本自动执行创 建过程。我们不打算过多介绍数据库创建过程,和本章内容有关的是,这里存在一个 init.ora 文 件(或 init.ora.<时间戳>文件),这个文件是根据创建数据库之前定义的参数自动生成的,该参 数文件被用来在创建过程中启动数据库,通过 CreateDB.sql 可以看到这个引用: connect SYS/change_on_install as SYSDBA 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·10· set echo on spool C:\oracle\ora92\assistants\dbca\logs\CreateDB.log startup nomount pfile="C:\oracle\admin\eygle\scripts\init.ora"; CREATE DATABASE eygle MAXINSTANCES 1 MAXLOGHISTORY 1 MAXLOGFILES 5 MAXLOGMEMBERS 3 MAXDATAFILES 100 DATAFILE 'd:\oradata\eygle\system01.dbf' SIZE 250M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL 在数据库创建完成之后,Oracle 调用 postDBCreation.sql 脚本来进行一系列的后续处理, 最后 Oracle 通过 init.ora 文件创建了 spfile 文件,该脚本的内容大致如下: connect SYS/change_on_install as SYSDBA set echo on spool C:\oracle\ora92\assistants\dbca\logs\postDBCreation.log @C:\oracle\ora92\rdbms\admin\utlrp.sql; shutdown ; connect SYS/change_on_install as SYSDBA set echo on spool C:\oracle\ora92\assistants\dbca\logs\postDBCreation.log create spfile='C:\oracle\ora92\database\spfileeygle.ora' FROM pfile='C:\oracle\admin\eygle\scripts\init.ora'; startup ; 这就是从 Oracle9i 开始的 pfile 和 spfile 的交接。建议每个试图深入学习 Oracle 的人都仔 细研究一下自动建库的脚本,深入了解该过程非常有助于 Oracle 学习与领悟。 3.2.2 获取参数的视图 数据库的参数设置存储在数据字典表中,进而通过视图展现出来,前文已经ᨀ到了两个 相关视图:V$PARAMETER 和 V$SPPARAMETER。除了这两个重要视图之外,常用的还有 一个 V$SYSTEM_PARAMETER 视图。 由于 Oracle 数据库是一个多用户数据库系统,所以不同会话之间可能存在不同的参数设 置,V$SYSTEM_PARAMETER 视图用于显示当前对于实例(INSTANCE)级别生效的参数设 置,可以被认为是系统(SYSTEM)级别的参数设置;当一个会话(SESSION)创建时,会 首先从 V$SYSTEM_PARAMETER 继承参数设置,而 V$PARAMETER 正是用于显示在会话 级别生效的参数设置,如果在会话级别修改了参数设置,这里的参数值就可能和 V$SYSTEM_PARAMETER 显示的有所不同。 扩展一下介绍,对应于 V$PARAMETER 视图,还存在一个 V$PARAMETER2 视图,这 个视图和 V$PARAMETER 的区别在于,对于存在多个参数值的参数,在这个视图中分多行记 录,例如对于 CONTROL_FILES 参数在 V$PARAMETER 中显示如下: SQL> select name,value from v$parameter where name='control_files'; NAME 第 1 章 章名章名章名章名章名 ·11· --------------- VALUE -------------------------------------------------------------------------------- control_files /data1/oradata/phsdb/control01.ctl, /data1/oradata/phsdb/control02.ctl, /data1/o radata/phsdb/control03.ctl 而在 V$PARAMETER2 则分为三条记录显示: SQL> select name,value from v$parameter2 where name='control_files'; NAME VALUE --------------- -------------------------------------------------- control_files /data1/oradata/phsdb/control01.ctl control_files /data1/oradata/phsdb/control02.ctl control_files /data1/oradata/phsdb/control03.ctl 类似的对于 V$SYSTEM_PARAMETER 视图,也存在一个对应的 V$SYSTEM_PARAMETER2 视图。 我们前边ᨀ到当在 SQL*Plus 中使用 show parameter 命令时,实际上在后台查询的是 V$PARAMETER 视图;从 Oracle Database 11g 开始,SQL*Plus 增加了一个命令 show spparameter 用于显示 V$SPPARAMETER 视图中的参数设置: SQL> select * from v$version where rownum <2;> show parameter memory_target NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ memory_target big integer 800M SQL> show spparameter memory_target SID NAME TYPE VALUE -------- ----------------------------- ----------- ---------------------------- * memory_target big integer 800M 这是 Oracle Database 11g 在易用性方面的一个小小增强。 3.2.3 SPFILE 的创建 从 Oracle9i 开始,缺省的,ORACLE 使用 SPFILE 启动数据库,从上一节的数据库创建过 程我们也可以看到,SPFILE 必须由 PFILE 创建,新创建的 SPFILE 在下一次启动数据库时生 效。 CREATE SPFILE 需要 SYSDBA 或者 SYSOPER 的权限,其语法如下,注意其中 MEMORY 的选项是自 Oracle 11g 引入的: 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·12· 例如: SQL> create spfile from pfile; 缺省的,spfile 会创建到系统缺省目录,在 Unix 下的缺省目录为 $ORACLE_HOME/dbs 在 Windows 上的缺省目录为$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:\Oracle\Ora9iR2\database 的目录 2003-02-10 14:35 2,048 PWDeyglen.ORA 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; 系统已更改。 由于运行期并不锁定 spfile,所以 spfile 可能会意外丢失,如果发生此类情况,Oracle 会 不允许使用 create spfile from pfile 缺省命令来重建 spfile(因 ORA-32002 错误而失败),但是 此时可以创建一个自定义名称的 spfile 文件,然后重命名为缺省名称即可。 第 1 章 章名章名章名章名章名 ·13· 3.2.4 由内存创建参数文件 从 Oracle 11g 开始,为了增强参数文件的恢复,一个新的命令被引入用于从当前运行实例 创建参数文件,这个命令是: create from memory; 这个命令可以使用当前的参数设置在缺省位置创建一个 spfile 文件,当然也可以指定一个 不同的位置: SQL> create spfile='/tmp/spfile.ora' from memory; File created. 这一增强简化了我们在某些条件下的参数文件恢复。 通过跟踪这个过程,可以获取这个简单增强的内部操作: SQL> alter session set sql_trace=true; Session altered. SQL> create spfile='/tmp/spfile.ora' from memory; File created. 先观察一下自动生成跟踪文件的内容,参数文件输出的参数远远多于我们的设定,很多 隐含参数的设置同样被列出: [oracle@wapdb trace]$ strings /tmp/spfile.ora *.__db_cache_size=196M *.__java_pool_size=4M *.__large_pool_size=32M *.__oracle_base='/opt/oracle' # ORACLE_BASE set from environment *.__pga_aggregate_target=200M *.__sga_target=600M *.__shared_io_pool_size=0 *.__shared_pool_size=360M *.__streams_pool_size=0 *._always_anti_join='CHOOSE' *._always_semi_join='CHOOSE' *._b_tree_bitmap_plans=TRUE *._bloom_filter_enabled=TRUE *._bloom_pruning_enabled=TRUE *._complex_view_merging=TRUE *._convert_set_to_join=FALSE 现在格式化一下跟踪文件,看看数据库生成脚本的命令,以下是递归 SQL 摘录,可以看 出这些 SQL 和此前我们手工执行的 SQL 有殊途同归之妙: SQL ID : 0000000000000 alter session set sql_trace=true 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·14· SQL ID : 0000000000000 create spfile='/tmp/spfile.ora' from memory SQL ID : asvzxj61dc5vs select timestamp, flags from fixed_obj$ where obj#=:1 SQL ID : 48x4v2mpymujm select x.inst_id,kspftctxsid,kspftctxpn,ksppinm,ksppity,kspftctxdvl, kspftctxvn,kspftctxct from x$ksppi x, x$ksppsv2 y where ((x.indx+1) = kspftctxpn) and (bitand(ksppilrmflg,64)!=64) and ((kspftctxdf = 'FALSE') or (bitand(kspftctxvf,8) = 8)) SQL ID : 437ya6wz5w505 select SID, NUM, NAME, TYPE, DISPLAY_VALUE, ORDINAL, UPDATE_COMMENT from GV$SYSTEM_PARAMETER4 where INST_id = USERENV('Instance') SQL ID : 4kvhq1dbu6hnx select num,name,type,display_value,update_comment from v$system_parameter4 order by lower(name),ordinal 3.2.5 SPFILE 的搜索顺序 重新启动数据库,使用 startup 命令,Oracle 将会按照以下顺序在缺省目录(Windows 缺 省目录为$ORACLE_HOME\database;Unix/Linux 下缺省目录为$ORACLE_HOME/dbs)中搜 索参数文件:spfile.ora 、spfile.ora、init.ora 创建了 spfile,重新启动数据库,Oracle 会按顺序搜索以上目录,spfile 就会自动生效。 3.2.6 使用 PFILE/SPFILE 启动数据库 如果你想使用 pfile 启动数据库,你可以在启动时指定 pfile 或者删除 spfile。通过指定 pfile 启动数据库的命令格式类似如下: SQL> startup pfile='E:\Oracle\admin\eyglen\pfile\init.ora'; 你不能以同样的方式指定 spfile,但是可以创建一个包含 spfile 参数的 pfile 文件,指向 spfile。SPFILE 是一个自 Oracle9i 引入的初始化参数,类似于 IFILE 参数。 SPFILE 参数用于 定义非缺省路径的 spfile 文件。 你可以在 PFILE 链接到 SPFILE 文件,同时在 PFILE 中定义其他参数,如果参数重复设置, 后读取的参数将取代先前的设置。 第 1 章 章名章名章名章名章名 ·15· 看一下以下例子,当前使用 spfile 启动数据库,log_archive_start 参数设置为 True: 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 修改 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' SQL> show parameter spfile NAME TYPE VALUE ------------------------------------ ---------------------- spfile string E:\Oracle\Ora9iR2\database\SPFILEEYGLEN.ORA SQL> show parameter log_archive_start NAME TYPE VALUE ---------------------- -------- ---------------------- log_archive_start boolean FALSE 这就是 spfile 与 pfile 结合使用的一些技巧。同样的用法其实在 RAC 的系统中非常常见, 由于 RAC 中,通常需要把 spfile 存储在共享磁盘上,所以常规的做法就是通过定义 pfile 文件, 在 pfile 文件中对 spfile 文件进行重定向,下面是 RAC 环境中一个参数文件的设置范例: [oracle@raclinux1 ~]$ cd $ORACLE_HOME/dbs [oracle@raclinux1 dbs]$ more initRACDB1.ora SPFILE='+MY_DG2/RACDB/spfileRACDB.ora' 在这样的环境中,需要谨慎使用 create spfile from pfile 的命令,很多朋友因为草率的执行 这样的操作而导致数据库故障。 在 ASM 或 RAC 环境中,通常的 init.ora 文件中只有如上示例的一行,如果此时执行 create spfile from pfile 命令,则新创建的 spfile 文件将也只有这样一行信息,数据库使用这样 的一个 spfile 将无法启动。 在数据库启动之后,可以使用 ALTER SYSTEM 方式将参数修改直接固化到 SPFILE 文件 中。 SQL> alter system set log_archive_start=false scope=spfile; 系统已更改。 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·16· 提示:通过在 pfile 中调用 spfile,使用后设置的参数覆盖 spfile 中的参数设置,是解决 spfile 中 参数设置错误的一种方法。 3.2.7 修改参数 可以通过 ALTER SYSTEM 或者导入导出来更改 SPFILE 的内容。从 Oracle9i 开始,ALTER SYSTEM 命令增加了一个新的选项:SCOPE。 SCOPE 参数有三个可选值:MEMORY ,SPFILE , BOTH u MEMORY-只改变当前实例运行,重新启动数据库后失效 u SPFILE-只改变 SPFILE 的设置,不改变当前实例运行,重新启动数据库后生效 u BOTH-同时改变实例及 SPFILE,当前更改立即生效,重新启动数据库后仍然有 效。 针对 RAC 环境,ALTER SYSTEM 还可以指定 SID 参数,对不同实例进行不同设置。 所以通过 spfile 修改参数的完整命令如下: alter system set = scope = memory|spfile|both [sid=] 通过简单的例子来看一下 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 如果观察 alert_.log 文件,我们可以发现其中记录了如下一行: Wed Apr 26 21:18:57 2006 ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=MEMORY; 如果重新启动数据库,这个更改将会丢失: SQL> startup force; SQL> show parameter db_cache_ad NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_advice string ON 也就是说 SCOPE=MEMORY 的修改影响,不会跨越一次数据库的重新启动。 第 1 章 章名章名章名章名章名 ·17· 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 同样可以从告警日志文件中看到这个修改: Wed Apr 26 21:24:02 2006 ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=SPFILE; 这个修改将在下次数据库启动后生效: SQL> startup force; 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_advice 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> alter system set db_cache_advice=off scope=both; System altered. 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·18· SQL> alter system set db_cache_advice=off; System altered. SQL> show parameter db_cache_ad NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_advice string OFF 在告警日志文件中可以看到如下信息: Wed Apr 26 21:28:21 2006 ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=BOTH; Wed Apr 26 21:28:28 2006 ALTER SYSTEM SET db_cache_advice='OFF' SCOPE=BOTH; 注意到不带 SCOPE 参数和 SCOPE=BOTH 实际上是等价的。但是如果修改静态参数,那 么需要指定 SPFILE 参数,不能指定 BOTH 参数,否则数据库将会报错。 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; 系统已更改。 注意:在 Oracle10g 中,sql_trace 已经变为了一个动态参数。 4.RAC 环境中的修改 在 Rac 环境中,如果不指定 sid 名称,或者指定为“*” , 那么修改缺省的对所有实例生 效.例如: ALTER SYSTEM SET OPEN_CURSORS=500 SID='*' SCOPE=MEMORY; 如果需要修改指定的实例,则需要设置相应的 SID 参数,例如: SQL> select sid,name,value from v$spparameter where name='open_cursors'; SID NAME VALUE ---------- ---------------------------------------- ------------------------------ * open_cursors 300 SQL> alter system set open_cursors=150 scope=spfile sid='RACDB1'; System altered. SQL> select sid,name,value from v$spparameter 2 where name='open_cursors'; SID NAME VALUE ---------- ---------------------------------------- ------------------------------ 第 1 章 章名章名章名章名章名 ·19· * open_cursors 300 RACDB1 open_cursors 150 需要注意的是,在 RAC 环境中,不同实例的 undo_tablespace 设置是不同的,当修改一个 实例的 undo 表空间时,一定要注意指定相应的实例,以避免修改错误: SQL> select sid,name,value from v$spparameter where name='undo_tablespace'; SID NAME VALUE ---------- ---------------------------------------- ------------------------------ RACDB1 undo_tablespace UNDOTBS1 RACDB2 undo_tablespace UNDOTBS2 5.在关闭数据库状态修改 spfile 可以在数据库 shutdown 时创建和修改 spfile,例如: SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> create pfile from spfile; 文件已创建。 SQL> create spfile from pfile; 文件已创建。 所以如果当我们不慎错误的修改了参数导致数据库无法启动时,可以通过创建 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; SQL> startup ORA-00381: cannot use both new and old parameters for buffer cache size specification 此时可以由 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. Database mounted. 书名书名书名书名书名书名书名书名书名书名书名书名书名书名 ·20· Database opened. Spfile 的修改和使用方式,我们是一定要熟练的。 提示:这是修改 spfile 的第二种方式,通过这种方式,我们可以快速修正 spfile 中的错误参数定 义。 在 spfile 引入之初,很多人因为其使用和修改复杂而拒绝使用 spfile,仍然沿用 pfile 文件, 其实不要小看 spfile 文件,spfile 可以在数据库中通过命令动态修改的特性,是 Oracle10g 中很 多自动化特性的实现基础。 我们应当熟悉这样一个事实,Oracle 经常在现行版本中为下一版本作准备,并优先推出部 分功能,这些功能因为其超前可能显得不够实用,而当这些特性在新版本中再次出现时,我们 才忽然知道,这些特性原来是如此的不可缺少。 以 Oracle10g 的自动共享内存调整特性(具体内容将在后面章节详细介绍)来做一个简单 说明。当在 Oracle10g 中设置了 SGA_TARGET 参数启用了自动 SGA 调整之后,Oracle 会同 时启用一系列的新的隐含参数来控制 SGA 各组件的大小。如果足够细心,大家可能从告警日 志文件中注意到,每次启动这些参数的设置通常都是不同的,从生产环境中摘录两个片段给大 家参考。 第一个启动信息: 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) …… 第 1 章 章名章名章名章名章名 ·21· 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 不能用来启动数据库。我们要引以为戒。 曾经有朋友问这样一个错误: Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_mmon_5234.trc: ORA-00600: internal error code, arguments: [kmgs_parameter_update_timeout_1], [1565], [], [], [], [], [], [] ORA-01565: error in identifying file '/u01/app/oracle/oracle/product/10.2.0/db_1/dbs/spfileorcl.ora' ORA-27046: file size is not a multiple of logical block size 从后面的 ORA-01565 错误号,我们明显能够看出这是一个参数文件损坏的问题,手工修 改损坏了这个参数文件。 那么前一个 600 错误呢? 我们知道 Oracle 在运行阶段是不锁定 spfile 的,所以 spfile 的问题要等到下一次修改或使 用时才能发现

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论