加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ORACLE 12C CDB中PDB参数管理机制

发布时间:2020-12-12 15:34:39 所属栏目:百科 来源:网络整理
导读:转自:http://www.xifenfei.com/2013/06/oracle-12c-cdb%E4%B8%ADpdb%E5%8F%82%E6%95%B0%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6.html 在ORACLE 12C中参数文件只是记录了cdb的参数信息,没有记录任何的pdb的信息,那ORACLE是如何管理使得各个pdb有自己的参数,这
SQL> select* fromv$version;BANNER CON_ID-------------------------------------------------------------------------------- ----------Oracle Database12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0PL/SQL Release 12.1.0.1.0 - Production 0CORE 12.1.0.1.0 Production 0TNS forLinux: Version 12.1.0.1.0 - Production 0NLSRTL Version 12.1.0.1.0 - Production 0

pdb信息

PDB_NAME,CON_UID,pdb_id,status dba_pdbs;PDB_NAME CON_UID PDB_ID STATUS---------- ---------- ---------- -------------PDB1 3313918585 3 NORMALPDB$SEED 4048821679 2 NORMALPDB2 3872456618 4 NORMALcon_id,dbid,NAME,OPEN_MODE v$pdbs;CON_ID DBID OPEN_MODE---------- ---------- ------------------------------ ----------2 4048821679 PDB$SEED READONLY3 3313918585 PDB1 READWRITE4 3872456618 PDB2 MOUNTED

CDB$ROOT中修改参数

--指定container=allSQL> show con_nameCON_NAME------------------------------CDB$ROOTaltersystem setopen_cursors=500 container=all;System altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------open_cursors integer500session container=pdb1;Session altered.SQL> show con_nameCON_NAME------------------------------PDB1SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------500--在CDB$ROOT中修改不指定container参数表示全部pdb生效container=CDB$ROOT;Session altered.open_cursors=100;System altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------100container=pdb1;Session altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------100 --指定container=currentopen_cursors=120 container=current;System altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------120container=pdb2 ;Session altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------120

这里可以看出来,在ROOT中修改参数,默认情况和指定container=all/current均是所有open的pdb都生效.
这里有个疑问ORACLE的参数文件只是记录的cdb的sid的参数,并未记录各个pdb的参数,那是如何实现cdb中各个pdb参数不一致的呢?继续分析

修改pdb参数做10046

SQL> show con_name;CON_NAME------------------------------PDB1SQL> oradebug setmypidStatement processed.SQL> oradebug EVENT 10046 TRACE CONTEXT FOREVER,85) !important; background: none !important;">LEVEL12Statement processed.SQL> oradebug TRACEFILE_NAME/u01/app/oracle/diag/rdbms/cdb/cdb/trace/cdb_ora_18377.trcsessions=100;System altered.SQL> oradebug EVENT 10046 trace namecontext offStatement processed.--继续修改pdb参数container=pdb1;Session altered.SQL> oradebug setmypidStatement processed.12Statement processed.SQL> oradebug TRACEFILE_NAME/u01/app/oracle/diag/rdbms/cdb/cdb/trace/cdb_ora_20275.trcsessions=101;System altered.offStatement processed.

分析trace文件

