­

【DB筆試面試522】在Oracle中,資料庫和實例的關係是什麼?

  • 2019 年 10 月 8 日
  • 筆記

題目部分

在Oracle中,資料庫和實例的關係是什麼?

答案部分

資料庫(DATABASE)是一個數據集合,Oracle資料庫都將其數據存放在數據文件中。在物理結構上,Oracle資料庫必須的3類文件分別是數據文件、控制文件和聯機Redo日誌文件。在邏輯結構上,Oracle資料庫由表空間、段、區和塊組成。資料庫名稱由DB_NAME來標識。

實例(INSTANCE)是操作Oracle資料庫的一種手段。它是由OS分配的一塊記憶體(包括SGA和PGA)和一些後台進程(PMON、SMON、LGWR、CKPT、DBWn等)組成的。實例在啟動時會讀取初始化參數文件(SPFILE或PFILE),獲取資料庫運行時的參數的值。實例名稱由INSTANCE_NAME來標識。

在Oracle 12c之前,一個資料庫可以被1個實例(Single Instance,單實例)或多個實例訪問或掛載(RAC,集群)。

從Oracle 12c開始,對於非CDB(non-CDB,非容器資料庫)類型的資料庫而言,它和Oracle 12c之前的資料庫沒有差別。但是,對於CDB(Container Database,容器資料庫)類型的資料庫而言,資料庫和實例之間是多對多的關係。一個資料庫實例可以對應多個資料庫(CDB及CDB所包含的PDB(Pluggable Database,可插拔資料庫)),一個資料庫也可以被多個實例掛載,即CDB類型的資料庫。在CDB中,一個實例將與整個CDB關聯。如果同一個伺服器上有多個資料庫,則每個非CDB或CDB都具有各自單獨的相異實例。實例不能在非CDB和CDB之間共享。

在Oracle Database 12c中,有三個可能的配置選項:

多租戶配置:通常每個CDB有多個PDB,但是任何時候可以一次存放零個、一個或許多PDB,從而利用新體系結構的全部功能,這需要授權的Oracle多租戶選項

單租戶配置:新體系結構的特殊案例,這不需要授權的選項

非CDB:舊的Oracle Database 11g體系結構

在物理級別,CDB與非CDB一樣有一個資料庫實例和多個資料庫文件。

SYSTEM/SYSAUX:在CDB的資料庫環境中,SYSTEM/SYSAUX表空間並不是公用,CDB$ROOT以及每個PDB都擁有自己的SYSTEM和SYSAUX表空間。每個容器都將自己的數據字典存儲在相應的SYSTEM表空間(其中包含自己的元數據)中,還有一個SYSAUX表空間。

重做日誌文件是整個CDB共有的,其中包含的資訊注釋有發生更改的PDB的標識。Oracle GoldenGate已進行了增強,以識別CDB的重做日誌的格式。在CDB環境中所有的PDB共用CDB$ROOT中的REDO文件,REDO中的條目標識REDO來自那個PDB。在PDB中無法執行ALTER SYSTEM SWITCH LOGFILE命令,只有公用用戶在ROOT容器中才可以執行該命令。另外ALTER SYSTEM CHECKPOINT命令是可以在PDB中執行的。

歸檔:CDB中的所有PDB都共享CDB的ARCHIVELOG模式,以及歸檔文件,不可以單獨為PDB設置自己的歸檔模式,只有特權用戶連接根容器之後才可以啟動歸檔模式。所以,如果想開啟或關閉資料庫的歸檔模式,那麼只能在CDB級別進行操作。在12.1中,只支援在CDB級別閃回資料庫,而在12.2中支援在PDB級別閃回資料庫,但是開啟和關閉資料庫的閃回功能,則只能在CDB級別操作。

控制文件是整個CDB共有的。CDB環境中只有一組控制文件,所有的PDB共用這組公共的控制文件,從任何PDB中添加數據文件都會記錄到公共控制文件當中,公用用戶連接根容器時,可對控制文件進行管理。

Undo Mode:在12.2之前,每個CDB實例僅有一個UNDO表空間,所有的PDB共用CDB$ROOT中的UNDO文件。在12.1中,所有的在一個實例中的PDB只能共享同一個UNDO表空間。在12.2中它們都有各自的undo表空間了。這種新的管理機制就叫做本地undo模式。在12.2之後的版本中UNDO的使用模式有兩種:SHARED UNDO MODE和LOCAL UNDO MODE,顧名思義,LOCAL UNDO MODE就是每個PDB使用自己的UNDO表空間,但當PDB中沒有自己的UNDO表空間時,會使用CDB$ROOT中的公共UNDO表空間。本地undo模式為新建資料庫的默認模式。

臨時文件:每個PDB都有自己的臨時表空間,如果PDB沒有自己的臨時表空間文件,那麼,PDB可以使用CDB$ROOT中的臨時表空間。根或PDB只能有一個默認臨時表空間或表空間組。每個PDB可以具有供該PDB中本地用戶或公用用戶使用的臨時表空間。

•參數文件:參數文件中只記錄了根容器的參數資訊,沒有記錄PDB級別的參數資訊,在根容器中修改初始化參數,會被繼承到所有的PDB中,在PDB中修改參數後,PDB的參數會覆蓋CDB級別的參數,PDB級別的參數記錄在根容器的pdb_spfile$視圖中,但並不是所有的參數都可以在PDB中修改,可以通過v$system_parameter視圖的ispdb_modifiable列查看PDB中可修改的參數。

SELECT name FROM v$system_parameter    WHERE ispdb_modifiable = 'TRUE'    ORDER BY name;  

•告警日誌以及跟蹤文件:在CDB中所有的PDB共用一個告警日誌和一組跟蹤文件,所有的PDB告警資訊都會寫入同一個告警日誌中。

•時區:在CDB環境中可以為CDB以及所有的PDB設置相同的時區,也可以為每個PDB設置單獨的時區。

select dbtimezone from dual;

•字符集:在CDB中定義字符集也可以應用於它所含有的PDB中,每個PDB也可以有自己的字符集設置。在12.1中,CDB和PDB的字符集必須一樣,但是在12.2中,CDB和PDB的字符集可以不一樣。

•根據應用程式的需要,PDB可以在PDB中創建表空間。

•每個數據文件都與名為CON_ID的特定容器相關聯。

本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。