基础知识单薄的同学,请逐字逐句阅读以下概念,来自于博客园AskScuti。
预备知识:什么是参数文件、存放位置、参数文件的分类和参数文件的命名方式、参数文件如何创建、参数文件加载顺序、参数分类、参数修改级别、参数修改scope选项。
《跟我记-AskScuti:8句话让你彻底搞定参数文件及参数》:Oracle中有很多晦涩难懂的理论,无法通过比较严谨的方式把知识点以白话呈现,以下理论知识点术语可能不够严谨,但可以帮助你理解和记忆,至少是正确的,以下8条,最好全部背下来,一遍不行,来十遍,十遍不行,来一百遍,没废话。
1. 参数文件是数据库启动过程中,第一步( 第一阶段 nomount )要加载的文件(请回顾startup启动的三个阶段:nomount 阶段:加载参数文件 / mount 阶段:加载控制文件 / open 阶段:打开数据文件和日志文件),目的就是为了根据参数文件里面定义的参数值开辟SGA和后台进程(就是实例,回顾实例包含哪两个部分?分别是什么?实例包含两个部分,分别是:SGA和一系列后台进程),并为数据库启动到第二阶段 mount 状态做好准备(因为参数文件里面定义了控制文件的路径,而控制文件里面有指定了数据文件和日志文件的路径,就为第三阶段 open 打开数据库奠定了基础)。
2. 参数文件存放的具体路径位置为(Linux):$ORACLE_HOME/dbs/目录下,完整路径(根据实际情况来):/u01/app/oracle/product/11.2.0/dbhome_1/dbs/
3. 参数文件分为两大类:静态参数文件、动态参数文件;静态参数文件,我们称之为PFILE、动态参数文件我们称之为SPFILE(Server Parameter File);静态参数文件PFILE的命名方式为 init<SID>.ora(比如 initPROD1.ora)、动态参数文件SPFILE的命名方式为 spfile<SID>.ora(比如 spfilePROD1.ora)。注意:基础不好的同学,第3条读10遍,抄10遍,背下来,因为这条很重要!最后,我们是以11g版本及之后版本来讲解,且是单实例,所以在此,我们不去讨论 init.ora 这个静态模板参数文件,因为它对我们来说,没用。
4. 静态参数文件 init<SID>.ora 为文本文件,可以采用系统命令查看和修改,动态参数文件 spfile<SID>.ora 为二进制文件,无法通过系统命令查看和修改;他们两者可以通过对方进行互相创建,也可以通过内存memory进行创建。
例如:
通过静态参数文件pfile创建动态参数文件spfile:create spfile from pfile;
通过动态参数文件spfile创建静态参数文件pfile:create pfile from spfile;
通过内存memory创建动态参数文件spfile:create spfile from memory;
通过内存memory创建静态参数文件pfile:create pfile from memory;
5. 最后,请记好,在11g单实例中,数据库启动寻找参数文件的顺序为 :先找动态参数文件 spfile<SID>.ora,如果找不到,自动去找静态参数文件 init<SID>.ora,如果还没找到,报错!听好,没有第三条路!12c 版本中的CDB依然按照这个路子走。
由于我们本篇内容是介绍12c参数更改的影响,对于以上5条参数文件的相关证明,我将在其它博文进行介绍,之后博文链接在此处更新。
上面5条说的是参数文件,而接下来这3条,说的是参数文件里面的参数分类、参数修改级别和参数修改的SCOPE选项,同等重要。
6. 我先说一句错的,看好,这句话是错的:X静态参数文件里面存的都是静态参数,而动态参数文件里面存的是动态参数X。正确的应该是:不管是动态参数文件还是静态参数文件,里面存的内容一致,只是存储方式不同而已,换句话说,不管是什么类型的参数文件,里面存的都有动态参数和静态参数,动态参数可以在内存和spfile文件中修改,而静态参数无法在内存中修改,只能在spfile文件中修改。
7. 参数修改级别分为两类:系统级 system 和会话级 session ,可以通过动态性能视图(动态数据字典)v$parameter 的两个字段 isses_modifiable 和 issys_modifiable 来确定哪些参数可以在系统级修改,哪些参数可以在会话级修改。
8. 参数修改scope选项一共有3个:scope=both(默认值,可以不带)表示同时在内存 memory 和 spfile 文件中修改,实时生效,重启也生效;scope=spfile 表示当前内存 memory 里不修改,只在 spfile 文件中修改,必须重启才能生效;scope=memory 表示只在当前内存 memory 里修改,spfile 文件中不修改,实时生效,重启失效。
由于我们本篇内容是介绍12c参数更改的影响,对于以上3条参数的相关证明,我将在其它博文进行介绍,之后博文链接在此处更新。
9. 可记可不记,小技巧而已,对于有些同学纠结于到底哪些参数是静态参数?哪些是动态参数?没必要去记,实际工作过程中,修改某个参数,直接不带scope选项,如果报错,说明该参数为静态参数,否则为动态参数。你,反应过来了吗?如果不明白,请参考上面第6条和第8条。
目录
1. CDB级别与PDB级别共用一个SPFILE文件
1.1 CDB级别使用的参数文件
1.2 PDB级别使用的参数文件
2. CDB级别修改参数是否影响到PDB级别?
2.1 CDB级别修改某参数
2.2 PDB级别查看参数值
3. PDB级别修改参数是否影响到CDB级别?
3.1 PDB级别修改参数
3.2 CDB级别查看参数
4. CDB级别与PDB级别总结说明
1. CDB级别与PDB级别共用一个SPFILE文件
1.1 CDB级别使用的参数文件
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBPROD1 READ WRITE NO
4 HRPDB READ WRITE NO
5 SALESPDB READ WRITE NO
SQL> show parameter spfile
NAME TYPE VALUE
------ -------- -------------------------------------------------------
spfile string /u01/app/oracle/product/12.2.0/db_1/dbs/spfilePROD1.ora
一个CDB使用一个SPFILE动态参数文件,具体路径在$ORACLE_HOME下的dbs目录下。
1.2 PDB级别使用的参数文件
SQL> alter session set container=pdbprod1;
Session altered.
SQL> show parameter spfile
NAME TYPE VALUE
------ -------- -------------------------------------------------------
spfile string /u01/app/oracle/product/12.2.0/db_1/dbs/spfilePROD1.ora
可以看到,在PDB级别使用的也是一样的SPFILE,PDB级别所有数据库默认继承CDB级别的参数。
2. CDB级别修改参数是否影响到PDB级别?
2.1 CDB级别修改某参数
SQL> alter session set container=cdb$root;
Session altered.
SQL> alter system set undo_retention=1000 container=all scope=both;
System altered.
注意语句中的 container=all scope=both ,这是默认值,可以不带。就是将CDB级别中的 undo_retention 参数值更改为1000,并作用于所有PDB(继承),且即时生效(Memory),重启(Spfile)也生效。
2.2 PDB级别查看参数值
SQL> alter session set container=hrpdb;
Session altered.
SQL> show parameter undo_retention
NAME TYPE VALUE
-------------- -------- -----
undo_retention integer 1000
切换到HRPDB数据库中,发现参数值也跟着更改了,因为是继承CDB参数值,所以,CDB级别更改参数会影响到PDB级别(什么时候不影响,在后面)。
3. PDB级别修改参数是否影响到CDB级别?
3.1 PDB级别修改参数
SQL> alter session set container=hrpdb;
Session altered.
SQL> show con_name
CON_NAME
--------
HRPDB
SQL> alter system set undo_retention=2000;
System altered.
SQL> show parameter undo
NAME TYPE VALUE
----------------- -------- --------
temp_undo_enabled boolean TRUE
undo_management string AUTO
undo_retention integer 2000
undo_tablespace string UNDOTBS1
切换到HRPDB数据库中,单独修改参数undo保留时间为 2000 秒,再次查看。然后切回到CDB级别,查看是否会有影响。
3.2 CDB级别查看参数
SQL> alter session set container=cdb$root;
Session altered.
SQL> show parameter undo
NAME TYPE VALUE
----------------- -------- --------
temp_undo_enabled boolean TRUE
undo_management string AUTO
undo_retention integer 1000
undo_tablespace string UNDOTBS1
切换到CDB发现参数没有改变,依然是 1000,所以,单独修改某PDB参数,不会影响到CDB级别及其它PDB。
4. CDB级别与PDB级别总结说明
请思考:目前的情况是CDB级别及其它PDB(除了HRPDB)参数值为 1000,HRPDB为2000,如果重启HRPDB,参数是否会失效?
SQL> alter pluggable database hrpdb close immediate;
Pluggable database altered.
SQL> alter pluggable database hrpdb open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- --------- ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDBPROD1 READ WRITE NO
4 HRPDB READ WRITE NO
5 SALESPDB READ WRITE NO
SQL> alter session set container=hrpdb;
Session altered.
SQL> show parameter undo
NAME TYPE VALUE
----------------- -------- --------
temp_undo_enabled boolean TRUE
undo_management string AUTO
undo_retention integer 2000
undo_tablespace string UNDOTBS1
重启HRPDB后,参数没有失效(因为在3.1中修改语句没有scope选项,所以默认就是both),但PDB是继承CDB中的参数,CDB参数值为 1000,它是如何保证参数的独立特殊性?引出系统表 pdb_spfile$ 。
需要说明的是,这个 pdb_spfile$ 系统表在CDB和PDB级别都存在,但是针对PDB所做的独立特殊性更改(scope=both 或 scope=spfile),都会写入到CDB级别的 pdb_spfile$ 系统表中(PDB级别的 pdb_spfile$ 没用),如果 scope 选项为 memory,则PDB在重启后参数失效,也不会写入 CDB 级别的 pdb_spfile$ 系统表中(和11g一样)。
SQL> alter session set container=cdb$root;
Session altered.
SQL> select pdb_uid,sid,name,comment$,value$ from pdb_spfile$;
PDB_UID SID NAME COMMENT$ VALUE$
------------ --- -------------- -------- ----------
1104103499 * undo_retention 2000
通过 CDB 级别的 pdb_spfile$ 看到,保存着 PDB_UID 为 1104103499 的数据库更改的参数值,可以和 v$pdbs 动态数据字典相关联,查出具体的数据库。
SQL> select a.pdb_uid,b.name,a.sid,a.name,a.comment$,a.value$
from pdb_spfile$ a
left join
v$pdbs b on a.pdb_uid=b.dbid;
PDB_UID NAME SID NAME COMMENT$ VALUE$
------------ ----- ---- -------------- -------- ------
1104103499 HRPDB * undo_retention 2000
也就是说,如果 pdb_spfile$ 系统表中存在着某些 PDB 独有的参数,那么 PDB 优先参照 pdb_spfile$ 的参数(不会再去继承CDB级别参数),如果将表清空,则 PDB 自动继承 CDB 级别的参数。
SQL> delete from pdb_spfile$;
1 row deleted.
SQL> commit;
Commit complete.
SQL> alter pluggable database hrpdb close immediate;
Pluggable database altered.
SQL> alter pluggable database hrpdb open;
Pluggable database altered.
SQL> alter session set container=hrpdb;
Session altered.
SQL> show parameter undo
NAME TYPE VALUE
----------------- -------- --------
temp_undo_enabled boolean TRUE
undo_management string AUTO
undo_retention integer 1000
undo_tablespace string UNDOTBS1
最后,PDB级别中从哪些参数可以被修改,是有规则的,要根据动态性能视图(数据字典) v$parameter 中的列 ispdb_modifiable 是否为 true 而定(列值为 true 的,才能在 PDB 级别进行特殊性修改)。
SQL> select name,ispdb_modifiable from v$parameter where name like '%undo%';
NAME ISPDB_MODIFIABLE
----------------- ----------------
temp_undo_enabled TRUE
undo_management TRUE
undo_tablespace TRUE
undo_retention TRUE
来源:oschina
链接:https://my.oschina.net/u/4394215/blog/3535275