基礎知識單薄的同學,請逐字逐句閱讀以下概念,來自於博客園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