1. 程式人生 > >Oracle 資料庫例項介紹

Oracle 資料庫例項介紹

文章目錄

文章翻譯源於 Oracle Database Database Concepts, 18c

本章介紹 Oracle 資料庫例項的原理,例項的引數檔案和診斷檔案,以及例項建立和資料庫的開啟與關閉的過程。

本章包含以下內容:

  • 資料庫例項介紹
  • 例項啟動與關閉
  • 檢查點
  • 例項恢復
  • 引數檔案
  • 診斷檔案

資料庫例項介紹

資料庫例項(instance)是一組用於管理資料庫檔案的記憶體結構。

資料庫是一組位於磁碟上的物理檔案,通過 CREATE DATABASE 語句建立。例項管理相關的資料,並且為資料庫使用者提供服務。

每個正在執行的 Oracle 資料庫至少與一個例項相關聯。因為例項存在於記憶體中,而資料庫存在磁碟上,所以例項可以獨立於資料庫存在,資料庫也可以獨立於例項存在。

例項結構

當一個例項啟動時,Oracle 資料庫分配一個稱為系統全域性區(SGA)的記憶體區域,並啟動一個或多個後臺程序。

SGA 的作用包括:

  • 維護多個程序和執行緒併發訪問的內部資料結構
  • 快取從磁碟讀取的資料塊
  • 在寫入線上重做日誌檔案之前緩衝重做資料
  • 儲存 SQL 執行計劃

同一個伺服器上的 Oracle 程序之間共享 SGA。Oracle 程序與 SGA 的互動方式取決於作業系統。

一個數據庫例項包括多個後臺程序(background process)。伺服器程序(server process),以及分配給它們的記憶體,也位於例項之中。例項在伺服器程序結束後仍然繼續存在。

下圖顯示了 Oracle 資料庫例項中的主要元件。
Database Instance
圖 13- 1 資料庫例項

例項配置

Oracle 資料庫支援單例項配置和真正應用叢集(Oracle RAC)配置。這兩種配置只能二選其一。

在單例項配置中,資料庫和例項之間一一對應。在 Oracle RAC 中,資料庫和例項存在一對多的關係。

下圖顯示了兩種可能的資料庫例項配置。
Database Instance Configurations
圖 13-2 資料庫例項配置

無論是單例項還是 Oracle RAC 配置,一個例項每次只能與一個數據庫關聯。管理員可以啟動一個例項,然後載入(關聯)一個數據庫,但是不能同時載入兩個資料庫。

注意:除非特別指出,本章討論單例項資料庫配置。

一臺伺服器上可以同時執行多個例項,每個例項管理各自的資料庫。例如,某臺伺服器上擁有兩個不同的資料庫:prod1 和 prod2。一個例項管理 prod1另一個例項管理 prod2。

讀寫例項與只讀例項

例項支援兩種模式:讀寫例項與只讀例項。

對於讀寫例項,可以處理 DML 操作,支援客戶端的直接連線請求。這是預設方式。與此相反,只讀例項能夠執行查詢,但是不能支援 DML修改操作(UPDATE、DELETE、INSERT 以及 MERGE),也不能從客戶端直接進行連線。

注意:除非另外指明,本文件中的例項都是指讀寫例項。

在之前的版本中,所有的例項(除非管理一個 standby 資料庫)都是讀寫例項。從 Oracle 資料庫 12c (12.2) 開始, 一個數據庫可以同時存在只讀例項和讀寫例項。這種配置對於即查詢資料又修改資料庫的並行 SQL 語句非常有用,因為讀寫例項和只讀例項都能夠查詢資料,而讀寫例項能夠修改資料。

與讀寫例項相比,只讀例項具有以下特點:

  • 只能開啟一個已經被讀寫例項開啟的資料庫
  • 禁用了許多不必要的後臺程序,包檢查點程序和歸檔程序
  • 可以載入一個被禁用的重做執行緒或者沒有任何線上重做日期的執行緒

要想將例項設定為只讀模式,可以將初始化引數 INSTANCE_MODE 設定為 READ_ONLY。該引數的預設值為 READ_WRITE。

例項生命週期

資料庫例項從 STARTUP 命令建立開始,直到被終止時結束。

在此期間,一個例項能且只能與一個數據庫相關聯。進一步而言,該例項只能載入資料庫一次、開啟資料庫一次,並且關閉資料庫一次。在資料庫關閉之後,必須重新啟動一個例項,然後載入並開啟資料庫。

下表演示了一個例項嘗試重新開啟之前關閉的資料庫的過程。

表 13- 1 例項生命週期

語句 註釋
SQL> STARTUP
ORACLE instance started.
Total System Global Area 468729856 bytes
Fixed Size 1333556 bytes
Variable Size 440403660 bytes
Database Buffers 16777216 bytes
Redo Buffers 10215424 bytes
Database mounted.
Database opened.
STARTUP 命令建立一個例項,然後載入並開啟資料庫。
SQL> SELECT
TO_CHAR(STARTUP_TIME,‘MON-DD-RR HH24:MI:SS’)
AS “Inst Start Time” FROM V$INSTANCE;

Inst Start Time
------------------
JUN-18-14 13:14:48
該查詢顯示了當前例項的啟動時間。
SQL> SHUTDOWN IMMEDIATE 關閉資料庫和例項,結束例項的生命週期。
SQL> STARTUP
Oracle instance started… . .
STARTUP 命令建立一個新的例項,然後載入並開啟資料庫。
SQL> SELECT
TO_CHAR(STARTUP_TIME,‘MON-DD-RR HH24:MI:SS’)
AS “Inst Start Time” FROM V$INSTANCE;

Inst Start Time
------------------
JUN-18-14 13:16:40
該查詢顯示了當前例項的啟動時間。不同的啟動時間表明瞭這是一個新的例項。

