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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM