1、参数文件的作用
参数文件用于存放实例所需要的初始化参数,因为多数初始化参数都具有默认值,所以参数文件实际存放了非默认的初始化参数。
2、参数文件类型
1)服务端参数文件,又称为 spfile
二进制的文件,命名规则为:spfile+sid.ora
如: spfileorcl.ora
2)静态参数文件,又称为 pfile
文本文件,命名规则为:init+sid.ora
如: Iinitorcl.ora
注意事项:
由于服务端参数文件是二进制的文件,使用vim打开看到的是乱乱的内容,此时切记不可使用:wq
保存退出,否则服务端参数文件会损坏。
3、参数文件的位置
SQL > show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/19.3.0/db_1/dbs/spfileorcl.ora
进入 /u01/app/oracle/product/19.3.0/db_1/dbs/路径查看当前有哪些参数文件
# cd /u01/app/oracle/product/19.3.0/db_1/dbs/
# ls
hc_mydb.dat hc_orcl.dat init.ora lkORCL orapworcl spfileorcl.ora
hc_oradb.dat hc_prod.dat lkMYDB lkPROD orapwprod spfileprod.ora
- 有两个服务端参数文件(该服务器安装了两个数据库):spfileorcl.ora spfileprod.ora
- 没有静态参数文件
4.创建参数文件
4.1 创建静态参数文件
(1)orcl数据库在默认路径下创建静态参数文件
SYS@orcl(CDB$ROOT)> create pfile from spfile;
File created.
或:
SYS@orcl(CDB$ROOT)> create pfile from memory;
File created.
执行上述命令之一后再次查看,可看到新建的静态参数文件 initorcl.ora
# cd /u01/app/oracle/product/19.3.0/db_1/dbs/
# ls
hc_mydb.dat hc_orcl.dat init.ora lkMYDB lkPROD orapwprod spfileprod.ora
hc_oradb.dat hc_prod.dat initorcl.ora lkORCL orapworcl spfileorcl.ora
--查看服务端参数文件格式(二进制)
# file spfileorcl.ora
spfileorcl.ora: data
--查看静态参数文件格式(文本文件)
# file initorcl.ora
initorcl.ora: ASCII text
(2)在指定路径下创建静态参数文件
SQL> create pfile='/home/oracle/init.ora' from spfile;
或
SQL> create pfile='/home/oracle/init.ora' from memory;
4.2 创建服务端参数文件
(1)在默认路径下创建服务端参数文件
SYS@orcl(CDB$ROOT)> create spfile from pfile;
File created.
注意事项:
若当前数据库正在使用服务端参数文件,则无法在默认路径创建服务端参数文件。
SYS@orcl(CDB$ROOT)> create spfile from pfile;
create spfile from pfile
*
ERROR at line 1:
ORA-32002: cannot create SPFILE already being used by the instance
(2)在指定路径下创建服务端参数文件
SQL> create spfile='/home/oracle/spfile.ora' from pfile;
SQL> create spfile='/home/oracle/spfile_memory.ora' from memory;
5、参数文件使用顺序
- 优先使用 spfile
- 当 spfile 不存在或出错使用 pfile
- 当 pfile 也不存在或出错,数据库不能正常启动。
6、如何判断数据库使用的是 SPFILE 还是 PFILE 呢
SYS@orcl(CDB$ROOT)> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/19.3.0/db_1/dbs/spfileorcl.ora
这里通过VALUE的值,可以知道使用的是服务器参数文件spfileorcl.ora,若VALUE值为空,说明使用的是静态参数文件。
7、参数查看
(1)方法一:使用show命令
--查看所有参数
SQL> show parameter
--查询含有特定关键字的参数
----如查看含有undo关键字的参数
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
temp_undo_enabled boolean FALSE
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
--查看指定参数
SQL> show parameter 参数名
----如查看参数undo_tablespace
SQL> show parameter undo_tablespace
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace string UNDOTBS1
(2)方法二:查询数据字典v$parameter
--查看所有参数
SQL> select NAME,VALUE from v$parameter;
--查看含有特定关键字的参数
----如查看含有undo关键字的参数
SQL> select NAME,VALUE from v$parameter where NAME like '%undo%';
--查看指定参数
----如查看参数undo_tablespace
SQL> select NAME,VALUE from v$parameter where NAME = 'undo_tablespace';
8、参数修改
1)alter session
当前会话生效,新开的会话或重启数据库参数值不生效。
例:
SQL> alter session set sql_trace=true;
2)alter system
当前会话生效,新开的会话或重启数据库会参数值都生效。
例:
SQL> alter system set sql_trace=true;
3)ALTER SYSTEM ……… deferred
当前会话不生效,新开的会话或重启数据库会参数值生效。
例:
SQL> alter system set sort_area_size=75536 deferred;
注:当前窗口的参数值不生效,另外打开一个窗口后,参数值生效。
4)重置参数值
例:
SQL> alter system reset optimizer_mode;
5)加选项 scope=spfile|memory|both
例:
SQL> alter system set optimizer_mode=all_rows scope=spfile;
SQL> alter system set optimizer_mode=all_rows scope=memory;
SQL> alter system set optimizer_mode=all_rows scope=both;
SQL> alter system set optimizer_mode=all_rows;
注:
- 对静态参数的修改,需要指定 scope=spfile 选项, 需要重启数据库才生效 。
- 默认选项为both
关于参数修改的更多内容可参看文章:《Oracle 参数文件 & 参数详解》
9、CDB参数 & PDB参数
CDB 参数文件使用 12c 以前的 SPIFLE,pdb 参数文件不出现在 SPFILE 中,而是从CDB 中继承。
SYS@orcl(CDB$ROOT)> show con_name
CON_NAME
------------------------------
CDB$ROOT
SYS@orcl(CDB$ROOT)> select pdb_uid,name,value$ from PDB_SPFILE$;
no rows selected
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300
SYS@orcl(CDB$ROOT)> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB READ WRITE NO
SYS@orcl(CDB$ROOT)> alter session set container=pdb;
Session altered.
SYS@orcl(CDB$ROOT)> show con_name
CON_NAME
------------------------------
PDB
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300
如果 PDB 中有私有本地参数,则会保存在 CDB 的 PDB_SPFILE$字典表中,并以 con_id 区别。
SYS@orcl(CDB$ROOT)> alter system set open_cursors=400;
System altered.
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 400
SYS@orcl(CDB$ROOT)> conn / as sysdba
Connected.
SYS@orcl(CDB$ROOT)> show con_name
CON_NAME
------------------------------
CDB$ROOT
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 300
SYS@orcl(CDB$ROOT)> select pdb_uid,name,value$ from PDB_SPFILE$;
PDB_UID NAME VALUE$
--------------------------------------------------------------------------------
1767828969 open_cursors 400
当 PDB UN-Plug 时,PDB 参数写入 PDB 的 XML 文件中:
SYS@orcl(CDB$ROOT)> alter pluggable database pdb close immediate;
Pluggable database altered.
SYS@orcl(CDB$ROOT)> alter pluggable database pdb unplug into '/home/oracle/pdb.xml';
Pluggable database altered.
# cat /home/oracle/pdb.xml
会看到PDB 修改的参数已写入 PDB 的 XML 文件中。
当 droppluggable database 后,pdb 和 PDB_SPFILE$信息记录会被清除。
SYS@orcl(CDB$ROOT)> drop pluggable database pdb keep datafiles;
Pluggable database dropped.
SYS@orcl(CDB$ROOT)> select pdb_uid,name,value$ from PDB_SPFILE$;
no rows selected
当PDB重新 Plug-in到CDB时会重新加载回PDB, 但是由于一些PDB参数特殊原因在plug-in时会被遗弃。这里因为没有特殊参数,所以没有丢失参数。
SYS@orcl(CDB$ROOT)> create pluggable database pdb using '/home/oracle/pdb.xml' nocopy;
Pluggable database created.
SYS@orcl(CDB$ROOT)> select pdb_uid,name,value$ from PDB_SPFILE$;
PDB_UID NAME VALUE$
--------------------------------------------------------------------------------
2365777561 open_cursors 400
SYS@orcl(CDB$ROOT)> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 PDB MOUNTED
SYS@orcl(CDB$ROOT)> alter pluggable database pdb open;
Pluggable database altered.
SYS@orcl(CDB$ROOT)> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 PDB READ WRITE NO
删除 PDB_SPFILE$中相关记录,pdb 的参数值会自动继续继承 cdb 中参数值(重启生效)。
SYS@orcl(CDB$ROOT)> alter system set open_cursors=500;
System altered.
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 500
SYS@orcl(CDB$ROOT)> alter session set container=pdb;
Session altered.
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 400
SYS@orcl(CDB$ROOT)> shutdown immediate
Pluggable Database closed.
SYS@orcl(CDB$ROOT)> startup
Pluggable Database opened.
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 400
SYS@orcl(CDB$ROOT)> delete from PDB_SPFILE$;
1 row deleted.
SYS@orcl(CDB$ROOT)> alter session set container=pdb;
Session altered.
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 400
SYS@orcl(CDB$ROOT)> shutdown immediate
Pluggable Database closed.
SYS@orcl(CDB$ROOT)> startup
Pluggable Database opened.
SYS@orcl(CDB$ROOT)> show parameter open_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
open_cursors integer 500