例項標識

一個主機上可以執行多個數據庫例項。因此,訪問時需要指定訪問哪個例項。

Oracle 最優靈活體系結構(OFA)規則是一組配置指南,可以確保組織良好的 Oracle 軟體安裝。本節中的示例使用 OFA 體系結構。

本節包含以下主題:

  • Oracle 根目錄
  • Oracle 主目錄
  • Oracle 系統識別符號(SID)

Oracle 根目錄

Oracle 根目錄(Oracle Base directory)儲存 Oracle 產品的二進位制檔案。

Oracle 根目錄是 Oracle 資料庫安裝擁有者的資料庫主目錄。一個主機上可以按照多個 Oracle 資料庫,以及多個 Oracle 資料庫軟體安裝的擁有者。

以下示例顯示了作業系統使用者 oracle 的 Oracle 根目錄:

/u01/app/oracle

在路徑的字首中, /u01/ 是儲存的掛載點, /u01/app/ 是安裝應用軟體的分支目錄。

Oracle 主目錄

Oracle 主目錄(Oracle home directory)是 Oracle 資料庫軟體的安裝位置。

每個新的 Oracle 資料庫軟體安裝都需要指定一個新的 Oracle 主目錄。預設情況下,Oracle 主目錄是 Oracle 根目錄(ORACLE_BASE)下的一個子目錄。

在同一個主機上,相同的 Oracle 根目錄下,可以安裝不同版本的資料庫軟體。歸屬於不同系統使用者的不同版本的多個數據庫可以並存。

以下示例顯示了三個不同的 Oracle 主目錄的完整路徑名稱,它們都位於相同的 Oracle 根目錄(/u01/app/oracle/)下:

/u01/app/oracle/product/12.1.0/dbhome_1
/u01/app/oracle/product/12.1.0/dbhome_2
/u01/app/oracle/product/18.0.0/dbhome_1

路徑名稱中, Oracle 根目錄(/u01/app/oracle/)之後的部分包含了產品版本編號(例如 12.1.0)和 Oracle 主目錄的相對路徑(例如 dbhome_1)目錄 /u01/app/oracle/product/12.1.0/ 中包含了兩個不同的 Oracle 主目錄: dbhome_1 和 dbhome_2。

從 Oracle Database 18c 開始,支援建立只讀的 Oracle 主目錄,將其作為一個軟體的映像。只讀 Oracle 主目錄儲存靜態檔案,例如二進位制程式。Oracle 根主目錄(ORACLE_BASE_HOME)位於 ORACLE_BASE/homes/home_name,儲存與特定 Oracle 主目錄相關的動態檔案。Oracle 根配置目錄(ORACLE_BASE_CONFIG)由 Oracle 根目錄中的所有 Oracle 主目錄共享,用於儲存例項相關的動態檔案。

以下示例中,第一個路徑是一個只讀 Oracle 主目錄,第二個路徑是其對應的 根主目錄:

/u01/app/oracle/product/18.0.0/ro_dbhome_1
/u01/app/oracle/homes/ro_dbhome_1

Oracle SID

系統識別符號(SID) 是一個主機上的 Oracle 資料庫例項的唯一名稱。

在 UNIX 和 Linux 系統上,Oracle 資料庫使用 SID 和 Oracle 主目錄的路徑名稱作為共享記憶體的鍵值。 另外,Oracle 資料庫預設使用 SID 查詢初始化引數檔案,通過初始化檔案查詢其他相關檔案,例如資料庫控制檔案。

在大多數平臺上,使用 ORACLE_SID 環境變數設定 SID,使用 ORACLE_HOME 變數設定 Oracle 主目錄。客戶端連線資料庫例項時,可以在 Oracle Net 連線中指定 SID,或者使用一個網路服務名(service name)。 Oracle 資料庫將服務名轉換為 ORACLE_HOME 和 ORACLE_SID。

傳統的可讀寫 Oracle 主目錄包含了例項相關的檔案。但是,如果 Oracle 主目錄改為只讀,例項相關的檔案單獨儲存在 Oracle 根目錄中。無論哪種情況,名稱中包含 SID 的檔案儲存在 Oracle 主配置目錄(ORACLE_BASE_CONFIG)的 dbs 子目錄中。有了這種檔案分離,使用者可以使用只讀 Oracle 主目錄中的軟體建立資料庫,然後使用另一個只讀 Oracle 主目錄中的軟體啟動一個例項,管理該資料庫。

例項啟動與關閉

資料庫例項(database instance)為使用者提供資料庫訪問。例項和資料庫存在各種不同的狀態。

啟動例項與資料庫

通常來說,管理員手動啟動一個例項,然後載入並開啟資料庫,接受客戶端連線。這些操作可以通過 SQL*Plus 的 STARTUP 命令、 Oracle 企業管理器(Enterprise Manager)或者 SRVCTL 工具完成。

如果使用 Oracle Net 啟動一個數據庫例項,需要滿足以下條件:

  • 資料庫通過靜態方式註冊到 Oracle Net 監聽器中。
  • 使用 SYSDBA 許可權進行連線。

監聽器啟動一個專用的伺服器程序,用於啟動資料庫例項。

下圖顯示了資料庫從關閉到開啟的處理過程。
Instance and Database Startup Sequence
圖 13-3 例項與資料庫啟動順序

資料庫從關閉狀態到開啟狀態需要經歷以下幾個階段。

表 13-2 例項啟動階段

階段 載入狀態 描述 更多內容
1 啟動例項,未載入資料庫 啟動一個例項,但沒有與資料庫關聯。 啟動例項
2 載入資料庫 例項已經啟動,並且讀取資料庫的控制檔案。資料庫對使用者不可用。 載入資料庫
3 開啟資料庫 例項已經啟動,並且開啟資料庫。授權使用者可以訪問資料檔案中的資料。 開啟資料庫

