代码改变世界

Oracle 12c中CDB与PDB实例参数更改影响实验

2019-05-17 10:22  askscuti  阅读(1356)  评论(0编辑  收藏  举报

基础知识单薄的同学,请逐字逐句阅读以下概念,来自于博客园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