--========================
-->Oracle 参数文件
--========================
/*
参数文件 (10g 中的参数文件 )
主要用来记录数据库的配置文件,在数据库启动时, Oracle 读取参数文件,并根据参数文件中的参数设置来配置数据库。
如内存池的分配,允许打开的进程数和会话数等。
两类参数文件:
pfile: 文本文件的参数文件,可以使用 vi,vim 等编辑器修改,文件名通常为 init<sid>.ora
spfile: 二进制的参数文件,不能直接修改,只能存放在 Oracle 服务器端,可以使用 EM 或指令来修改
(alter system|session set parameter_name = values <>),
文件名通常为 spfile<sid>.ora, 支持 RMAN 备份。
优先级别 :
Oracle 启动读取参数文件的顺序 , 如果个文件都不存在,则 Oracle 会报错
spfile<sid>.ora --> spfile.ora -->init<sid>.ora
参数文件的路径: */
spfle : $ORACLE_HOME / dbs / spfile$ORACLE_SID . ora
pfile ( 9i ): $ORALCE_HOME / dbs / init$ORALCE_SID . ora /*10g 以后一般不用 init<sid>.ora*/
pfile ( 10g ): $ORALCE_BASE / admin / $ORACLE_SID / pfile /* 仅当数据库初始化时使用 */
pfile : $ORACLE_HOME / dbs / init . ora /* 默认 */
/*
参数文件之间的转化
spfile 转化为 pfile
pfile 转换为 spfile
从 spfile 来生成 pfile
create pfile from spfile , 执行完毕后, pfile 将保存为 $ORACLE_HOME/dbs/init$ORACLE_SID.ora
也可以指定 pfile 的路径: create pfile = '<dir>' from spfile;
由 pfile 生成 spfile
create spfile from pfile
create spfile from pfile = '<dir>'
create spfile = '<dir>' from pfile
11g 中的新指令,从 memeory 中生成
create spfile = '<dir>' from memeory */
/*
演示: */
spfile --> pfile
SQL > create pfile from spfile ;
File created .
SQL > ho ls - al / u01 / app / oracle / 10g / dbs /
total 56
drwxr - x --- 2 oracle oinstall 4096 Apr 8 13:49 .
drwxr - x --- 55 oracle oinstall 4096 Apr 7 09:48 ..
- rw - r ----- 1 oracle oinstall 1544 Apr 6 12:06 hc_orcl.dat
- rw - r ----- 1 oracle oinstall 8385 Sep 11 1998 init.ora
- rw - r ----- 1 oracle oinstall 12920 May 3 2001 initdw.ora
- rw ------- 1 oracle oinstall 1155 Apr 8 13:49 initorcl.ora
- rw - r ----- 1 oracle oinstall 24 Apr 6 12:06 lkORCL
- rw - r ----- 1 oracle oinstall 1536 Apr 7 15:50 orapworcl
- rw - r ----- 1 oracle oinstall 3584 Apr 8 11:15 spfileorcl.ora
SQL > ho cat / u01 / app / oracle / 10g / dbs / initorcl . ora
orcl . __db_cache_size = 251658240
orcl . __java_pool_size = 4194304
orcl . __large_pool_size = 4194304
orcl . __shared_pool_size = 142606336
orcl . __streams_pool_size = 0
*. audit_file_dest = '/u01/app/oracle/admin/orcl/adump'
*. background_dump_dest = '/u01/app/oracle/admin/orcl/bdump'
*. compatible = '10.2.0.1.0'
*. control_files = '/u01/app/oracle/oradata/orcl/control01.ctl' , '/u01/app/oracle/oradata/orcl/control02.ctl' , '/u01/app/oracle/oradata/orcl/control03.ctl'
*. core_dump_dest = '/u01/app/oracle/admin/orcl/cdump'
*. db_block_size = 8192
*. db_create_file_dest = '/u01/app/oracle/oradata/orcl'
*. db_create_online_log_dest_1 = '/u01/app/oracle/disk1'
*. db_create_online_log_dest_2 = '/u01/app/oracle/disk2'
*. db_domain = ''
*. db_file_multiblock_read_count = 16
*. db_name = 'orcl'
*. db_recovery_file_dest = '/u01/app/oracle/flash_recovery_area'
*. db_recovery_file_dest_size = 2147483648
*. dispatchers = '(PROTOCOL=TCP) (SERVICE=orclXDB)'
*. job_queue_processes = 10
*. open_cursors = 300
*. pga_aggregate_target = 135266304
*. processes = 150
*. remote_login_passwordfile = 'EXCLUSIVE'
*. sga_target = 406847488
*. undo_management = 'AUTO'
*. undo_tablespace = 'UNDOTBS1'
*. user_dump_dest = '/u01/app/oracle/admin/orcl/udump'
pfile --> spfile
SQL > create spfile from pfile ; /* 使用该命令的时候不能转换,如下报错,因为当前的 spfile 正在使用 */
create spfile from pfile
*
ERROR at line 1 :
ORA - 32002 : cannot create SPFILE already being used by the instance
SQL > create spfile = '/u01/app/oracle/spfileorcl.ora' from pfile ;
File created .
SQL > ho cat / u01 / app / oracle / spfileorcl . ora ;
a * orcl . __db_cache_size = 251658240
orcl . __java_pool_size = 4194304
orcl . __large_pool_size = 4194304
orcl . __shared_pool_size = 142606336
orcl . __streams_pool_size = 0
*. audit_file_dest = '/u01/app/oracle/admin/orcl/adump'
*. background_dump_dest = '/u01/app/oracle/admin/orcl/bdump'
*. compatible = '10.2.0.1.0'
*. control_files = '/u01/app/oracle/oradata/orcl/control01.ctl' , '/u01/app/oracle/oradata/orcl/control02.ctl' , '/u01/app/oracle/oradata/orcl/control03.ctl'
*. core_dump_dest = '/u01/app/oracle/admin/orcl/cdump'
*. db_block_size = 8192
*. db_create_file_dest = '/u01/app/oracle/oradata/orcl'
*. db_create_online_log_dest_1 = '/u01/app/oracle/disk1'
*. db_create_online_log_dest_2 = '/u01/app/oracle/disk2'
*. db_domain = ''
*. db_file_multiblock_read_count = 16
*. db_name = 'orcl'
*. db_recovery_file_dest = '/u01/app/oracle/flash_recovery_area'
*. db_recovery_file_dest_size = 2147483648
*. dispatchers = '(PROTOCOL=TCP) (SERVICE=orclXDB)'
*. job_queue_processes = 10
*. open_cursors = 300
*. pga_aggregate_target = 135266304
*. processes = 150
*. remote_login_passwordfile = 'EXCLUSIVE'
*. sga_target = 406847488
*. undo_management = 'AUTO'
*. undo_tablespace = 'UNDOTBS1'
*. user_dump_dest = '/u01/app/oracle/admin/orcl/udump'
/*
转换后的使用:
假定修改了 initorcl.ora 中的参数,但 Oracle 启动是先读取 spfile ,故可以在启动的时候指定用 initorcl.ora 来
初始化参数,启动完毕后,可以创建 spfile ,则下一次启动就可以使用新的 spfile.
假定我们对 initorcl.ora 作如下修改: */
open_cursors = 600
processes = 250
/*
则关闭数据库后指定以 initorcl.ora 参数来启动数据库 */
SQL > startup pfile = '/u01/app/oracle/10g/dbs/initorcl.ora' ;
ORACLE instance started .
Total System Global Area 406847488 bytes
Fixed Size 1219688 bytes
Variable Size 150995864 bytes
Database Buffers 251658240 bytes
Redo Buffers 2973696 bytes
Database mounted .
Database opened .
SQL > create spfile from pfile ; /* 修改的内容将会更新到 spfile*/
File created .
-- 查看参数文件的名字
SQL > show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string orcl
-- 查看当前使用的哪个参数文件启动的
SQL > select distinct isspecified from v$spparameter ;
ISSPEC
------
FALSE
/*
如果第一个值是 FALSE 还是 TRUE ,如果是 FALSE ,则是 pfile, 否则则是 spfile.
也可以尝试修改 spfile , 如果报错则可以判断是从 pfile 启动,当然所修改的参数必须是可以修改的 */
SQL > alter system set sga_target = 200m scope = spfile ;
alter system set sga_target = 200m scope = spfile
*
ERROR at line 1 :
ORA - 32001 : write to SPFILE requested but no SPFILE specified at startup
-- 强制启动 Oracle 后再查看是使用的哪个参数启动的。
SQL > startup force
ORACLE instance started .
Total System Global Area 406847488 bytes
Fixed Size 1219688 bytes
Variable Size 150995864 bytes
Database Buffers 251658240 bytes
Redo Buffers 2973696 bytes
Database mounted .
Database opened .
SQL > select distinct isspecified from v$spparameter ;
ISSPEC
------
TRUE
FALSE
/*
第一行为 TRUE 可知,是从 spfile 启动的,有两行,其中第二行为 FALSE, 表示有两个参数文件,一个是 spfile, 一个是 pfile
再次尝试看看能否修改 spfile: */
SQL > alter system set sga_target = 380m scope = spfile ; /* 修改成功 */
System altered .
/*
参数文件的修改:
如果是 pfile , 直接使用 vi,vim 来修改即可
如果是 spfile , 则使用 */
alter system|session set parametername = values scope = memory | spfile | both sid = 'sid' | ‘ * ’ ;
scope
memory : 只对当前实例有效,下次启动则失效
spfile : 只对 spfile 修改,必须经过下一次启动才生效,当前的实例没有修改
both :内存与参数文件都将修改,当不指定 scope 时,缺省为 both .
system | session
system :
-- 查询视图: v$parameter
isses_modifiable 可以被 alter session 修改
isssy_modifiable 可以被 alter system 修改
-- sid :
sid : 只对某一个实例
* :对所有的实例修改
SQL > show parameter sga_ /* 查看与 sga 有关的参数 */
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_max_size big integer 388M
sga_target big integer 388M
SQL > alter system set sga_max_size = 350m ; /* 特殊的参数不能被修改 */
alter system set sga_max_size = 350m
*
ERROR at line 1 :
ORA - 02095 : specified initialization parameter cannot be modified
SQL > a scope = spfile
1 * alter system set sga_max_size = 350m scope = spfile
SQL > /
System altered .
SQL > select instance_name from v$instance ;
INSTANCE_NAME
----------------
orcl
SQL > alter system set sga_max_size = 350m scope = spfile sid = 'orcl' ;
System altered .
-- 只改内存
SQL > show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 129M
SQL > alter system set pga_aggregate_target = 130m scope = memory ;
System altered .
-- 同时修改内存和参数文件,以下两条语句等效
SQL > alter system set pga_aggregate_target = 130m scope = both ;
System altered .
SQL > alter system set pga_aggregate_target = 130m ;
System altered .
--alter session
SQL > show parameter sql_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
plsql_ccflags string
plsql_code_type string INTERPRETED
plsql_compiler_flags string INTERPRETED , NON_DEBUG
plsql_debug boolean FALSE
plsql_native_library_dir string
plsql_native_library_subdir_count integer 0
plsql_optimize_level integer 2
plsql_v2_compatibility boolean FALSE
plsql_warnings string DISABLE :ALL
sql92_security boolean FALSE
sql_trace boolean FALSE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sql_version string NATIVE
sqltune_category string DEFAULT
SQL > alter session set sql_trace = true ;
Session altered .
-- 可以从 v$parameter 视图中来得到哪些可以使用 alter system 修改,哪些可以使用 alter session 来修改。
SQL > col name for a40
SQL > select NAME , ISSES_MODIFIABLE , ISSYS_MODIFIABLE from v$parameter
2 where name like 'sql%' ;
NAME ISSES ISSYS_MOD
---------------------------------------- ----- ---------
sql_trace TRUE IMMEDIATE
sql92_security FALSE FALSE
sql_version TRUE FALSE
sqltune_category TRUE IMMEDIATE
-- TURE :可以该类型修改, FLASE :不支持该类型修改, IMMEDIATE :也是支持该类型修改
SQL > alter system set sql_version = 8 ; /* 不支持 system 类型修改 */
alter system set sql_version = 8
*
ERROR at line 1 :
ORA - 02096 : specified initialization parameter is not modifiable with this option
SQL > alter session set sql_version = 8 ;
ERROR :
ORA - 00096 : invalid value 8 for parameter sql_version , must be from among MAX ,
NATIVE , 8.1.6 , 8.1.5
SQL > alter session set sql_version = '8.1.6' ; /* 支持 session 类型修改 */
Session altered .
SQL > select distinct issys_modifiable from v$parameter ;
ISSYS_MOD
---------
IMMEDIATE /* 动态参数,直接修改到内存的参数 alter system set <> = <> ,后面不需要跟 scope*/
FALSE /* 静态参数,不能直接修改到内存, alter system set <> = <> scope = spfile*/
DEFERRED /* 会话级别参数,直接通过 alter session set <> = <>*/
SQL > select distinct isses_modifiable from v$parameter ;
ISSES
-----
TRUE
FALSE
-- 系统中的常用参数:
SQL > ho ls / u01 / app / oracle / 10g / dbs /
hc_orcl . dat initdw . ora lkORCL spfileorcl . ora
init . ora initorcl . ora orapworcl
SQL > ho cat / u01 / app / oracle / 10g / dbs / initorcl . ora
/* 下面的参数描述了实例相关池的分配情况 */
orcl . __db_cache_size = 251658240
orcl . __java_pool_size = 4194304
orcl . __large_pool_size = 4194304
orcl . __shared_pool_size = 142606336
orcl . __streams_pool_size = 0
*. audit_file_dest = '/u01/app/oracle/admin/orcl/adump' /* 警告日志路径 */
*. background_dump_dest = '/u01/app/oracle/admin/orcl/bdump' /* 后台进程日志路径 */
*. compatible = '10.2.0.1.0' /* 版本兼容号 */
/* 下面是控制文件的信息 */
*. control_files = '/u01/app/oracle/oradata/orcl/control01.ctl' , '/u01/app/oracle/oradata/orcl/control02.ctl' , '/u01/app/oracle/oradata/orcl/control03.ctl'
*. core_dump_dest = '/u01/app/oracle/admin/orcl/cdump' /* 服务器进程相关的日志路径 */
*. db_block_size = 8192 /* 内存块的大小 */
*. db_create_file_dest = '/u01/app/oracle/oradata/orcl' /*tablespace ,datafile 路径 */
*. db_create_online_log_dest_1 = '/u01/app/oracle/disk1' /* 联机日志文件路径 */
*. db_create_online_log_dest_2 = '/u01/app/oracle/disk2' /* 联机日志文件路径 */
*. db_domain = '' / 域名 /
*. db_file_multiblock_read_count = 16 /* 一次可读取块的大小: *8k = 128kb*/
*. db_name = 'orcl' / 数据库标识符 /
*. db_recovery_file_dest = '/u01/app/oracle/flash_recovery_area' /* 闪回路径 */
*. db_recovery_file_dest_size = 2147483648 /* 闪回区可使用的大小 GB*/
*. dispatchers = '(PROTOCOL=TCP) (SERVICE=orclXDB)' /* 共享服务器的配置参数 */
*. job_queue_processes = 10 /* 当前作业进程数 */
*. open_cursors = 600 /* 可打开的游标数 */
*. pga_aggregate_target = 135266304 /* 服务器进程大小 */
*. processes = 250 /* 描述当前可以运行的进程数 */
*. remote_login_passwordfile = 'EXCLUSIVE' /* 远程登陆是否要用密码文件 */
*. sga_target = 406847488 /* 定义了 sga 的大小 */
*. undo_management = 'AUTO' /*Undo 表空间的管理方式为自动管理 */
*. undo_tablespace = 'UNDOTBS1' /* 指定使用哪一个 undo 表空间 */
*. user_dump_dest = '/u01/app/oracle/admin/orcl/udump' /**/
--11g 中的参数文件:
-- 隐藏参数:
SQL > desc x$ksppi /*Name 列中为隐藏参数的名字 */
Name Null ? Type
----------------------------------------- -------- ----------------------------
ADDR RAW ( 4 )
INDX NUMBER
INST_ID NUMBER
KSPPINM VARCHAR2 ( 80 )
KSPPITY NUMBER
KSPPDESC VARCHAR2 ( 255 )
KSPPIFLG NUMBER
KSPPILRMFLG NUMBER
KSPPIHASH NUMBER
-- 下面视图中为隐藏参数的值
SQL > desc x$ksppcv
Name Null ? Type
----------------------------------------- -------- ----------------------------
ADDR RAW ( 4 )
INDX NUMBER
INST_ID NUMBER
KSPPSTVL VARCHAR2 ( 512 )
KSPPSTDVL VARCHAR2 ( 512 )
KSPPSTDF VARCHAR2 ( 9 )
KSPPSTVF NUMBER
KSPPSTCMNT VARCHAR2 ( 255 )
-- 使用下面的命令来查看系统中的隐藏参数 ;
SQL > select ksppinm , ksppstvl from x$ksppi a , x$ksppcv b where a . indx = b . indx ;
SQL > a and ksppinm like '%_allow%' ;
1 * select ksppinm , ksppstvl from x$ksppi a , x$ksppcv b where a . indx = b . indx and ksppinm like '%_allow%'
SQL > /
KSPPINM KSPPSTVL
---------------------------------------- ----------
_allow_level_without_connect_by FALSE
_asm_allow_only_raw_disks TRUE
_asm_allow_resilver_corruption FALSE
/*
参数的删除:
对于 pfile 直接编辑删除即可
对于 spfile 例如使用 alter system set pga_aggregate_target reset 将恢复到默认值 */
SQL > show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 130M
SQL > alter system reset pga_aggregate_target scope = spfile sid = '*' ;
System altered .
-- 修改会默认值后重新启动可以看到该参数的值由 M 变为 M
SQL > show parameter pga ;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 76M
/*
更多 */
使用 OEM,SQL*Plus,iSQL*Plus 管理 Oracle 实例
Oracle 实例和 Oracle 数据库 (Oracle 体系结构 )