管理員登入

資料庫的啟動和關閉是非常強大的管理功能,只能由具有管理員許可權的使用者執行。

普通使用者無法控制資料庫的當前狀態。根據作業系統的不同,使用者可以通過以下方式獲得管理員許可權:

  • 使用者的作業系統許可權允許他/她已管理員許可權連線到資料庫。
  • 使用者被授予特殊的系統許可權,資料庫使用口令檔案認證通過網路連線的管理員

以下特殊的系統許可權能夠在資料庫未開啟時訪問例項:

  • SYSDBA
  • SYSOPER
  • SYSBACKUP
  • SYSDG
  • SYSKM

以上許可權的管理不在資料庫的自身範圍之內。使用 SYSDBA 系統許可權連線時,使用者位於 SYS 模式中。使用 SYSOPER 連線時,使用者位於公共模式中。SYSOPER 許可權是 SYSDBA 許可權的一個子集。

啟動例項

當 Oracle 資料庫啟動一個例項時,需要經過幾個階段。

例項啟動階段包括:

  1. 查詢不同平臺下預設位置中的伺服器引數檔案,如果沒有找到該檔案,查詢文字形式的初始化引數檔案(在 STARTUP 命令中指定 SPFILE 或 PFILE 引數將會覆蓋預設行為)
  2. 讀取引數檔案,獲取初始化引數的值
  3. 基於初始化引數設定分配 SGA
  4. 啟動 Oracle 後臺程序
  5. 開啟告警日誌(alert log)檔案和跟蹤檔案(trace file),按照引數設定的語法在告警日誌中寫入所有顯式指定的引數設定

在這一階段,例項還沒有關聯到資料庫。NOMOUNT 狀態的使用場景包括資料庫建立以及備份與恢復操作。

載入資料庫

例項通過載入資料庫與其進行關聯。

載入資料庫時,例項通過初始化引數 CONTROL_FILES 獲取資料庫控制檔案 的名稱並開啟這些檔案。Oracle 資料庫讀取控制檔案,獲取資料檔案和線上重做日誌檔案的名稱,在開啟資料庫時需要訪問這些檔案。

載入之後,資料庫處於關閉狀態,只允許管理員訪問。管理員可以在保持資料庫關閉的同時執行一些特定的維護操作。但是,此時資料庫還不能執行一些常規操作。

如果 Oracle 資料庫允許多個例項同時載入相同的資料庫,初始化引數 CLUSTER_DATABASE 可以設定多個例項訪問該資料庫。具體的行為取決於該引數的值:

  • 如果第一個載入資料庫的例項的 CLUSTER_DATABASE 設定為 false(預設值),只有該例項能夠載入資料庫。
  • 如果第一個載入資料庫的例項的 CLUSTER_DATABASE 設定為 true,其他例項在 CLUSTER_DATABASE 也設定為 true 時可以載入該資料庫。可以同時載入同一個資料庫的例項數量由建立資料庫時的預定義值決定。

開啟資料庫

開啟一個已載入的資料庫意味著可以對其執行常規的操作。

任何有效的使用者都可以連線到一個開啟的資料庫,並且訪問其中的資訊。通常來說,資料庫管理員負責開啟資料庫。

開啟資料庫時, Oracle 資料庫將會執行以下操作:

  • 開啟撤銷表空間(undo tablespace)之外的其他表空間的線上資料檔案

    如果一個表空間在資料庫關閉之前處於離線(offline)狀態,重新開啟資料庫時,該表空間和相應的資料檔案仍然處於離線狀態。

  • 獲取一個撤銷表空間

    如果存在多個撤銷表空間,由初始化引數 UNDO_TABLESPACE 決定使用哪個表空間。如果沒有設定該引數,使用第一個可用的撤銷表空間。

  • 開啟線上重做日誌檔案

只讀模式

預設情況下,資料庫以讀/寫模式開啟。在這種模式下,使用者可以修改資料,產生重做日誌項。另外,資料庫可以以只讀模式開啟,防止使用者事務修改資料。

注意:預設情況下,物理備用資料庫以只讀模式開啟。

只讀模式下的資料庫只能執行只讀事務,不能寫入資料檔案或者線上重做日誌檔案。不過,資料庫仍然能夠執行恢復操作或者不產生重做日誌的操作。例如,只讀模式支援以下操作:

  • 將資料檔案離線或者線上。但是,不能將永久表空間離線。
  • 恢復離線的資料檔案和表空間。
  • 修改控制檔案中關於資料庫狀態的資訊。
  • 使用 CREATE TEMPORARY TABLESPACE 語句建立的臨時表空間允許讀寫操作。
  • 寫入作業系統的審計檔案、跟蹤檔案以及告警日誌。
資料庫檔案檢查

如果開啟資料庫時,任何資料檔案或重做日誌檔案不存在,或者它們存在但是一致性檢測失敗,資料庫將會返回一個錯誤。此時需要執行介質恢復。

關閉資料庫與例項

通常來說,管理員在執行維護操作或其他管理任務時手動關閉資料庫。可以使用 SQL*Plus 的 SHUTDOWN 命令或者 Enterprise Manager 執行這些操作。

下圖演示了資料庫從開啟狀態到一致性關閉的過程。
Instance and Database Shutdown Sequence
圖 13-4 例項與資料庫關閉順序

Oracle 資料庫從開啟到一致性關閉時自動執行以下操作。
表 13-3 一致性關閉的步驟

