zoukankan      html  css  js  c++  java
  • Oracle 12c中CDB与PDB实例参数更改影响实验

    基础知识单薄的同学,请逐字逐句阅读以下概念,来自于博客园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
  • 相关阅读:
    选择排序
    冒泡排序
    排序算法
    排序的稳定性
    散列表查找的代码实现
    处理散列冲突的方法
    jQuery 实时监听input
    PhpStorm
    Memcache 学习
    豆瓣第三方登录
  • 原文地址:https://www.cnblogs.com/askscuti/p/10878906.html
Copyright © 2011-2022 走看看