--第一次修改pdb参数值insert into pdb_spfile$(db_uniq_name,pdb_uid,sid,name,value$,comment$) values(:1,:2,:3,:4,:5,:6)END OF STMTPARSE #140085118752824:c=3999,e=3397,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=99767937623BINDS #140085118752824:Bind#0oacdty=01 mxl=32(03) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=7fffcfaa5842 bln=32 avl=03 flg=09value="cdb"#1oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00oacflg=00 fl2=1000001 frm=00 csi=00 siz=24 off=0kxsbbbfp=7f681bbb2170 bln=22 avl=06 flg=05value=3313918585#2oacdty=01 mxl=32(01) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=7fffcfaa46f8 bln=32 avl=01 flg=09"*"#3oacdty=01 mxl=32(08) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=0bc220d8 bln=32 avl=08 flg=09"sessions"#4oacdty=01 mxl=32(03) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=7fffcfaa474c bln=32 avl=03 flg=09"100"#5oacdty=01 mxl=32(00) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=00000000 bln=32 avl=00 flg=09--第二次修改pdb参数值(相同参数)update pdb_spfile$ setvalue$=:5,comment$=:6 where name=:1 and pdb_uid=:2 and db_uniq_name=:3 and sid=:4#140603847818408:#0oacdty=01 mxl=32(03) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=7ffff6477dcc bln=32 avl=03 flg=09"101"#1oacdty=01 mxl=32(00) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=00000000 bln=32 avl=00 flg=09#2oacdty=01 mxl=32(08) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=0bc220d8 bln=32 avl=08 flg=09"sessions"#3oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00oacflg=00 fl2=1000001 frm=00 csi=00 siz=24 off=0kxsbbbfp=7fe0e2638320 bln=22 avl=06 flg=05value=3313918585#4oacdty=01 mxl=32(03) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=7ffff6478ec2 bln=32 avl=03 flg=09"cdb"#5oacdty=01 mxl=32(01) mxlc=00 mal=00 scl=00 pre=00oacflg=10 fl2=0001 frm=01 csi=852 siz=32 off=0kxsbbbfp=7ffff6477d78 bln=32 avl=01 flg=09"*"

通过这里我们发现在独立修改pdb参数之时,其本质是在pdb_spfile$基表中插入或者修改相关记录(第一次修改插入,后续修改是更新)

关于pdb_spfile$基表分析

SQL> SHOW CON_NAME;CDB$ROOTSQL> COL OWNER FORA10cdb_objects whereobject_name='PDB_SPFILE$';CON_ID OWNER OBJECT_TYPE---------- ---------- -----------------------2 SYS TABLE1 SYS TABLE3 SYS TABLESQL> COL DB_UNIQ_NAME A10SQL> COL NAMEA15SQL> COL VALUE$ A10SELECTDB_UNIQ_NAME,PDB_UID,VALUE$ FROMPDB_SPFILE$;DB_UNIQ_NA PDB_UID VALUE$---------- ---------- --------------- ----------cdb 3313918585 sessions 101ALTERSESSION SETCONTAINER=pdb1;Session altered.PDB_SPFILE$;norowsselected

证明pdb中不同于root的参数是记录在root的PDB_SPFILE$基表中.
整个CDB的工作原理是如果在PDB_SPFILE$中无相关参数记录,则继承cdb的参数文件中值,如果PDB_SPFILE$中有记录则使用该值覆盖cdb参数文件值.

删除PDB_SPFILE$验证

SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------100v$pdbs;OPEN_MODE---------- ---------- ------------------------------ ----------ONLY3 3313918585 PDB1 MOUNTED4 3872456618 PDB2 WRITEcontainer=pdb2;SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------100open_cursors=110;System altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------110SQL> conn / assysdbaConnected.value$ pdb_spfile$ where='open_cursors';VALUE$--------------------------------------------------------------------------------110delete;1 row deleted.commit;Commitcomplete.SQL> startupORACLE instance started.Total System GlobalArea 597098496 bytesFixed Size2291072 bytesVariable 272632448 bytesBuffers 314572800 bytesRedo Buffers 7602176 bytesmounted.opened.;selectedSQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------100container=pdb2 ;Session altered.alterdatabaseopen;altered.SQL> show parameter open_cursors;TYPE VALUE------------------------------------ ----------- ------------------------------100

删除PDB_SPFILE$中相关记录,pdb的参数值会自动继续继承cdb中参数值
总结说明:通过上述的一些列试验证明cdb中参数关系,在cdb中修改,会默认所有pdb均自动继承;如果在pdb中修改值会覆盖cdb参数,而且只对当前pdb生效,并记录在PDB_SPFILE$

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

转自:http://www.xifenfei.com/2013/06/oracle-12c-cdb%E4%B8%ADpdb%E5%8F%82%E6%95%B0%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6.html


在ORACLE 12C中参数文件只是记录了cdb的参数信息,没有记录任何的pdb的信息,那ORACLE是如何管理使得各个pdb有自己的参数,这里通过试验的出来ORACLE 12C CDB环境中是通过参数文件结合PDB_SPFILE$来实现参数管理
数据库版本

    推荐文章
      热点阅读