階段 載入狀態 描述 更多內容
1 關閉資料庫 資料庫處於載入狀態,但是線上資料檔案和重做日誌檔案被關閉。 關閉資料庫
2 解除安裝資料庫 例項處於啟動狀態,但是不再關聯資料庫的控制檔案。 解除安裝資料庫
3 關閉例項 例項被關閉,不再處於啟動狀態。 關閉例項

Oracle 資料庫在出現例項失敗或者執行 SHUTDOWN ABORT (立即終止例項)命令時,不會執行以上操作。

關閉模式

具有 SYSDBA 或者 SYSOPER 許可權的資料庫管理員可以使用 SQL*Plus 的 SHUTDOWN 命令或 Enterprise Manager 關閉資料庫。SHUTDOWN 命令包含了不同的關閉選項。

下表總結了不同的關閉模式。
表 13-4 資料庫關閉模式

資料庫行為 ABORT IMMEDIATE TRANSACTIONAL NORMAL
執行新使用者連線
等待當前會話結束
等待當前事務結束
執行檢查點並關閉開啟的檔案

不同的 SHUTDOWN 語句包括:

  • SHUTDOWN ABORT

    這種關閉模式用於緊急情況,例如其他模式無法關閉例項時。這種模式速度最快。但是,隨後再開啟資料庫時需要更長的時間,因此需要執行例項恢復以確保資料檔案的一致性。

    由於 SHUTDOWN ABORT 命令不對開啟的資料檔案執行檢查點操作,重新開啟資料庫時必須執行例項恢復。其他的關閉模式在重新開啟資料庫時不需要執行例項的恢復。

    注意:在 CDB 中,針對 PDB 執行的 SHUTDOWN ABORT 命令等價於非 CDB 上的 SHUTDOWN IMMEDIATE 命令。

  • SHUTDOWN IMMEDIATE

    這種關閉模式是除了 SHUTDOWN ABORT 之外的最快方式。Oracle 資料庫立即終止任何正在執行的 SQL 語句並且斷開使用者的連線。系統終止所有正在進行的事務,並且回滾未提交的更改。

  • SHUTDOWN TRANSACTIONAL

這種關閉模式不允許使用者開始新的事務,但會等待所有當前正在執行的事務結束,然後關閉資料庫。這種模式可能需要等待很長的時間才能完成。

  • SHUTDOWN NORMAL

這是預設的關閉模式。資料庫在關閉之前等待所有連線的使用者斷開連線。

關閉資料庫

關閉資料庫的操作分為正常關閉和異常關閉。

正常關閉

當資料庫使用非 ABORT 模式關閉時,會將 SGA 中的資料寫入資料檔案和線上重做日誌檔案。

然後,資料庫關閉線上資料檔案和重做日誌檔案。離線表空間中的離線資料檔案已經處於關閉狀態。當資料庫重新開啟時,原來的離線表空間仍然處於離線狀態。

此時,資料庫已經關閉,不接受正常訪問。但是控制檔案仍然處於開啟狀態。

異常關閉

如果使用 SHUTDOWN ABORT 命令關閉資料庫或者資料庫異常終止時,例項瞬間停止並關閉資料庫。

異常關閉時,Oracle 資料庫不會將 SGA 快取中的資料寫入資料檔案和重做日誌檔案。隨後重新開啟資料庫時需要執行例項恢復,Oracle 自動執行例項的恢復操作。

解除安裝資料庫

在關閉資料庫之後,Oracle 將會解除安裝資料庫,將其與例項分離。

解除安裝資料庫之後,Oracle 關閉資料庫的控制檔案。此時,例項仍然存在於記憶體之中。

關閉例項

關閉資料庫的最後一步就是關閉例項。關閉例項時,系統釋放 SGA 記憶體,並停止後臺程序。

在異常情況下,例項可能沒有關閉乾淨。記憶體中仍然存在一些記憶體結構,或者某個後臺程序仍未終止。如果之前的例項仍然部分存在,後續的例項可能會啟動失敗。此時,可以通過刪除之前例項的殘餘並重新啟動一個新例項,或者使用 SHUTDOWN ABORT 語句關閉之前的例項,強制啟動一個新的例項。

某些情況下,程序的清除可能會遇到錯誤,導致程序監控程序(PMON)或者例項的終止。動態初始化引數 INSTANCE_ABORT_DELAY_TIME 用於指定發生內部例項失敗時延遲關閉的時間(秒)。延遲時間之內,管理員可以介入處理。當發生延遲的例項終止時,資料庫在告警日誌中寫入一條訊息。某些情況下,通過允許隔離某些資料庫資源,可以避免例項被終止。

檢查點

檢查點(checkpoint)對於一致性資料庫關閉、例項恢復以及常規資料庫操作都至關重要。

檢查點操作具有以下含義:

  • 檢查點位置(checkpoint position),它表示重做日誌流中的系統更改號(SCN),例項恢復必須從該檢查點位置開始

    檢查點位置由資料庫緩衝區快取記憶體中最早的髒塊決定。檢查點位置相當於一個指向重做流的指標,它的資訊儲存在控制檔案以及每個資料檔案的頭部。

  • 將資料庫緩衝區快取記憶體中被修改過的快取資料寫入磁碟

檢查點的作用

Oracle 資料庫使用檢查點實現多個功能,包括:

  • 減少例項或介質失敗時的恢復時間
  • 確保資料庫定期將緩衝區快取記憶體中的髒資料寫入磁碟
  • 確保資料庫在一致性關閉時將所有已提交的資料寫入磁碟

檢查點觸發時機

檢查點程序(CKPT)負責將檢查點寫入資料檔案頭部以及控制檔案中。

