Oracle數據庫的體系結構是從某一角度來分析數據庫的組成,工作過程以及數據庫如何管理和組織數據的,主要包括物理存儲結構,邏輯存儲結構,內存結構以及進程結構。
Oracle的物理存儲結構:
Oracle物理存儲結構主要包括三種類型的物理文件,分別是數據文件(*.dbf),控制文件(*.ctl)和重做日志文件(*.log)。
1. 數據文件
數據文件主要是存儲數據的文件。例如,數據文存儲的表的記錄和索引。在這些數據文件中,如果用戶頻繁的訪問某些數據,那麼這些數據就會被存儲在內存的緩沖區中。當對這些數據進行讀取時,Oracle首先會從內存de緩沖區中找到相關的數據信息。如果內存的緩沖區中不存在相關的數據,則從數據庫文件中讀取數據,然後存放到內存的數據緩沖區中,以供查詢時使用。這種數據的存取方式不僅可以減少磁盤的I/O操作,還可以提高系統的相應性能。
如果需要了解數據文件的信息可以通過查詢數據字典視圖DBA_DATA_FILES和V$DATAFILE。首先通過DESC命令來了解一下數據字典視圖DBA_DATA_FILES和V$DATAFILE的結構,數據字典視圖DBA_DATA_FILES的結構如下:
SQL> DESCDBA_DATA_FILES;
名稱 是否為空? 類型
----------------------------------- -------------------------------- FILE_NAME VARCHAR2(513) FILE_ID NUMBER TABLESPACE_NAME VARCHAR2(30) BYTES NUMBER BLOCKS NUMBER STATUS VARCHAR2(9) RELATIVE_FNO NUMBER AUTOEXTENSIBLE VARCHAR2(3) MAXBYTES NUMBER MAXBLOCKS NUMBER INCREMENT_BY NUMBER USER_BYTES NUMBER USER_BLOCK NUMBER ONLINE_STATUS VARCHAR2(7)
在上述的結果中,FILE_NAME表示數據文件的名稱以及存放的路徑;FILE_ID表示數據文件在數據庫中的ID號;TABLESPACE_NAME表示數據文件對應的表空間名;BYTES表示的是數據文件的大小;BLOCKS表示數據文
件所占用的數據塊;STATUS表示數據文件的狀態;AUTOEXTENSIBLE表示數據文件是否可擴展。數據字典
視圖V$DATAFILE記錄了數據文件的動態信息,其結構如下:
SQL> DESCV$DATAFILE;
名稱 是否為空? 類型
----------------------------------- -------------------------------- FILE# NUMBER CREATION_CHANGE# NUMBER CREATION_ TI DATE TS# NUMBER RFILE# NUMBER STATUS VARCHAR2(7) ENABLED VARCHAR2(10) CHECKPOINT_CHAN NUMBER CHECKPOINT_TIME DATE UNRECOVERABLE_CHANGE# NUMBER UNRECOVERABLE_TIME DATE LAST_CHANGE# NUMBER LAST_TIME DATE OFFLINE_CHANGE# NUMBER ONLINE_CHANGE# NUMBER ONLINE_TIME DATE BYTES NUMBER BLOCKS NUMBER CREATE_BYTES NUMBER BLOCK_SIZE NUMBER NAME VARCHAR2(513) PLUGGED_IN NUMBER BLOCK1_OFFSET NUMBER AUX_NAME VARCHAR2(513) FIRST_NONLOGGED_SCN NUMBER FIRST_NONLOGGED_TIME DATE FOREIGN_DBID NUMBER FOREIGN_CREATION_CHANGE# NUMBER FOREIGN_CREATION_TIME DATE PLUGGED_READONLY VARCHAR2(3) PLUGIN_CHANGE# N MBER PLUGIN_RESETLOGS_CHANGE# NUMBER PLUGIN_RESETLOGS_TIME DATE CON_ID NUMBER
在上述的結果中FILE#表示存放數據文件的編號;STATUS表示數據文件的狀態;CHECKPOINT_CHANGE#表示數據文件的同步號,隨著系統的運行自動修改,以維持數據文件的同步;BYTES表示數據文件的大小;BLOCKS表示數據文件所占用的數據塊數;NAME表示數據文件的名稱以及存放的路徑。
2. 控制文件
控制文件是一個很小的二進制文件,主要包含與關於數據庫物理結構的重要信息,存放數據庫中的數據文件和日志文件的信息。
控制文件對於數據庫的成功啟動和正常運行至關重要。在加載數據庫時必須先找到數據庫的控制文件。如果控制文件正常,實例才能加載並打開數據庫。但是如果控制文件中記錄了錯誤的信息,或者實例無法找到一個可用的控制文件,數據庫將無法加載,當然也無法打開。
一個Oracle數據庫通常包含有多個控制文件,在數據庫運行的過程中,Oracle數據庫需要不斷的更新控制文件,因此控制文件必須在整個數據庫打開期間始終保持可用狀態。如果某種原因導致控制文件不可用,那麼數據庫將會崩潰。
控制文件的信息可以通過數據字典視圖V$CONTROLFILE來了解,其結構如下:
SQL> DESC V$CONTROLFILE;
名稱 是否為空? 類型
----------------------------------- ------------- STATUS VARCHAR2(7) NAME VARCHAR2(513) IS_RECOVERY_DEST_FILE VARCHAR2(3) BLOCK_SIZE NUMBER FILE_SIZE_BLKS NUMBER CON_ID NUMBER
在上述的結果中,STATUS表示控制文件的狀態;NAME表示控制文件的名稱以及路徑的信息。例如查詢控制文件的名稱以及路徑信息,如下:
SQL> SELECT NAME FROM V$CONTROLFILE; NAME ------------------------------------------------- D:\ORACLE\ORADATA\ORACLE12C\CONTROL01.CTL D:\ORACLE\ORADATA\ORACLE12C\CONTROL02.CTL
從上述的結果可以看出,Oracle一般會默認創建兩個包含相同信息的控制文件。其目的是為了當其中一個控制文件受損時可以調用另一個控制文件繼續工作。
3. 重做日志文件
重做日志文件即日至文件,主要記錄用戶對數據庫的操作信息。日志文件是數據庫系統中最重要的文件之一,通過日志文件可以保證數據庫的安全,也可以實現數據庫的備份與恢復。一旦日志文件受損,那麼數據庫可能無法正常運行。
為了確保日志的安全,在實際的應用中,允許對日志文件進行鏡像,日志文件與其鏡像文件記錄同樣的日志信息,他們構成一個日志文件組,同一個組中的日志文件最好存放在不同的磁盤中,以便可以保證一個日志文件受損時,還有其他的日志文件提供日志信息。
通過數據字典V$LOG,可以了解系統當前正在使用哪個日志文件組,如下:
SQL>SELECT GROUP#,MEMBERS,STATUS FROM V$LOG; GROUP# MEMBERS STATUS -------------------- ---------------- 1 1 INACTIVE 2 1 CURRENT 3 1 INACTIVE 4 2 INACTIVE
在上述的結構中,如果STATUS字段的值為CURRENT,則表示當前系統正在使用該字段對應的日志文件組。
當一個日志文件組的空間被占用完之後,Oracle系統會自動轉換到另一個日志文件組,不過,管理員可以使用ALTER STSTEM命令驚醒手動切換日志文件。如下:
SQL> ALTER SYSTEM SWITCH LOGFILE;
系統已更改。
再次查詢數據字典V$LOG,如下:
SQL> SELECT GROUP#,MEMBERS,STATUS FROMV$LOG; GROUP# MEMBERS STATUS ---------- ---------- ---------------- 1 1 INACTIVE 2 1 ACTIVE 3 1 CURRENT 4 2 INACTIVE
從上述的結果看,系統當前運行的日志文件組已經改變。