首页 > 代码库 > Oracle12c多租户CDB 与 PDB 参数文件位置探讨、查询 CDB 与 PDB 不同值的参数

Oracle12c多租户CDB 与 PDB 参数文件位置探讨、查询 CDB 与 PDB 不同值的参数


一、 Oracle12c多租户CDB 与 PDB 参数文件位置

CDB的参数文件依然使用12c以前的SPIFLE,pdb的参数文件不会出现在SPFILE中,而是直接从CDB中继承,如果PDB中有privete Local parameter 会存在 CDB 的 PDB_SPFILE$字典表 中以con_id区别,当PDB UN-Plug时,PDB参数会写入PDB的XML文件中,当drop pluggable database后,pdb信息和PDB_SPFILE$记录也会被清除。再当PDB重新Plug-in到CDB时会重新加载回PDB, 但是由于一些PDB特殊参数在plug-in时会被遗弃。

实验验证:

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> show parameter spfile

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile     string/home/oracle/app/oracle/produc
t/12.2.0/dbhome_1/dbs/spfilean
dycdb.ora
SQL> alter session set container=pdb01;

Session altered.

SQL> show parameter spfile

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile     string/home/oracle/app/oracle/produc
t/12.2.0/dbhome_1/dbs/spfilean
dycdb.ora
到这一步验证了:CDB的参数文件依然使用12c以前的SPIFLE,pdb的参数文件不会出现在SPFILE中,而是直接从CDB中继承。

SQL> show parameter undo_retention

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention     integer900
SQL> alter system set undo_retention=901;

System altered.

SQL> show parameter undo_reten

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention     integer901

SQL> select pdb_uid,name,value$ from PDB_SPFILE$;

no rows selected
SQL> alter session set container=cdb$root;

Session altered.

SQL> select pdb_uid,name,value$ from PDB_SPFILE$;

   PDB_UID NAME    VALUE$
---------- ---------------------------------------- -------------------------
2550500229 undo_retention    901

SQL> select con_id,dbid,con_uid,guid from v$pdbs;

    CON_ID DBIDCON_UID GUID
---------- ---------- ---------- --------------------------------
2 2683777510 2683777510 4ECF66D93A6233B5E0531019640A6041
3 2550500229 2550500229 4ECF8621E3DA38EEE0531019640AA598

到这一步验证了:如果PDB中有privete Local parameter 会存在 CDB 的 PDB_SPFILE$字典表 中以con_id区别

SQL>alter pluggable database pdb01 close immediate;
SQL>alter pluggable database pdb01 unplug into ‘/home/oracle/pdb01.xml‘;
[oracle@12c01 ~]$ pwd
/home/oracle
[oracle@12c01 ~]$ ll pdb01.xml 
-rw-r--r--. 1 oracle oinstall 7758 May  7 05:09 pdb01.xml
[oracle@12c01 ~]$ cat pdb01.xml 
<?xml version="1.0" encoding="UTF-8"?>
<PDB>
  <xmlversion>1</xmlversion>
  <pdbname>PDB01</pdbname>
  <cid>3</cid>
  <byteorder>1</byteorder>
  <vsn>203424000</vsn>
  <vsns>
    <vsnnum>12.2.0.1.0</vsnnum>
    <cdbcompt>12.2.0.0.0</cdbcompt>
    <pdbcompt>12.2.0.0.0</pdbcompt>
    <vsnlibnum>0.0.0.0.24</vsnlibnum>
    <vsnsql>24</vsnsql>
    <vsnbsv>8.0.0.0.0</vsnbsv>
  </vsns>
  <dbid>2550500229</dbid>
...省略
SQL> show pdbs   

    CON_ID CON_NAME  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED  READ ONLY  NO
3 PDB01  MOUNTED
SQL> drop pluggable database pdb01 keep datafiles;

Pluggable database dropped.

SQL> show pdbs    

    CON_ID CON_NAME  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED  READ ONLY  NO
SQL> select pdb_uid,name,value$ from PDB_SPFILE$;

no rows selected
到这一步验证了:PDB un-plug后pdb parameter and spfile会先进xml文件, 当drop pluggable database后,pdb信息和PDB_SPFILE$记录也会被清除。

SQL> create pluggable database pdb01 using ‘/home/oracle/pdb01.xml‘ nocopy;

SQL> show pdbs

    CON_ID CON_NAME  OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED  READ ONLY  NO
3 PDB01  MOUNTED
SQL> alter pluggable database pdb01 open;
Pluggable database altered.
SQL> select pdb_uid,name,value$ from PDB_SPFILE$;

   PDB_UID NAME    VALUE$
---------- ---------------------------------------- -------------------------
1196085469 undo_retention    901

到这一步验证了:当PDB重新Plug-in到CDB时会重新加载回PDB, 但是由于一些PDB参数特殊原因在plug-in时会被遗弃。这里因为没有特殊参数,所以没有丢失参数。

二、 CDB 与 PDB 不同值的相同参数

多租户环境下,如果在设定参数时,cdb中设置CONTAINER=ALL,那么PDB的参数也会继承这个值,但可以通过ALTER SYSTEM在PDB container中修改 PDB local parameter,将覆盖(优先)从CDB继承的参数。有时候,我们有中需求,需要核实对比 PDB 中哪些参数与 CDB 不同。我们该怎么办,下面我们一起探讨下。

例子: 查询 名为 pdb01 的PDB 与 CDB 不同值的相同参数有哪些
1. 实验环境查看
SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> show parameter undo_reten

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention     integer900
SQL> alter session set container=pdb01;
SQL> show parameter undo_reten

NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention     integer901
2. 查询 PDB 中哪些参数与 CDB 不同
SQL>  
set lin 300;
set pages 300;
col pdb_name for a30;
col parameter for a25;
col value$ for a20;
select v.dbid,v.name pdb_name,p.name parameter,p.value$
from pdb_spfile$ p,v$pdbs v
where p.pdb_uid=v.con_uid and v.name=‘PDB01‘ ;
      DBID PDB_NAME                       PARAMETER                 VALUE$
---------- ------------------------------ ------------------------- -------------
2550500229 PDB01                          undo_retention            901

Oracle12c多租户CDB 与 PDB 参数文件位置探讨、查询 CDB 与 PDB 不同值的参数