許多場景都會導致檢查點發生。例如,Oracle 資料庫包含以下檢查點型別:

  • 執行緒檢查點

    資料庫在完成特定操作之前將某個重做執行緒修改的快取資料寫入磁碟。一個數據庫的所有例項上的執行緒檢查點集合組成資料庫檢查點。執行緒檢查點在以下情況下觸發:

    • 一致性資料庫關閉
    • 執行 ALTER SYSTEM CHECKPOINT 語句
    • 線上重做日誌切換
    • 執行 ALTER DATABASE BEGIN BACKUP 語句
  • 表空間和資料檔案檢查點

資料庫在完成特定操作之前將所有重做執行緒修改的快取資料寫入磁碟。表空間檢查點包含一組資料檔案檢查點,每個資料檔案一個檢查點。這些檢查點的觸發事件包括:將表空間設定為只讀或者正常離線,收縮資料檔案,或者執行 ALTER TABLESPACE BEGIN BACKUP 命令。

  • 增量檢查點

增量檢查點是一種執行緒檢查點,作用包括避免線上重做日誌切換時的大量資料塊寫入。DBW 至少每三秒執行一次檢查,判斷是否需要寫入資料。當 DBW 將髒快取寫磁碟時,同時推進檢查點位置,使得 CKPT 將檢查點位置寫入控制檔案,但不會寫入資料檔案頭部。

其他型別的檢查點包括例項與介質恢復檢查點,以及刪除或截斷模式物件時的檢查點。

例項恢復

例項恢復(Instance recovery)是將線上重做日誌檔案中的記錄應用到資料檔案的過程,用於重建最近的檢查點之後的資料變更。

當管理員嘗試開啟一個之前未能一致性關閉的資料庫時,系統自動執行例項的恢復。

例項恢復的作用

例項恢復可以確保資料庫在發生例項失敗之後能夠恢復到一致性的狀態。資料對於變更的管理方式,導致資料庫檔案可能會處於一個非一致性的狀態。

日誌執行緒(redo thread)是一個例項產生的所有變更記錄。單例項資料庫只有一個日誌執行緒,而 Oracle RAC 資料庫包含多個日誌執行緒,每個例項一個日誌執行緒。

當事務被提交時,日誌寫入程序(LGWR)將記憶體中的重做日誌項和該事務的 SCN 同時寫入線上重做日誌。但是,資料寫入(DBW)程序以系統認為的高效方式將修改後的資料塊寫入資料檔案。因此,未提交的更改可能會臨時存在資料檔案中,同時已提交的修改有可能未寫入資料檔案。

如果資料庫位於開啟狀態時發生例項失敗(可能是由於 SHUTDOWN ABORT 語句或異常終止),將會導致以下狀況:

  • 已提交的資料塊還沒有寫入資料檔案,只記錄在線上重做日誌中。這些變更必須重新應用到資料檔案中。
  • 資料檔案中包含一些例項失敗時未提交的變更。這些變更必須進行回滾,以確保事務的一致性。

例項恢復只利用線上重做日誌檔案和當前線上資料檔案執行資料檔案的同步,確保它們的一致性。

例項恢復的時間

是否需要執行例項恢復取決於日誌執行緒的狀態。

當資料庫例項以讀寫模式開啟時,對應的日誌執行緒被標記為開啟狀態,當例項一致性關閉時,日誌執行緒被標記為關閉。如果日誌執行緒在控制檔案中是開啟狀態,但是沒有對應的活動例項,資料庫需要執行例項恢復。

Oracle 資料庫在以下情況下自動執行例項恢復:

  • 單例項資料庫失敗後,或者 Oracle RAC 資料庫的所有例項失敗後,首次開啟資料庫。這種形式的例項恢復也稱為崩潰恢復。Oracle 資料庫同時恢復所有失敗例項的線上重做日誌執行緒。
  • Oracle RAC 資料庫的部分(非全部)例項失敗 。叢集中某個存活例項自動執行例項恢復操作。

後臺程序 SMON 負責執行例項恢復,自動應用線上重做日誌。整個過程不需要管理員介入。

檢查點的重要性

例項恢復時,使用檢查點決定需要應用到資料檔案中的變更。檢查點位置確保了所有 SCN 小於檢查點 SCN 的已提交變更都已儲存到資料檔案中。

下圖描繪了線上重做日誌中的日誌執行緒。
Checkpoint Position in Online Redo Log
圖 13-5 線上重做日誌中的檢查點位置

在執行例項恢復時,資料庫必須應用檢查點位置和日誌執行緒終點之間的所有變更。如圖 13-5 所示,某些變更可能已經寫入了資料檔案。但是,只有 SCN 小於檢查點位置的變更確認已經寫入磁碟之中。

例項恢復步驟

例項恢復的第一步稱為快取恢復(cache recovery)或前滾(rolling forward),將線上重做日誌中的所有變更重新應用到資料檔案中。

由於線上重做日誌中包含了撤銷資料(undo data),前滾操作也會重建相應的撤銷段(undo segment)。前滾操作應用線上重做日誌檔案將資料庫恢復到例項失敗之前的狀態。完成前滾操作之後,資料塊中包含了線上重做日誌檔案中的所有已提交變更。這些資料檔案中可能還包含一些例項失敗之前寫入的未提交變更,或者快取恢復時從線上重做日誌中引入的未提交變更。

前滾之後,未提交的變更需要回滾。Oracle 資料庫使用檢查點位置確保所有 SCN 小於檢查點 SCN 的已提交變更已經寫入磁碟。Oracle 資料庫應用撤銷塊 回滾未提交的變更(包括例項失敗之前寫入的變更和快取恢復時引入的變更)。這個階段稱為回滾(rolling back)或者事務恢復(transaction recovery)。

下圖演示了資料庫例項恢復的兩個必要步驟:前滾和回滾。
Basic Instance Recovery Steps: Rolling Forward and Rolling Back
圖 13-6 基本例項恢復操作:前滾和回滾

