Oracle 数据库实例介绍
文章目錄
- 數據庫實例介紹
- 實例結構
- 實例配置
- 讀寫實例與只讀實例
- 實例生命周期
- 實例標識
- Oracle 根目錄
- Oracle 主目錄
- Oracle SID
- 實例啟動與關閉
- 啟動實例與數據庫
- 管理員登錄
- 啟動實例
- 加載數據庫
- 打開數據庫
- 只讀模式
- 數據庫文件檢查
- 關閉數據庫與實例
- 關閉模式
- 關閉數據庫
- 正常關閉
- 異常關閉
- 卸載數據庫
- 關閉實例
- 檢查點
- 檢查點的作用
- 檢查點觸發時機
- 實例恢復
- 實例恢復的作用
- 實例恢復的時間
- 檢查點的重要性
- 實例恢復步驟
- 參數文件
- 初始化參數
- 初始化參數分組
- 基本參數與高級參數
- 服務器參數文件
- 文本初始化參數文件
- 修改初始化參數
- 診斷文件
- 自動診斷庫
- 問題和事件
- ADR 目錄結構
- 告警日志
- DDL 日志
- 跟蹤文件
- 跟蹤文件的類型
- 跟蹤文件的位置
- 跟蹤文件的拆分
- 診斷轉儲文件
- 跟蹤轉儲與事件
文章翻譯源于 Oracle Database Database Concepts, 18c
本章介紹 Oracle 數據庫實例的原理,實例的參數文件和診斷文件,以及實例創建和數據庫的打開與關閉的過程。
本章包含以下內容:
- 數據庫實例介紹
- 實例啟動與關閉
- 檢查點
- 實例恢復
- 參數文件
- 診斷文件
數據庫實例介紹
數據庫實例(instance)是一組用于管理數據庫文件的內存結構。
數據庫是一組位于磁盤上的物理文件,通過 CREATE DATABASE 語句創建。實例管理相關的數據,并且為數據庫用戶提供服務。
每個正在運行的 Oracle 數據庫至少與一個實例相關聯。因為實例存在于內存中,而數據庫存在磁盤上,所以實例可以獨立于數據庫存在,數據庫也可以獨立于實例存在。
實例結構
當一個實例啟動時,Oracle 數據庫分配一個稱為系統全局區(SGA)的內存區域,并啟動一個或多個后臺進程。
SGA 的作用包括:
- 維護多個進程和線程并發訪問的內部數據結構
- 緩存從磁盤讀取的數據塊
- 在寫入在線重做日志文件之前緩沖重做數據
- 存儲 SQL 執行計劃
同一個服務器上的 Oracle 進程之間共享 SGA。Oracle 進程與 SGA 的交互方式取決于操作系統。
一個數據庫實例包括多個后臺進程(background process)。服務器進程(server process),以及分配給它們的內存,也位于實例之中。實例在服務器進程結束后仍然繼續存在。
下圖顯示了 Oracle 數據庫實例中的主要組件。
圖 13- 1 數據庫實例
實例配置
Oracle 數據庫支持單實例配置和真正應用集群(Oracle RAC)配置。這兩種配置只能二選其一。
在單實例配置中,數據庫和實例之間一一對應。在 Oracle RAC 中,數據庫和實例存在一對多的關系。
下圖顯示了兩種可能的數據庫實例配置。
圖 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_1Oracle SID
系統標識符(SID) 是一個主機上的 Oracle 數據庫實例的唯一名稱。
在 UNIX 和 Linux 系統上,Oracle 數據庫使用 SID 和 Oracle 主目錄的路徑名稱作為共享內存的鍵值。 另外,Oracle 數據庫默認使用 SID 查找初始化參數文件,通過初始化文件查找其他相關文件,例如數據庫控制文件。
在大多數平臺上,使用 ORACLE_SID 環境變量設置 SID,使用 ORACLE_HOME 變量設置 Oracle 主目錄??蛻舳诉B接數據庫實例時,可以在 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 權限進行連接。
監聽器啟動一個專用的服務器進程,用于啟動數據庫實例。
下圖顯示了數據庫從關閉到打開的處理過程。
圖 13-3 實例與數據庫啟動順序
數據庫從關閉狀態到打開狀態需要經歷以下幾個階段。
表 13-2 實例啟動階段
| 1 | 啟動實例,未加載數據庫 | 啟動一個實例,但沒有與數據庫關聯。 | 啟動實例 |
| 2 | 加載數據庫 | 實例已經啟動,并且讀取數據庫的控制文件。數據庫對用戶不可用。 | 加載數據庫 |
| 3 | 打開數據庫 | 實例已經啟動,并且打開數據庫。授權用戶可以訪問數據文件中的數據。 | 打開數據庫 |
管理員登錄
數據庫的啟動和關閉是非常強大的管理功能,只能由具有管理員權限的用戶執行。
普通用戶無法控制數據庫的當前狀態。根據操作系統的不同,用戶可以通過以下方式獲得管理員權限:
- 用戶的操作系統權限允許他/她已管理員權限連接到數據庫。
- 用戶被授予特殊的系統權限,數據庫使用口令文件認證通過網絡連接的管理員
以下特殊的系統權限能夠在數據庫未打開時訪問實例:
- SYSDBA
- SYSOPER
- SYSBACKUP
- SYSDG
- SYSKM
以上權限的管理不在數據庫的自身范圍之內。使用 SYSDBA 系統權限連接時,用戶位于 SYS 模式中。使用 SYSOPER 連接時,用戶位于公共模式中。SYSOPER 權限是 SYSDBA 權限的一個子集。
啟動實例
當 Oracle 數據庫啟動一個實例時,需要經過幾個階段。
實例啟動階段包括:
在這一階段,實例還沒有關聯到數據庫。NOMOUNT 狀態的使用場景包括數據庫創建以及備份與恢復操作。
加載數據庫
實例通過加載數據庫與其進行關聯。
加載數據庫時,實例通過初始化參數 CONTROL_FILES 獲取數據庫控制文件 的名稱并打開這些文件。Oracle 數據庫讀取控制文件,獲取數據文件和在線重做日志文件的名稱,在打開數據庫時需要訪問這些文件。
加載之后,數據庫處于關閉狀態,只允許管理員訪問。管理員可以在保持數據庫關閉的同時執行一些特定的維護操作。但是,此時數據庫還不能執行一些常規操作。
如果 Oracle 數據庫允許多個實例同時加載相同的數據庫,初始化參數 CLUSTER_DATABASE 可以設置多個實例訪問該數據庫。具體的行為取決于該參數的值:
- 如果第一個加載數據庫的實例的 CLUSTER_DATABASE 設置為 false(默認值),只有該實例能夠加載數據庫。
- 如果第一個加載數據庫的實例的 CLUSTER_DATABASE 設置為 true,其他實例在 CLUSTER_DATABASE 也設置為 true 時可以加載該數據庫??梢酝瑫r加載同一個數據庫的實例數量由創建數據庫時的預定義值決定。
打開數據庫
打開一個已加載的數據庫意味著可以對其執行常規的操作。
任何有效的用戶都可以連接到一個打開的數據庫,并且訪問其中的信息。通常來說,數據庫管理員負責打開數據庫。
打開數據庫時, Oracle 數據庫將會執行以下操作:
-
打開撤銷表空間(undo tablespace)之外的其他表空間的在線數據文件
如果一個表空間在數據庫關閉之前處于離線(offline)狀態,重新打開數據庫時,該表空間和相應的數據文件仍然處于離線狀態。
-
獲取一個撤銷表空間
如果存在多個撤銷表空間,由初始化參數 UNDO_TABLESPACE 決定使用哪個表空間。如果沒有設置該參數,使用第一個可用的撤銷表空間。
-
打開在線重做日志文件
只讀模式
默認情況下,數據庫以讀/寫模式打開。在這種模式下,用戶可以修改數據,產生重做日志項。另外,數據庫可以以只讀模式打開,防止用戶事務修改數據。
注意:默認情況下,物理備用數據庫以只讀模式打開。
只讀模式下的數據庫只能執行只讀事務,不能寫入數據文件或者在線重做日志文件。不過,數據庫仍然能夠執行恢復操作或者不產生重做日志的操作。例如,只讀模式支持以下操作:
- 將數據文件離線或者在線。但是,不能將永久表空間離線。
- 恢復離線的數據文件和表空間。
- 修改控制文件中關于數據庫狀態的信息。
- 使用 CREATE TEMPORARY TABLESPACE 語句創建的臨時表空間允許讀寫操作。
- 寫入操作系統的審計文件、跟蹤文件以及告警日志。
數據庫文件檢查
如果打開數據庫時,任何數據文件或重做日志文件不存在,或者它們存在但是一致性檢測失敗,數據庫將會返回一個錯誤。此時需要執行介質恢復。
關閉數據庫與實例
通常來說,管理員在執行維護操作或其他管理任務時手動關閉數據庫??梢允褂?SQL*Plus 的 SHUTDOWN 命令或者 Enterprise Manager 執行這些操作。
下圖演示了數據庫從打開狀態到一致性關閉的過程。
圖 13-4 實例與數據庫關閉順序
Oracle 數據庫從打開到一致性關閉時自動執行以下操作。
表 13-3 一致性關閉的步驟
| 1 | 關閉數據庫 | 數據庫處于加載狀態,但是在線數據文件和重做日志文件被關閉。 | 關閉數據庫 |
| 2 | 卸載數據庫 | 實例處于啟動狀態,但是不再關聯數據庫的控制文件。 | 卸載數據庫 |
| 3 | 關閉實例 | 實例被關閉,不再處于啟動狀態。 | 關閉實例 |
Oracle 數據庫在出現實例失敗或者執行 SHUTDOWN ABORT (立即終止實例)命令時,不會執行以上操作。
關閉模式
具有 SYSDBA 或者 SYSOPER 權限的數據庫管理員可以使用 SQL*Plus 的 SHUTDOWN 命令或 Enterprise Manager 關閉數據庫。SHUTDOWN 命令包含了不同的關閉選項。
下表總結了不同的關閉模式。
表 13-4 數據庫關閉模式
| 運行新用戶連接 | 否 | 否 | 否 | 否 |
| 等待當前會話結束 | 否 | 否 | 否 | 是 |
| 等待當前事務結束 | 否 | 否 | 是 | 是 |
| 執行檢查點并關閉打開的文件 | 否 | 是 | 是 | 是 |
不同的 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 的已提交變更都已保存到數據文件中。
下圖描繪了在線重做日志中的日志線程。
圖 13-5 在線重做日志中的檢查點位置
在執行實例恢復時,數據庫必須應用檢查點位置和日志線程終點之間的所有變更。如圖 13-5 所示,某些變更可能已經寫入了數據文件。但是,只有 SCN 小于檢查點位置的變更確認已經寫入磁盤之中。
實例恢復步驟
實例恢復的第一步稱為緩存恢復(cache recovery)或前滾(rolling forward),將在線重做日志中的所有變更重新應用到數據文件中。
由于在線重做日志中包含了撤銷數據(undo data),前滾操作也會重建相應的撤銷段(undo segment)。前滾操作應用在線重做日志文件將數據庫恢復到實例失敗之前的狀態。完成前滾操作之后,數據塊中包含了在線重做日志文件中的所有已提交變更。這些數據文件中可能還包含一些實例失敗之前寫入的未提交變更,或者緩存恢復時從在線重做日志中引入的未提交變更。
前滾之后,未提交的變更需要回滾。Oracle 數據庫使用檢查點位置確保所有 SCN 小于檢查點 SCN 的已提交變更已經寫入磁盤。Oracle 數據庫應用撤銷塊 回滾未提交的變更(包括實例失敗之前寫入的變更和緩存恢復時引入的變更)。這個階段稱為回滾(rolling back)或者事務恢復(transaction recovery)。
下圖演示了數據庫實例恢復的兩個必要步驟:前滾和回滾。
圖 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 所示。 服務參數文件可以解決參數文件的分散存儲問題。
圖 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。
圖 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 bytesSQL> 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 = 100sessions = 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。
總結
以上是生活随笔為你收集整理的Oracle 数据库实例介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看完这篇还不知道css固定和自适应可以小
- 下一篇: 前端学习(1247):购物车1