1、参数文件的相关概念
1.1 概念
参数文件记录了 Oracle 数据库的基本参数信息,包括数据库名、控制文件所在路径等。参数文件也是 Oracle 数据库较为重要的一种文件结构。
1.2 参数文件的分类
1.2.1 spfile
spfile(Server Parameter File):服务器参数文件,文件格式为二进制格式,不能使用文本编辑器修改,可以使用 alter system 命令修改文件中的参数值,可以使用 strings 命令查看其内容。
spfile 参数文件的默认名称为:spfile.ora
文件路径为:$ORACLE_HOME/dbs。
[oracle@node1 db]$ cd $ORACLE_HOME/dbs
[oracle@node1 dbs]$ ll
总用量 116936
-rw-r----- 1 oracle oinstall 10715136 12月 23 16:06 c-1651659091-20221223-00
-rw-r----- 1 oracle oinstall 10715136 12月 23 20:36 c-1651659091-20221223-01
-rw-r----- 1 oracle oinstall 10715136 1月 12 15:24 c-1651659091-20230112-00
-rw-r----- 1 oracle oinstall 10715136 1月 12 15:37 c-1651659091-20230112-01
-rw-r----- 1 oracle oinstall 11042816 1月 12 19:05 c-1651659091-20230112-02
-rw-r----- 1 oracle oinstall 10715136 1月 12 15:56 c-1651659091-20230112-03
-rw-r----- 1 oracle oinstall 11042816 1月 12 19:12 c-1651659091-20230112-04
-rw-r----- 1 oracle oinstall 11042816 1月 13 11:37 c-1651659091-20230113-00
-rw-r----- 1 oracle oinstall 11042816 1月 13 11:52 c-1651659091-20230113-01
-rw-r----- 1 oracle oinstall 11042816 1月 30 10:49 c-1651659091-20230130-00
-rw-rw---- 1 oracle oinstall 1544 1月 31 13:27 hc_orcl.dat
-rw-r--r-- 1 oracle oinstall 3079 5月 14 2015 init.ora
-rw-r----- 1 oracle oinstall 24 1月 31 12:58 lkMYDB
-rw-r----- 1 oracle oinstall 24 1月 12 13:04 lkORCL
-rw-r----- 1 oracle oinstall 2048 12月 19 20:28 orapworcl
-rw-r----- 1 oracle oinstall 10928128 1月 30 10:49 snapcf_orcl.f
-rw-r----- 1 oracle oinstall 3584 1月 31 13:27 spfileorcl.ora
1.2.2 pfile
pfile(Initialization Parameters File): 初始化参数文件,文件格式为文本格式,可以使用文本编辑器修改其中的参数内容。
pfile 默认的名称为:init.ora
文件路径为:$ORACLE_HOME/dbs。
[oracle@node1 db]$ cd $ORACLE_HOME/dbs
[oracle@node1 dbs]$ ll
总用量 116936
-rw-r----- 1 oracle oinstall 10715136 12月 23 16:06 c-1651659091-20221223-00
-rw-r----- 1 oracle oinstall 10715136 12月 23 20:36 c-1651659091-20221223-01
-rw-r----- 1 oracle oinstall 10715136 1月 12 15:24 c-1651659091-20230112-00
-rw-r----- 1 oracle oinstall 10715136 1月 12 15:37 c-1651659091-20230112-01
-rw-r----- 1 oracle oinstall 11042816 1月 12 19:05 c-1651659091-20230112-02
-rw-r----- 1 oracle oinstall 10715136 1月 12 15:56 c-1651659091-20230112-03
-rw-r----- 1 oracle oinstall 11042816 1月 12 19:12 c-1651659091-20230112-04
-rw-r----- 1 oracle oinstall 11042816 1月 13 11:37 c-1651659091-20230113-00
-rw-r----- 1 oracle oinstall 11042816 1月 13 11:52 c-1651659091-20230113-01
-rw-r----- 1 oracle oinstall 11042816 1月 30 10:49 c-1651659091-20230130-00
-rw-rw---- 1 oracle oinstall 1544 1月 31 13:27 hc_orcl.dat
-rw-r--r-- 1 oracle oinstall 3079 5月 14 2015 init.ora
-rw-r----- 1 oracle oinstall 24 1月 31 12:58 lkMYDB
-rw-r----- 1 oracle oinstall 24 1月 12 13:04 lkORCL
-rw-r----- 1 oracle oinstall 2048 12月 19 20:28 orapworcl
-rw-r----- 1 oracle oinstall 10928128 1月 30 10:49 snapcf_orcl.f
-rw-r----- 1 oracle oinstall 3584 1月 31 13:27 spfileorcl.ora
1.3 实例启动时查找参数文件的顺序
Oracle 实例启动时查找参数文件的顺序:Oracle 首先在默认目录中查找名为 spfile<$ORACLE_SID>.ora的文件,如果没有则查找spfile.ora 文件,如果还没有,继续查找 init<$ORACLE_SID>.ora 文件。
Oracle 数据库根据 SPFILE 或 PFILE 中设置的参数来配置数据库的启动。Oracle 实例在启动时,会去读取参数文件中的配置:数据库的 startup 命令中可以指定以哪个 pfile 来启动(startup 命令只能指定 pfile,不能指定 spfile)。如果使用不带 pfile 子句的 startup 命令,Oracle 将从默认位置的 spfile 文件中读取初始化参数。
1.4 查看启动实例时所使用的参数文件
SQL> show parameter p
file;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /app/oracle/product/19.3.0/db/dbs/spfileorcl.ora
SQL> SELECT INST_ID,NAME,VALUE FROM GV$PARAMETER WHERE NAME LIKE '%pfile%';
INST_ID NAME VALUE
---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
1 spfile /app/oracle/product/19.3.0/db/dbs/spfileorcl.ora
可以看出 oracle 启动实例时使用的是 spfile 参数文件
2、Oracle 参数的分类
根据参数的生效时间,Oracle 参数可以分为两类:静态参数和动态参数。
2.1 动态参数
可以在数据库运行时修改参数值并且立即生效的参数。
2.2 静态参数
内存中的当前值不能被修改,只能在参数文件中修改,且数据库必须要重启才能生效的参数。
2.3 如何区分动态参数和静态参数
Oracle 在视图 V$PARAMETER 中提供了一个列 ISSYS_MODIFIABLE,
如果该列的值为 IMMEDIATE 代表该参数为动态参数,且修改后立即生效;
如果该列的值为 DEFERRED 代表该参数为动态参数,但参数值修改后不会立即生效,只有在新连接的会话中生效;
如果该列的值为 FALSE 代表该参数为静态参数。
3、查看 Oracle 参数
查询 Oracle 参数的方法如下:
3.1 使用 show parameters 命令
该命令可以查询当前会话生效的参数。
SQL> show parameter name;
3.2 使用 show spparameters 命令
该命令可以查询当前会话生效的 spfile 参数,参数的取值来源于spfile参数文件。
SQL> show spparameter name;
4、参数文件的创建
使用 create pfile 命令
此方法可以将 spfile 或当前内存中设置的参数保存到 pfile 文件中,pfile 文件是文本文件,可以直接打开进行查看。这种方法列出的参数都是用户设置的参数,不包括默认值参数。
4.1 将spfile参数文件中设置的参数保存到pfile文件
SQL> create pfile = '/home/oracle/aaa.ora' from spfile;
File created.
4.2 将当前内存中设置的参数保存到pfile文件
SQL> create pfile = '/home/oracle/bbb.ora' from memory;
File created.
5、参数文件相关视图的查询
5.1 查看 v$parameter 视图
v$parameter视图提供了当前会话可见的初始化参数的取值,如果要查询rac数据库的 所有实例的设置,可以查询gv$parameter 视图提供了当前会话可见的初始化参数的取值,
SQL> select name,value,issys_modifiable from v$parameter where name like 'instance%';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
instance_abort_delay_time 0 IMMEDIATE
instance_groups FALSE
instance_type RDBMS FALSE
instance_mode READ-WRITE FALSE
instance_number 0 FALSE
instance_name orcl FALSE
6 rows selected
5.2 查看 v$system_parameter 视图
v$systemparameter 视图提供了当前实例生效的初始化参数的取值,如果要查询rac数据库的所有实例的设置,可以查询 gv$system_parameter 视图提供了当前实例生效的初始化参数的取值
SQL> select name,value,issys_modifiable from v$system_parameter where name like 'instance%';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
instance_abort_delay_time 0 IMMEDIATE
instance_groups FALSE
instance_type RDBMS FALSE
instance_mode READ-WRITE FALSE
instance_number 0 FALSE
instance_name orcl FALSE
6 rows selected
5.3 查看 v$spparameter 视图
v$spparameter视图提供了来自spfile文件中初始化参数的取值,如果参数在spfile文件中没有设置,字段isspecified对应的值为false 。 如果要查询 rac 数据库的所有实例的设置,可以查询gv$spparameter视图
SQL> select name,value,isspecified from v$spparameter where name like 'instance%';
NAME VALUE ISSPECIFIED
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----------
instance_abort_delay_time FALSE
instance_groups FALSE
instance_type FALSE
instance_mode FALSE
instance_number FALSE
instance_name FALSE
6 rows selected
5.4 查看 v$spparameter2 视图
v$spparameter2和v$spparameter 视图相似,唯一的区别在于对于包含多值的初始化参数,v$spparameter2视图会返回多条记录 。对于 rac 环境可以查询 gvspparameter2视图会返回多条记录。对于rac环境可以查询gvspparameter2 视图。
SQL> select name,value,issys_modifiable from v$parameter where name like '%files%';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
filesystemio_options none FALSE
control_files /app/oracle/oradata/ORCL/control01.ctl, /app/oracle/oradata/ORCL/control02.ctl FALSE
db_files 200 FALSE
session_max_open_files 10 FALSE
SQL> select name,value,issys_modifiable from v$parameter2 where name like '%files%';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
filesystemio_options none FALSE
control_files /app/oracle/oradata/ORCL/control01.ctl FALSE
control_files /app/oracle/oradata/ORCL/control02.ctl FALSE
db_files 200 FALSE
session_max_open_files 10 FALSE
5.5 查看非默认值参数
SQL> select name,value from v$parameter where isdefault <> 'TRUE';
NAME VALUE
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
processes 1500
nls_language SIMPLIFIED CHINESE
nls_territory CHINA
sga_target 8002732032
control_files /app/oracle/oradata/ORCL/control01.ctl, /app/oracle/oradata/ORCL/control02.ctl
db_block_size 8192
compatible 19.0.0
log_archive_dest_1 location=/app/archive
log_archive_format orcl_%d_%S_%t_%r.dbf
undo_tablespace UNDOTBS1
remote_login_passwordfile EXCLUSIVE
db_domain x88.com
dispatchers (PROTOCOL=TCP) (SERVICE=orclXDB)
audit_file_dest /app/oracle/admin/orcl/adump
audit_trail DB
db_name orcl
open_cursors 300
pga_aggregate_target 2667577344
diagnostic_dest /app/oracle
19 rows selected
6、设置 Oracle 参数的值
说明:
(1)在 RAC 环境中,要修改所有实例,可以在 ALTER SYSTEM 的最后加上 SID='*',要更改某一个实例, 在命令的结尾加上 SID='实例名'
(2)ALTER SESSION:修改的参数只限于本次会话,退出会话再进入时修改失效
(3)ALTER SYSTEM:修改的参数适用于数据库实例的所有会话,数据库关闭则修改失效
(4)ALTER SYSTEM DEFERRED:修改是延迟修改,退出会话,下次进入会话时生效
(5)scope = spfile:修改只对 spfile 参数文件有效,对于动态参数和静态参数都是数据库重启时有效。
(6)scope = memory:修改只对内存有效,对于动态参数修改后立即生效,数据库重启后失效。静态参数不允许使用该选项。
(7)scope = both:修改对 spfile 参数文件和内存都生效。对于动态参数修改后立即生效,数据库重启后失效。静态参数不允许使用该选项。
初始化参数的设置方法有以下几种:
6.1 值修改内存中的值
ALTER SYSTEM/SESSION SET 参数名=参数值 SCOPE = MEMORY SID='*';
6.2 只修改 SPFILE 中的值
ALTER SYSTEM SET 参数名=参数值 SCOPE = SPFILE SID='*';
6.3 同时修改 SPFILE 和 MEMORY 中的值(也可以省略 BOTH 关键词)
ALTER SYSTEM SET 参数名=参数值 SCOPE = BOTH SID='*';
6.4 设置延迟生效
修改只对以后连接到数据库的会话生效,而对当前会话以及其它已经连接到 Oracle 的会话不会生效。
ALTER SYSTEM SET 参数名=参数值 DEFERRED SCOPE = SPFILE SID='*';
6.5 动态参数修改举例
6.5.1 动态参数 open_cursors 在内存中的取值
SQL> show parameter open_cursor
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300
6.5.2 动态参数 open_cursors 在 spfile 参数文件中的取值
SQL> show spparameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300
6.5.3 只修改内存值
SQL> alter system set open_cursors = 250 scope = memory sid = '*';
System altered.
SQL> show parameter open_cursor
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 250
SQL> show spparameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300
6.5.4 只修改参数文件中的值
SQL> alter system set open_cursors = 350 scope = memory sid = '*';
System altered.
SQL> show parameter open_cursor
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 250
SQL> show spparameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 350
6.5.5 同时修改内存和参数文件的取值
SQL> alter system set open_cursors = 550 scope = memory sid = '*';
System altered.
SQL> show parameter open_cursor
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 550
SQL> show spparameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 550
6.6 静态参数修改举例
6.6.1 静态参数db_unique_name的取值
SQL> SELECT a.NAME,a.VALUE,a.ISSYS_MODIFIABLE FROM v$parameter a where a.NAME = 'db_unique_name';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
db_unique_name orcl FALSE
SQL> SELECT a.NAME,a.VALUE,a.ISSPECIFIED FROM v$spparameter a where a.NAME = 'db_unique_name';
NAME VALUE ISSPECIFIED
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----------
db_unique_name FALSE
6.6.2 静态参数的内存值不允许修改
SQL> alter system set db_unique_name = 'mydb' scope = memory sid = '*';
alter system set db_unique_name = 'mydb' scope = memory sid = '*'
ORA-02095: 无法修改指定的初始化参数
6.6.3 静态参数的内存值不允许使用 both 选项
SQL> alter system set db_unique_name = 'mydb' scope = both sid = '*';
alter system set db_unique_name = 'mydb' scope = both sid = '*'
ORA-02095: 无法修改指定的初始化参数
6.6.4 静态参数只能在 spfile 参数文件中修改,并且重启数据库才生效
SQL> alter system set db_unique_name = 'mydb' scope = spfile sid = '*';
System altered
SQL> SELECT a.NAME,a.VALUE,a.ISSYS_MODIFIABLE FROM v$parameter a where a.NAME = 'db_unique_name';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
db_unique_name orcl FALSE
SQL> SELECT a.NAME,a.VALUE,a.ISSPECIFIED FROM v$spparameter a where a.NAME = 'db_unique_name';
NAME VALUE ISSPECIFIED
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----------
db_unique_name FALSE
内存中的值没有发生变化
6.6.5 重启数据库(静态参数修改后必须重启数据库才能生效)
SQL> startup force
ORACLE instance started.
Total System Global Area 8002730448 bytes
Fixed Size 8915408 bytes
Variable Size 1308622848 bytes
Database Buffers 6677331968 bytes
Redo Buffers 7860224 bytes
Database mounted.
Database opened.
SQL> SELECT a.NAME,a.VALUE,a.ISSPECIFIED FROM v$spparameter a where a.NAME = 'db_unique_name';
NAME VALUE ISSPECIFIED
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -----------
db_unique_name mydb TRUE
SQL> SELECT a.NAME,a.VALUE,a.ISSYS_MODIFIABLE FROM v$parameter a where a.NAME = 'db_unique_name';
NAME VALUE ISSYS_MODIFIABLE
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------
db_unique_name mydb FALSE
7、pfile 和 spfile 的互相创建
7.1 根据 spfile 创建 pfile
create pfile[='xxxxx'] from spfile[='xxxx'];
7.2 根据内存中的参数值创建 pfile
create pfile[='xxxxx'] from memory;
7.3 根据 pfile 创建 spfile
create spfile[='xxxxx'] from pfile[='xxxx'];
7.4 举例
7.4.1 根据 spfile 创建 pfile
SQL> create pfile = '/home/oracle/pfilefromspfile.ora' from spfile;
File created
7.4.2 根据 memory 创建 pfile
SQL> create pfile = '/home/oracle/pfilefrommemory.ora' from memory;
File created
7.4.3 集群根据pfile创建spfile文件
SQL> create spfile = '+data/spfileorcl1.ora' from pfile = '/home/oracle/pfile001.ora';
File created
7.4.4 单机版根据pfile创建spfile文件
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile = '/home/oracle/pfilefrommemory.ora';
ORACLE instance started.
Total System Global Area 8002730448 bytes
Fixed Size 8915408 bytes
Variable Size 1308622848 bytes
Database Buffers 6677331968 bytes
Redo Buffers 7860224 bytes
Database mounted.
Database opened.
SQL> show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
SQL> create spfile from pfile = '/home/oracle/pfilefromspfile.ora';
File created.
SQL> startup force
ORACLE instance started.
Total System Global Area 8002730448 bytes
Fixed Size 8915408 bytes
Variable Size 1308622848 bytes
Database Buffers 6677331968 bytes
Redo Buffers 7860224 bytes
Database mounted.
Database opened.
SQL> show parameter pfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /app/oracle/product/19.3.0/db/dbs/spfileorcl.ora
8、使用 pfile 启动实例
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup pfile = '/home/oracle/pfilefrommemory.ora';
ORACLE instance started.
Total System Global Area 8002730448 bytes
Fixed Size 8915408 bytes
Variable Size 1308622848 bytes
Database Buffers 6677331968 bytes
Redo Buffers 7860224 bytes
Database mounted.
Database opened.
SQL> show parameter pfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
9、删除参数文件
SQL> alter system reset "background_dump_dest" scope=spfile sid='*';
System altered