Oracle 資料庫可以根據需要同時回滾多個事務。例項失敗時的所有活動事務都被標記為終止。新的事務可以回滾各自的資料塊以獲取所需的資料,而不需要等待 SMON 程序回滾被終止的事務。

引數檔案

啟動資料庫例項時,Oracle 資料庫必須讀取一個伺服器引數檔案(推薦方式)或者一個文字初始化引數檔案(傳統遺留方式)。這些檔案中包含了一個配置引數的列表。

手動建立一個數據庫時,必須使用一個引數檔案啟動例項,然後執行 CREATE DATABASE 語句。例項和引數檔案可以獨立於資料庫而存在。

初始化引數

初始化引數(Initialization parameter)是一些可以影響例項操作的配置引數。例項在啟動時讀取引數檔案中的初始化引數。

Oracle 資料庫提供了許多初始化引數,用於優化不同環境下的操作。只有少數引數需要顯式設定,通常只需要使用預設值即可。

初始化引數分組

初始化引數可以按照功能分為不同的組。

大部分初始化引數屬於以下分組之一:

  • 設定實體專案(例如檔案或目錄)的引數
  • 設定程序限制、資料庫資源限制、或者資料庫自身限制的引數
  • 影響容量的引數,例如 SGA 的大小(這些引數被稱為可變引數)

資料庫管理員特別關注可變引數,因為他們可以通過這些引數優化資料庫的效能。

基本引數與高階引數

初始化引數可以分為兩類:基本引數和高階引數。

通常來說,管理員需要設定並優化大約 30 個基本的引數,以達到合理的效能。基本引數用於設定一些特性,例如資料庫名稱、控制檔案的位置、資料庫塊大小以及撤銷表空間。

在極少數情況下,管理員需要修改高階引數,以便獲得最佳效能。DBA 專家通過可以高階引數調整資料庫的行為,以滿足特定的需求。

Oracle 資料庫在安裝軟體的啟動初始化引數檔案中提供了引數值,或者可以通過資料庫配置助手(DBCA)建立這些引數。管理員可以根據自己的配置需求或者調優方案,修改 Oracle 提供的這些初始化引數,也可以增加其他引數。對於引數檔案中沒有涉及的相關初始化引數,Oracle 資料庫提供預設值。

伺服器引數檔案

服務引數檔案(server parameter file)是初始化引數的一個儲存庫。

伺服器引數檔案具有以下主要特徵:

  • 只能由 Oracle 資料庫讀寫伺服器引數檔案。
  • 一個數據庫只能有一個伺服器引數檔案。該檔案必須存放在資料庫伺服器主機中。
  • 伺服器引數檔案是一個二進位制檔案,不能使用文字編輯器進行修改。
  • 伺服器引數檔案中的初始化引數是永久儲存的。在資料庫例項執行時對引數所做的任何更改在例項關閉和啟動後仍然生效。

伺服器引數檔案使得客戶端應用不再需要維護多個文字初始化引數檔案。伺服器引數檔案通過 CREATE SPFILE 語句從文字初始化引數檔案建立。它可以通過資料庫配置助手直接建立。

文字初始化引數檔案

文字初始化引數檔案(text initialization parameter file)是一個文字檔案,內容是一個初始化引數的列表。

這種引數檔案是歷史遺留的實現方式,它具有以下主要特點:

  • 當啟動或者關閉資料庫時,文字初始化引數檔案必須位於連線到資料庫的客戶端主機中。
  • 文字初始化引數檔案時一個文字檔案,而不是二進位制檔案。
  • Oracle 資料庫可以讀取文字初始化引數檔案,但是不能寫入該檔案。要想修改引數的值,必須通過文字編輯器手動進行修改。
  • 使用 ALTER SYSTEM 語句修改的初始化引數值只在當前例項中生效。必須手動更新檔案初始化引數檔案並重啟例項才能永久生效。

文字初始化引數檔案中包含一系列 key=value 配置,每行一個配置。例如,以下是某個引數檔案中的部分內容:

db_name=sample
control_files=/disk1/oradata/sample_cf.dbf
db_block_size=8192
open_cursors=52
undo_management=auto
shared_pool_size=280M
pga_aggregate_target=29M
.
.
.

為了說明文字引數檔案可能帶來的管理問題,假設你使用了計算機 clienta 和 clientb,並且需要能夠從任意一個計算機上啟動資料庫。此時,每個計算機上都需要一個單獨的文字初始化引數檔案,如圖 13-7 所示。 服務引數檔案可以解決引數檔案的分散儲存問題。
Multiple Initialization Parameter Files
圖 13-7 多個初始化引數檔案

修改初始化引數

管理員可以通過修改初始化引數來調整資料庫的行為。引數按照修改方式分為靜態(static)引數和動態(dynamic)引數。

下列表格總結了它們的不同之處。

表 13-5 靜態初始化引數和動態初始化引數

特性 靜態引數 動態引數
需要修改引數檔案
需要重啟例項才能生效
Oracle Database Reference 中顯示為“Modifiable”
只能修改資料庫或例項相關的引數

靜態引數包括 DB_BLOCK_SIZE、DB_NAME 以及 COMPATIBLE。動態引數分為會話級別的引數(隻影響當前會話)和系統級別的引數(影響資料庫和所有會話)。例如,MEMORY_TARGET 是一個系統級引數,而 NLS_DATE_FORMAT 是一個會話級引數。

引數變更的範圍取決於變更何時生效。當例項使用伺服器引數檔案啟動時,可以使用 ALTER SYSTEM SET 語句選擇以下方式修改系統級引數:

  • SCOPE=MEMORY

    引數的變更只針對當前資料庫例項生效。資料庫關閉並重啟後變更不會持久化。

  • SCOPE=SPFILE

    引數的變更只應用於伺服器引數檔案,不會影響當前例項。因此,變更只在例項重啟之後生效。

    注意:對於那些在 Oracle Database Reference 中標識為不可更改的引數,修改時必須指定 SPFILE 。

  • SCOPE=BOTH

    Oracle 資料庫同時將變更寫入記憶體和伺服器引數檔案。這是資料庫使用伺服器引數檔案時的預設修改範圍。

診斷檔案

Oracle 資料庫提供了一個故障診斷基礎架構(fault diagnosability infrastructure),用於防止、檢測、診斷和解決資料庫問題。這些問題包括程式碼錯誤、元資料損壞以及客戶資料丟失等嚴重錯誤。

這個高階的故障診斷基礎架構的作用包括:

  • 主動發現問題
  • 檢測到問題後控制損失和系統中斷
  • 減少故障診斷和解決時間
  • 通過拆分跟蹤檔案提高可管理性,允許使用者指定每個檔案的大小,以及保留的最大檔案數量,並且在佔用的儲存到達使用者指定的磁碟空間後關閉跟蹤
  • 方便客戶與 Oracle 支援人員的交流

多租戶容器資料庫(CDB)與非 CDB 的診斷架構不同。本節內容針對非 CDB,除非另有說明。

自動診斷庫

自動診斷庫(ADR)是一個基於檔案的資料庫,用於儲存資料庫的診斷資料,例如跟蹤檔案、告警日誌、DDL 日誌以及健康健康報告。

ADR 具有以下主要特點:

  • 統一的目錄結構
  • 一致的診斷資料格式
  • 統一的工具套件

以上特性使得客戶和 Oracle 支援人員能夠關聯和分析多個例項、元件和產品的診斷資料。

ADR 儲存在資料庫之外,Oracle 資料庫在物理庫不可用時仍然能夠訪問和管理 ADR。資料庫例項在建立資料庫之前建立 ADR。

問題和事件

ADR 可以主動發現問題(problems), 它們是資料庫中的一些關鍵錯誤。

關鍵錯誤顯示為內部錯誤,例如 ORA-600,或者其他嚴重錯誤。每個問題擁有一個問題鍵(problem key),它是描述該問題的文字字串。

當一個問題多次發生時,ADR 為每次的錯誤建立一個包含時間戳的事件(incident)。事件由一個數字的事件 ID 唯一確定。當一個事件發生時, ADR 將會發送一個事件告警(incident alert)到 Enterprise Manager。一個關鍵錯誤的診斷和解決通常從一個事件告警開始。

由於一個問題可能在短時間內產生多次事件,當該事件的次數到達一個特定閾值之後,ADR 將會採用防洪控制措施。防洪控制事件只會產生一個告警日誌項,而不會產生事件轉儲資訊。ADR 通過這種方式通知使用者正在發生一個嚴重的錯誤,而不會因為產生大量的診斷資料給系統帶來壓力。

ADR 目錄結構

ADR base 是 ADR 的根目錄。

ADR 根目錄下可以存在多個 ADR 主目錄(ADR home),每個 ADR 主目錄是一個 Oracle 產品或元件的例項的診斷資料所在的根目錄,包括跟蹤檔案、轉儲檔案以及告警日誌等等。例如, 在一個使用了共享儲存和 Oracle ASM 的 Oracle RAC 環境中,每個資料庫例項和 Oracle ASM 例項都擁有各自的 ADR 主目錄。

圖 13-8 顯示了一個數據庫例項的 ADR 目錄層次結構。在相同的 ADR 根目錄下,還可以存在其他 Oracle 產品或元件的其他 ADR 主目錄,例如 Oracle ASM 或者 Oracle Net Services。
ADR Directory Structure for an Oracle Database Instance
圖 13-8 Oracle 資料庫例項的 ADR 目錄結構

以下是一個 Linux 環境的示例,當你在建立資料庫之前使用一個唯一的 SID 和資料庫名稱啟動例項時,Oracle 資料庫預設在檔案系統中建立一個 ADR 目錄結構。SID 和資料庫名稱成為了 ADR 主目錄中的檔案路徑的一部分。

示例 13-1 建立 ADR

% setenv ORACLE_SID osi
% echo "DB_NAME=dbn" > init.ora
% sqlplus / as sysdba
.
.
. 
Connected to an idle instance.
 
SQL> STARTUP NOMOUNT PFILE="./init.ora"
ORACLE instance started.
 
Total System Global Area  146472960 bytes
Fixed Size                  1317424 bytes
Variable Size              92276176 bytes
Database Buffers           50331648 bytes
Redo Buffers                2547712 bytes
 
SQL> COL NAME FORMAT a21
SQL> COL VALUE FORMAT a60
SQL> SELECT NAME, VALUE FROM V$DIAG_INFO;
 
NAME                  VALUE
--------------------- --------------------------------------------------------
Diag Enabled          TRUE
ADR Base              /d1/3910926111/oracle/log
ADR Home              /d1/3910926111/oracle/log/diag/rdbms/dbn/osi
Diag Trace            /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/trace
Diag Alert            /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/alert
Diag Incident         /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/incident
Diag Cdump            /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/cdump
Health Monitor        /d1/3910926111/oracle/log/diag/rdbms/dbn/osi/hm
Default Trace File    /d1/3910926111/oracle/log ... osi/trace/osi_ora_6825.trc
Active Problem Count  0
Active Incident Count 0

告警日誌

每個資料庫都有一個告警日誌,它是一個 XML 檔案,其中包含了資料庫訊息和錯誤的時間日誌。

告警日誌包含以下內容:

  • 所有內部錯誤(ORA-600),塊損壞錯誤(ORA-1578)以及死鎖錯誤(ORA-60)
  • 資料庫管理操作,例如 SQL*Plus 的 STARTUP、
    SHUTDOWN、ARCHIVE LOG 以及 RECOVER 命令
  • 與共享伺服器和排程程序功能相關的一些訊息和錯誤
  • 物化檢視自動重新整理錯誤

Oracle 資料庫使用告警日誌作為在 Enterprise Manager GUI 中顯示資訊的替代方案。如果成功執行一個管理操作,Oracle 資料庫將會在告警日誌中寫入一個帶時間戳的“已完成”的訊息。

首次啟動一個例項時,Oracle 資料庫在圖 13-8 所示的 alert 子目錄中建立一個告警日誌檔案,即使還沒有建立資料庫。該檔案使用 XML 格式。在 trace 子目錄中存在一個純文字的告警日誌,以下是某個告警日誌的一部分:

Fri Nov 02 12:41:58 2014
SMP system found. enable_NUMA_support disabled (FALSE)
Starting ORACLE instance (normal)
CLI notifier numLatches:3 maxDescs:189
LICENSE_MAX_SESSION = 0
LICENSE_SESSIONS_WARNING = 0
Initial number of CPU is 2
Number of processor cores in the system is 2
Number of processor sockets in the system is 2
Shared memory segment for instance monitoring created
Picked latch-free SCN scheme 3
Using LOG_ARCHIVE_DEST_1 parameter default value as /disk1/oracle/dbs/arch
Autotune of undo retention is turned on.
IMODE=BR
ILAT =10
LICENSE_MAX_USERS = 0
SYS auditing is disabled
NOTE: remote asm mode is local (mode 0x1; from cluster type)
Starting up:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Advanced Analytics and Real Application Testing options.
.
.
.
Using parameter settings in client-side pfile 
System parameters with nondefault values:
  processes                = 100
  sessions                 = 172

正如示例 13-1所示,可以查詢 V$DIAG_INFO 找到告警日誌檔案的位置。

DDL 日誌

DDL 日誌(DDL log)的格式及基本特性和告警日誌相同,但是隻包含了 DDL 語句和相關細節資訊。資料庫將 DDL 的資訊寫入單獨的檔案,以便減少告警日誌的複雜性。

DDL 日誌記錄 DDL 文字,或者一些額外的資訊。每個 DDL 語句記錄一條日誌。DDL 儲存在 ADR 主目錄下的 log/ddl 子目錄中。

跟蹤檔案

跟蹤檔案(trace file)儲存了用於調查問題的診斷資料。同時,跟蹤檔案還可以為應用程式或例項優化的提供指導。

跟蹤檔案的型別

每個伺服器程序或後臺程序都可以定期寫入一個關聯的跟蹤檔案。該檔案中包含了程序環境、狀態、活動以及錯誤的資訊。

SQL 跟蹤工具也可以建立跟蹤檔案,為特定 SQL 語句提供效能相關的資訊。可以以不同的方式為指定客戶端標識、服務、模組、操作、會話、例項或者資料庫啟用跟蹤。例如,可以通過執行 DBMS_MONITOR 包中的相應過程或者設定事件的方式啟動跟蹤。

跟蹤檔案的位置

ADR 在 trace 子目錄中儲存跟蹤檔案。跟蹤檔名稱取決於不同的系統,並且使用 .trc 副檔名。

通常來說資料庫後臺程序的跟蹤檔名稱包含 Oracle SID、後臺程序名以及作業系統程序編號。mytest_reco_10355.trc 是 一個 RECO 程序跟蹤檔案的示例。

伺服器程序的跟蹤檔名稱包含 Oracle SID、字串“ora”以及作業系統程序編號。mytest_ora_10304.trc 是一個伺服器程序跟蹤檔案的示例。

有時候跟蹤檔案還擁有一個跟蹤元資料檔案,使用副檔名 .trm。這些檔案中包含了稱為跟蹤對映(trace maps)的結構資訊,資料庫利用這些資訊進行搜尋和導航。

跟蹤檔案的拆分

如果設定了跟蹤檔案的大小限制,資料庫自動將其拆分成最多五個分段。每個分段都是獨立的檔案,名稱和活動的跟蹤檔案一致,只是加上了一個編號,例如 ora_1234_2.trc。

每個分段通常是 MAX_DUMP_FILE_SIZE 引數的 20% 大小。每當所有分段的總大小超過了限制,資料庫將會刪除最早的分段(永遠不會刪除第一個分段,因為它包含了程序初始狀態的相關資訊),然後建立一個新的空分段檔案。

診斷轉儲檔案

診斷轉儲檔案(diagnostic dump file)是一種特殊的跟蹤檔案,包含了關於某個狀態或結構的詳細時間點資訊。

跟蹤往往是連續的診斷資料。與此相反,轉儲通常是針對某一事件的一次性診斷資料。

跟蹤轉儲與事件

大多數跟蹤轉儲由事件觸發。

當一個事件發生時,資料庫在該事件的事件目錄中寫入一個或多個轉儲檔案。事件轉儲檔案的名稱中還包含了事件編號。

建立事件時,應用可能會為某個操作產生一個堆轉儲或者系統狀態轉儲。這種情況下,資料庫將轉儲名稱新增到事件檔名之後,而不是預設的跟蹤檔名之後。例如,由於一個程序的產生事件時,資料庫建立 prod_ora_90348.trc 檔案。該事件的轉儲操作產生 prod_ora_90348_incident_id.trc 檔案,其中 incident_id 是該事件的數字 ID。隨著該事件建立的堆轉儲操作產生一個堆轉儲檔案 prod_ora_90348_incident_id_dump_id.trc,其中 dump_id 是跟蹤轉儲的數字 ID。