Oracle 数据库实例介绍
文章目錄
- 數(shù)據(jù)庫實例介紹
- 實例結(jié)構(gòu)
- 實例配置
- 讀寫實例與只讀實例
- 實例生命周期
- 實例標(biāo)識
- Oracle 根目錄
- Oracle 主目錄
- Oracle SID
- 實例啟動與關(guān)閉
- 啟動實例與數(shù)據(jù)庫
- 管理員登錄
- 啟動實例
- 加載數(shù)據(jù)庫
- 打開數(shù)據(jù)庫
- 只讀模式
- 數(shù)據(jù)庫文件檢查
- 關(guān)閉數(shù)據(jù)庫與實例
- 關(guān)閉模式
- 關(guān)閉數(shù)據(jù)庫
- 正常關(guān)閉
- 異常關(guān)閉
- 卸載數(shù)據(jù)庫
- 關(guān)閉實例
- 檢查點
- 檢查點的作用
- 檢查點觸發(fā)時機
- 實例恢復(fù)
- 實例恢復(fù)的作用
- 實例恢復(fù)的時間
- 檢查點的重要性
- 實例恢復(fù)步驟
- 參數(shù)文件
- 初始化參數(shù)
- 初始化參數(shù)分組
- 基本參數(shù)與高級參數(shù)
- 服務(wù)器參數(shù)文件
- 文本初始化參數(shù)文件
- 修改初始化參數(shù)
- 診斷文件
- 自動診斷庫
- 問題和事件
- ADR 目錄結(jié)構(gòu)
- 告警日志
- DDL 日志
- 跟蹤文件
- 跟蹤文件的類型
- 跟蹤文件的位置
- 跟蹤文件的拆分
- 診斷轉(zhuǎn)儲文件
- 跟蹤轉(zhuǎn)儲與事件
文章翻譯源于 Oracle Database Database Concepts, 18c
本章介紹 Oracle 數(shù)據(jù)庫實例的原理,實例的參數(shù)文件和診斷文件,以及實例創(chuàng)建和數(shù)據(jù)庫的打開與關(guān)閉的過程。
本章包含以下內(nèi)容:
- 數(shù)據(jù)庫實例介紹
- 實例啟動與關(guān)閉
- 檢查點
- 實例恢復(fù)
- 參數(shù)文件
- 診斷文件
數(shù)據(jù)庫實例介紹
數(shù)據(jù)庫實例(instance)是一組用于管理數(shù)據(jù)庫文件的內(nèi)存結(jié)構(gòu)。
數(shù)據(jù)庫是一組位于磁盤上的物理文件,通過 CREATE DATABASE 語句創(chuàng)建。實例管理相關(guān)的數(shù)據(jù),并且為數(shù)據(jù)庫用戶提供服務(wù)。
每個正在運行的 Oracle 數(shù)據(jù)庫至少與一個實例相關(guān)聯(lián)。因為實例存在于內(nèi)存中,而數(shù)據(jù)庫存在磁盤上,所以實例可以獨立于數(shù)據(jù)庫存在,數(shù)據(jù)庫也可以獨立于實例存在。
實例結(jié)構(gòu)
當(dāng)一個實例啟動時,Oracle 數(shù)據(jù)庫分配一個稱為系統(tǒng)全局區(qū)(SGA)的內(nèi)存區(qū)域,并啟動一個或多個后臺進(jìn)程。
SGA 的作用包括:
- 維護(hù)多個進(jìn)程和線程并發(fā)訪問的內(nèi)部數(shù)據(jù)結(jié)構(gòu)
- 緩存從磁盤讀取的數(shù)據(jù)塊
- 在寫入在線重做日志文件之前緩沖重做數(shù)據(jù)
- 存儲 SQL 執(zhí)行計劃
同一個服務(wù)器上的 Oracle 進(jìn)程之間共享 SGA。Oracle 進(jìn)程與 SGA 的交互方式取決于操作系統(tǒng)。
一個數(shù)據(jù)庫實例包括多個后臺進(jìn)程(background process)。服務(wù)器進(jìn)程(server process),以及分配給它們的內(nèi)存,也位于實例之中。實例在服務(wù)器進(jìn)程結(jié)束后仍然繼續(xù)存在。
下圖顯示了 Oracle 數(shù)據(jù)庫實例中的主要組件。
圖 13- 1 數(shù)據(jù)庫實例
實例配置
Oracle 數(shù)據(jù)庫支持單實例配置和真正應(yīng)用集群(Oracle RAC)配置。這兩種配置只能二選其一。
在單實例配置中,數(shù)據(jù)庫和實例之間一一對應(yīng)。在 Oracle RAC 中,數(shù)據(jù)庫和實例存在一對多的關(guān)系。
下圖顯示了兩種可能的數(shù)據(jù)庫實例配置。
圖 13-2 數(shù)據(jù)庫實例配置
無論是單實例還是 Oracle RAC 配置,一個實例每次只能與一個數(shù)據(jù)庫關(guān)聯(lián)。管理員可以啟動一個實例,然后加載(關(guān)聯(lián))一個數(shù)據(jù)庫,但是不能同時加載兩個數(shù)據(jù)庫。
注意:除非特別指出,本章討論單實例數(shù)據(jù)庫配置。
一臺服務(wù)器上可以同時運行多個實例,每個實例管理各自的數(shù)據(jù)庫。例如,某臺服務(wù)器上擁有兩個不同的數(shù)據(jù)庫:prod1 和 prod2。一個實例管理 prod1另一個實例管理 prod2。
讀寫實例與只讀實例
實例支持兩種模式:讀寫實例與只讀實例。
對于讀寫實例,可以處理 DML 操作,支持客戶端的直接連接請求。這是默認(rèn)方式。與此相反,只讀實例能夠運行查詢,但是不能支持 DML修改操作(UPDATE、DELETE、INSERT 以及 MERGE),也不能從客戶端直接進(jìn)行連接。
注意:除非另外指明,本文檔中的實例都是指讀寫實例。
在之前的版本中,所有的實例(除非管理一個 standby 數(shù)據(jù)庫)都是讀寫實例。從 Oracle 數(shù)據(jù)庫 12c (12.2) 開始, 一個數(shù)據(jù)庫可以同時存在只讀實例和讀寫實例。這種配置對于即查詢數(shù)據(jù)又修改數(shù)據(jù)庫的并行 SQL 語句非常有用,因為讀寫實例和只讀實例都能夠查詢數(shù)據(jù),而讀寫實例能夠修改數(shù)據(jù)。
與讀寫實例相比,只讀實例具有以下特點:
- 只能打開一個已經(jīng)被讀寫實例打開的數(shù)據(jù)庫
- 禁用了許多不必要的后臺進(jìn)程,包檢查點進(jìn)程和歸檔進(jìn)程
- 可以加載一個被禁用的重做線程或者沒有任何在線重做日期的線程
要想將實例設(shè)置為只讀模式,可以將初始化參數(shù) INSTANCE_MODE 設(shè)置為 READ_ONLY。該參數(shù)的默認(rèn)值為 READ_WRITE。
實例生命周期
數(shù)據(jù)庫實例從 STARTUP 命令創(chuàng)建開始,直到被終止時結(jié)束。
在此期間,一個實例能且只能與一個數(shù)據(jù)庫相關(guān)聯(lián)。進(jìn)一步而言,該實例只能加載數(shù)據(jù)庫一次、打開數(shù)據(jù)庫一次,并且關(guān)閉數(shù)據(jù)庫一次。在數(shù)據(jù)庫關(guān)閉之后,必須重新啟動一個實例,然后加載并打開數(shù)據(jù)庫。
下表演示了一個實例嘗試重新打開之前關(guān)閉的數(shù)據(jù)庫的過程。
表 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 命令創(chuàng)建一個實例,然后加載并打開數(shù)據(jù)庫。 |
| 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 | 該查詢顯示了當(dāng)前實例的啟動時間。 |
| SQL> SHUTDOWN IMMEDIATE | 關(guān)閉數(shù)據(jù)庫和實例,結(jié)束實例的生命周期。 |
| SQL> STARTUP Oracle instance started… . . | STARTUP 命令創(chuàng)建一個新的實例,然后加載并打開數(shù)據(jù)庫。 |
| 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 | 該查詢顯示了當(dāng)前實例的啟動時間。不同的啟動時間表明了這是一個新的實例。 |
實例標(biāo)識
一個主機上可以運行多個數(shù)據(jù)庫實例。因此,訪問時需要指定訪問哪個實例。
Oracle 最優(yōu)靈活體系結(jié)構(gòu)(OFA)規(guī)則是一組配置指南,可以確保組織良好的 Oracle 軟件安裝。本節(jié)中的示例使用 OFA 體系結(jié)構(gòu)。
本節(jié)包含以下主題:
- Oracle 根目錄
- Oracle 主目錄
- Oracle 系統(tǒng)標(biāo)識符(SID)
Oracle 根目錄
Oracle 根目錄(Oracle Base directory)存儲 Oracle 產(chǎn)品的二進(jìn)制文件。
Oracle 根目錄是 Oracle 數(shù)據(jù)庫安裝擁有者的數(shù)據(jù)庫主目錄。一個主機上可以按照多個 Oracle 數(shù)據(jù)庫,以及多個 Oracle 數(shù)據(jù)庫軟件安裝的擁有者。
以下示例顯示了操作系統(tǒng)用戶 oracle 的 Oracle 根目錄:
/u01/app/oracle在路徑的前綴中, /u01/ 是存儲的掛載點, /u01/app/ 是安裝應(yīng)用軟件的分支目錄。
Oracle 主目錄
Oracle 主目錄(Oracle home directory)是 Oracle 數(shù)據(jù)庫軟件的安裝位置。
每個新的 Oracle 數(shù)據(jù)庫軟件安裝都需要指定一個新的 Oracle 主目錄。默認(rèn)情況下,Oracle 主目錄是 Oracle 根目錄(ORACLE_BASE)下的一個子目錄。
在同一個主機上,相同的 Oracle 根目錄下,可以安裝不同版本的數(shù)據(jù)庫軟件。歸屬于不同系統(tǒng)用戶的不同版本的多個數(shù)據(jù)庫可以并存。
以下示例顯示了三個不同的 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/)之后的部分包含了產(chǎn)品版本編號(例如 12.1.0)和 Oracle 主目錄的相對路徑(例如 dbhome_1)目錄 /u01/app/oracle/product/12.1.0/ 中包含了兩個不同的 Oracle 主目錄: dbhome_1 和 dbhome_2。
從 Oracle Database 18c 開始,支持創(chuàng)建只讀的 Oracle 主目錄,將其作為一個軟件的映像。只讀 Oracle 主目錄存儲靜態(tài)文件,例如二進(jìn)制程序。Oracle 根主目錄(ORACLE_BASE_HOME)位于 ORACLE_BASE/homes/home_name,存儲與特定 Oracle 主目錄相關(guān)的動態(tài)文件。Oracle 根配置目錄(ORACLE_BASE_CONFIG)由 Oracle 根目錄中的所有 Oracle 主目錄共享,用于存儲實例相關(guān)的動態(tài)文件。
以下示例中,第一個路徑是一個只讀 Oracle 主目錄,第二個路徑是其對應(yīng)的 根主目錄:
/u01/app/oracle/product/18.0.0/ro_dbhome_1 /u01/app/oracle/homes/ro_dbhome_1Oracle SID
系統(tǒng)標(biāo)識符(SID) 是一個主機上的 Oracle 數(shù)據(jù)庫實例的唯一名稱。
在 UNIX 和 Linux 系統(tǒng)上,Oracle 數(shù)據(jù)庫使用 SID 和 Oracle 主目錄的路徑名稱作為共享內(nèi)存的鍵值。 另外,Oracle 數(shù)據(jù)庫默認(rèn)使用 SID 查找初始化參數(shù)文件,通過初始化文件查找其他相關(guān)文件,例如數(shù)據(jù)庫控制文件。
在大多數(shù)平臺上,使用 ORACLE_SID 環(huán)境變量設(shè)置 SID,使用 ORACLE_HOME 變量設(shè)置 Oracle 主目錄。客戶端連接數(shù)據(jù)庫實例時,可以在 Oracle Net 連接中指定 SID,或者使用一個網(wǎng)絡(luò)服務(wù)名(service name)。 Oracle 數(shù)據(jù)庫將服務(wù)名轉(zhuǎn)換為 ORACLE_HOME 和 ORACLE_SID。
傳統(tǒng)的可讀寫 Oracle 主目錄包含了實例相關(guān)的文件。但是,如果 Oracle 主目錄改為只讀,實例相關(guān)的文件單獨存儲在 Oracle 根目錄中。無論哪種情況,名稱中包含 SID 的文件存儲在 Oracle 主配置目錄(ORACLE_BASE_CONFIG)的 dbs 子目錄中。有了這種文件分離,用戶可以使用只讀 Oracle 主目錄中的軟件創(chuàng)建數(shù)據(jù)庫,然后使用另一個只讀 Oracle 主目錄中的軟件啟動一個實例,管理該數(shù)據(jù)庫。
實例啟動與關(guān)閉
數(shù)據(jù)庫實例(database instance)為用戶提供數(shù)據(jù)庫訪問。實例和數(shù)據(jù)庫存在各種不同的狀態(tài)。
啟動實例與數(shù)據(jù)庫
通常來說,管理員手動啟動一個實例,然后加載并打開數(shù)據(jù)庫,接受客戶端連接。這些操作可以通過 SQL*Plus 的 STARTUP 命令、 Oracle 企業(yè)管理器(Enterprise Manager)或者 SRVCTL 工具完成。
如果使用 Oracle Net 啟動一個數(shù)據(jù)庫實例,需要滿足以下條件:
- 數(shù)據(jù)庫通過靜態(tài)方式注冊到 Oracle Net 監(jiān)聽器中。
- 使用 SYSDBA 權(quán)限進(jìn)行連接。
監(jiān)聽器啟動一個專用的服務(wù)器進(jìn)程,用于啟動數(shù)據(jù)庫實例。
下圖顯示了數(shù)據(jù)庫從關(guān)閉到打開的處理過程。
圖 13-3 實例與數(shù)據(jù)庫啟動順序
數(shù)據(jù)庫從關(guān)閉狀態(tài)到打開狀態(tài)需要經(jīng)歷以下幾個階段。
表 13-2 實例啟動階段
| 1 | 啟動實例,未加載數(shù)據(jù)庫 | 啟動一個實例,但沒有與數(shù)據(jù)庫關(guān)聯(lián)。 | 啟動實例 |
| 2 | 加載數(shù)據(jù)庫 | 實例已經(jīng)啟動,并且讀取數(shù)據(jù)庫的控制文件。數(shù)據(jù)庫對用戶不可用。 | 加載數(shù)據(jù)庫 |
| 3 | 打開數(shù)據(jù)庫 | 實例已經(jīng)啟動,并且打開數(shù)據(jù)庫。授權(quán)用戶可以訪問數(shù)據(jù)文件中的數(shù)據(jù)。 | 打開數(shù)據(jù)庫 |
管理員登錄
數(shù)據(jù)庫的啟動和關(guān)閉是非常強大的管理功能,只能由具有管理員權(quán)限的用戶執(zhí)行。
普通用戶無法控制數(shù)據(jù)庫的當(dāng)前狀態(tài)。根據(jù)操作系統(tǒng)的不同,用戶可以通過以下方式獲得管理員權(quán)限:
- 用戶的操作系統(tǒng)權(quán)限允許他/她已管理員權(quán)限連接到數(shù)據(jù)庫。
- 用戶被授予特殊的系統(tǒng)權(quán)限,數(shù)據(jù)庫使用口令文件認(rèn)證通過網(wǎng)絡(luò)連接的管理員
以下特殊的系統(tǒng)權(quán)限能夠在數(shù)據(jù)庫未打開時訪問實例:
- SYSDBA
- SYSOPER
- SYSBACKUP
- SYSDG
- SYSKM
以上權(quán)限的管理不在數(shù)據(jù)庫的自身范圍之內(nèi)。使用 SYSDBA 系統(tǒng)權(quán)限連接時,用戶位于 SYS 模式中。使用 SYSOPER 連接時,用戶位于公共模式中。SYSOPER 權(quán)限是 SYSDBA 權(quán)限的一個子集。
啟動實例
當(dāng) Oracle 數(shù)據(jù)庫啟動一個實例時,需要經(jīng)過幾個階段。
實例啟動階段包括:
在這一階段,實例還沒有關(guān)聯(lián)到數(shù)據(jù)庫。NOMOUNT 狀態(tài)的使用場景包括數(shù)據(jù)庫創(chuàng)建以及備份與恢復(fù)操作。
加載數(shù)據(jù)庫
實例通過加載數(shù)據(jù)庫與其進(jìn)行關(guān)聯(lián)。
加載數(shù)據(jù)庫時,實例通過初始化參數(shù) CONTROL_FILES 獲取數(shù)據(jù)庫控制文件 的名稱并打開這些文件。Oracle 數(shù)據(jù)庫讀取控制文件,獲取數(shù)據(jù)文件和在線重做日志文件的名稱,在打開數(shù)據(jù)庫時需要訪問這些文件。
加載之后,數(shù)據(jù)庫處于關(guān)閉狀態(tài),只允許管理員訪問。管理員可以在保持?jǐn)?shù)據(jù)庫關(guān)閉的同時執(zhí)行一些特定的維護(hù)操作。但是,此時數(shù)據(jù)庫還不能執(zhí)行一些常規(guī)操作。
如果 Oracle 數(shù)據(jù)庫允許多個實例同時加載相同的數(shù)據(jù)庫,初始化參數(shù) CLUSTER_DATABASE 可以設(shè)置多個實例訪問該數(shù)據(jù)庫。具體的行為取決于該參數(shù)的值:
- 如果第一個加載數(shù)據(jù)庫的實例的 CLUSTER_DATABASE 設(shè)置為 false(默認(rèn)值),只有該實例能夠加載數(shù)據(jù)庫。
- 如果第一個加載數(shù)據(jù)庫的實例的 CLUSTER_DATABASE 設(shè)置為 true,其他實例在 CLUSTER_DATABASE 也設(shè)置為 true 時可以加載該數(shù)據(jù)庫。可以同時加載同一個數(shù)據(jù)庫的實例數(shù)量由創(chuàng)建數(shù)據(jù)庫時的預(yù)定義值決定。
打開數(shù)據(jù)庫
打開一個已加載的數(shù)據(jù)庫意味著可以對其執(zhí)行常規(guī)的操作。
任何有效的用戶都可以連接到一個打開的數(shù)據(jù)庫,并且訪問其中的信息。通常來說,數(shù)據(jù)庫管理員負(fù)責(zé)打開數(shù)據(jù)庫。
打開數(shù)據(jù)庫時, Oracle 數(shù)據(jù)庫將會執(zhí)行以下操作:
-
打開撤銷表空間(undo tablespace)之外的其他表空間的在線數(shù)據(jù)文件
如果一個表空間在數(shù)據(jù)庫關(guān)閉之前處于離線(offline)狀態(tài),重新打開數(shù)據(jù)庫時,該表空間和相應(yīng)的數(shù)據(jù)文件仍然處于離線狀態(tài)。
-
獲取一個撤銷表空間
如果存在多個撤銷表空間,由初始化參數(shù) UNDO_TABLESPACE 決定使用哪個表空間。如果沒有設(shè)置該參數(shù),使用第一個可用的撤銷表空間。
-
打開在線重做日志文件
只讀模式
默認(rèn)情況下,數(shù)據(jù)庫以讀/寫模式打開。在這種模式下,用戶可以修改數(shù)據(jù),產(chǎn)生重做日志項。另外,數(shù)據(jù)庫可以以只讀模式打開,防止用戶事務(wù)修改數(shù)據(jù)。
注意:默認(rèn)情況下,物理備用數(shù)據(jù)庫以只讀模式打開。
只讀模式下的數(shù)據(jù)庫只能執(zhí)行只讀事務(wù),不能寫入數(shù)據(jù)文件或者在線重做日志文件。不過,數(shù)據(jù)庫仍然能夠執(zhí)行恢復(fù)操作或者不產(chǎn)生重做日志的操作。例如,只讀模式支持以下操作:
- 將數(shù)據(jù)文件離線或者在線。但是,不能將永久表空間離線。
- 恢復(fù)離線的數(shù)據(jù)文件和表空間。
- 修改控制文件中關(guān)于數(shù)據(jù)庫狀態(tài)的信息。
- 使用 CREATE TEMPORARY TABLESPACE 語句創(chuàng)建的臨時表空間允許讀寫操作。
- 寫入操作系統(tǒng)的審計文件、跟蹤文件以及告警日志。
數(shù)據(jù)庫文件檢查
如果打開數(shù)據(jù)庫時,任何數(shù)據(jù)文件或重做日志文件不存在,或者它們存在但是一致性檢測失敗,數(shù)據(jù)庫將會返回一個錯誤。此時需要執(zhí)行介質(zhì)恢復(fù)。
關(guān)閉數(shù)據(jù)庫與實例
通常來說,管理員在執(zhí)行維護(hù)操作或其他管理任務(wù)時手動關(guān)閉數(shù)據(jù)庫。可以使用 SQL*Plus 的 SHUTDOWN 命令或者 Enterprise Manager 執(zhí)行這些操作。
下圖演示了數(shù)據(jù)庫從打開狀態(tài)到一致性關(guān)閉的過程。
圖 13-4 實例與數(shù)據(jù)庫關(guān)閉順序
Oracle 數(shù)據(jù)庫從打開到一致性關(guān)閉時自動執(zhí)行以下操作。
表 13-3 一致性關(guān)閉的步驟
| 1 | 關(guān)閉數(shù)據(jù)庫 | 數(shù)據(jù)庫處于加載狀態(tài),但是在線數(shù)據(jù)文件和重做日志文件被關(guān)閉。 | 關(guān)閉數(shù)據(jù)庫 |
| 2 | 卸載數(shù)據(jù)庫 | 實例處于啟動狀態(tài),但是不再關(guān)聯(lián)數(shù)據(jù)庫的控制文件。 | 卸載數(shù)據(jù)庫 |
| 3 | 關(guān)閉實例 | 實例被關(guān)閉,不再處于啟動狀態(tài)。 | 關(guān)閉實例 |
Oracle 數(shù)據(jù)庫在出現(xiàn)實例失敗或者執(zhí)行 SHUTDOWN ABORT (立即終止實例)命令時,不會執(zhí)行以上操作。
關(guān)閉模式
具有 SYSDBA 或者 SYSOPER 權(quán)限的數(shù)據(jù)庫管理員可以使用 SQL*Plus 的 SHUTDOWN 命令或 Enterprise Manager 關(guān)閉數(shù)據(jù)庫。SHUTDOWN 命令包含了不同的關(guān)閉選項。
下表總結(jié)了不同的關(guān)閉模式。
表 13-4 數(shù)據(jù)庫關(guān)閉模式
| 運行新用戶連接 | 否 | 否 | 否 | 否 |
| 等待當(dāng)前會話結(jié)束 | 否 | 否 | 否 | 是 |
| 等待當(dāng)前事務(wù)結(jié)束 | 否 | 否 | 是 | 是 |
| 執(zhí)行檢查點并關(guān)閉打開的文件 | 否 | 是 | 是 | 是 |
不同的 SHUTDOWN 語句包括:
-
SHUTDOWN ABORT
這種關(guān)閉模式用于緊急情況,例如其他模式無法關(guān)閉實例時。這種模式速度最快。但是,隨后再打開數(shù)據(jù)庫時需要更長的時間,因此需要執(zhí)行實例恢復(fù)以確保數(shù)據(jù)文件的一致性。
由于 SHUTDOWN ABORT 命令不對打開的數(shù)據(jù)文件執(zhí)行檢查點操作,重新打開數(shù)據(jù)庫時必須執(zhí)行實例恢復(fù)。其他的關(guān)閉模式在重新打開數(shù)據(jù)庫時不需要執(zhí)行實例的恢復(fù)。
注意:在 CDB 中,針對 PDB 執(zhí)行的 SHUTDOWN ABORT 命令等價于非 CDB 上的 SHUTDOWN IMMEDIATE 命令。
-
SHUTDOWN IMMEDIATE
這種關(guān)閉模式是除了 SHUTDOWN ABORT 之外的最快方式。Oracle 數(shù)據(jù)庫立即終止任何正在執(zhí)行的 SQL 語句并且斷開用戶的連接。系統(tǒng)終止所有正在進(jìn)行的事務(wù),并且回滾未提交的更改。
-
SHUTDOWN TRANSACTIONAL
這種關(guān)閉模式不允許用戶開始新的事務(wù),但會等待所有當(dāng)前正在執(zhí)行的事務(wù)結(jié)束,然后關(guān)閉數(shù)據(jù)庫。這種模式可能需要等待很長的時間才能完成。
- SHUTDOWN NORMAL
這是默認(rèn)的關(guān)閉模式。數(shù)據(jù)庫在關(guān)閉之前等待所有連接的用戶斷開連接。
關(guān)閉數(shù)據(jù)庫
關(guān)閉數(shù)據(jù)庫的操作分為正常關(guān)閉和異常關(guān)閉。
正常關(guān)閉
當(dāng)數(shù)據(jù)庫使用非 ABORT 模式關(guān)閉時,會將 SGA 中的數(shù)據(jù)寫入數(shù)據(jù)文件和在線重做日志文件。
然后,數(shù)據(jù)庫關(guān)閉在線數(shù)據(jù)文件和重做日志文件。離線表空間中的離線數(shù)據(jù)文件已經(jīng)處于關(guān)閉狀態(tài)。當(dāng)數(shù)據(jù)庫重新打開時,原來的離線表空間仍然處于離線狀態(tài)。
此時,數(shù)據(jù)庫已經(jīng)關(guān)閉,不接受正常訪問。但是控制文件仍然處于打開狀態(tài)。
異常關(guān)閉
如果使用 SHUTDOWN ABORT 命令關(guān)閉數(shù)據(jù)庫或者數(shù)據(jù)庫異常終止時,實例瞬間停止并關(guān)閉數(shù)據(jù)庫。
異常關(guān)閉時,Oracle 數(shù)據(jù)庫不會將 SGA 緩存中的數(shù)據(jù)寫入數(shù)據(jù)文件和重做日志文件。隨后重新打開數(shù)據(jù)庫時需要執(zhí)行實例恢復(fù),Oracle 自動執(zhí)行實例的恢復(fù)操作。
卸載數(shù)據(jù)庫
在關(guān)閉數(shù)據(jù)庫之后,Oracle 將會卸載數(shù)據(jù)庫,將其與實例分離。
卸載數(shù)據(jù)庫之后,Oracle 關(guān)閉數(shù)據(jù)庫的控制文件。此時,實例仍然存在于內(nèi)存之中。
關(guān)閉實例
關(guān)閉數(shù)據(jù)庫的最后一步就是關(guān)閉實例。關(guān)閉實例時,系統(tǒng)釋放 SGA 內(nèi)存,并停止后臺進(jìn)程。
在異常情況下,實例可能沒有關(guān)閉干凈。內(nèi)存中仍然存在一些內(nèi)存結(jié)構(gòu),或者某個后臺進(jìn)程仍未終止。如果之前的實例仍然部分存在,后續(xù)的實例可能會啟動失敗。此時,可以通過刪除之前實例的殘余并重新啟動一個新實例,或者使用 SHUTDOWN ABORT 語句關(guān)閉之前的實例,強制啟動一個新的實例。
某些情況下,進(jìn)程的清除可能會遇到錯誤,導(dǎo)致進(jìn)程監(jiān)控進(jìn)程(PMON)或者實例的終止。動態(tài)初始化參數(shù) INSTANCE_ABORT_DELAY_TIME 用于指定發(fā)生內(nèi)部實例失敗時延遲關(guān)閉的時間(秒)。延遲時間之內(nèi),管理員可以介入處理。當(dāng)發(fā)生延遲的實例終止時,數(shù)據(jù)庫在告警日志中寫入一條消息。某些情況下,通過允許隔離某些數(shù)據(jù)庫資源,可以避免實例被終止。
檢查點
檢查點(checkpoint)對于一致性數(shù)據(jù)庫關(guān)閉、實例恢復(fù)以及常規(guī)數(shù)據(jù)庫操作都至關(guān)重要。
檢查點操作具有以下含義:
-
檢查點位置(checkpoint position),它表示重做日志流中的系統(tǒng)更改號(SCN),實例恢復(fù)必須從該檢查點位置開始
檢查點位置由數(shù)據(jù)庫緩沖區(qū)高速緩存中最早的臟塊決定。檢查點位置相當(dāng)于一個指向重做流的指針,它的信息存儲在控制文件以及每個數(shù)據(jù)文件的頭部。
-
將數(shù)據(jù)庫緩沖區(qū)高速緩存中被修改過的緩存數(shù)據(jù)寫入磁盤
檢查點的作用
Oracle 數(shù)據(jù)庫使用檢查點實現(xiàn)多個功能,包括:
- 減少實例或介質(zhì)失敗時的恢復(fù)時間
- 確保數(shù)據(jù)庫定期將緩沖區(qū)高速緩存中的臟數(shù)據(jù)寫入磁盤
- 確保數(shù)據(jù)庫在一致性關(guān)閉時將所有已提交的數(shù)據(jù)寫入磁盤
檢查點觸發(fā)時機
檢查點進(jìn)程(CKPT)負(fù)責(zé)將檢查點寫入數(shù)據(jù)文件頭部以及控制文件中。
許多場景都會導(dǎo)致檢查點發(fā)生。例如,Oracle 數(shù)據(jù)庫包含以下檢查點類型:
-
線程檢查點
數(shù)據(jù)庫在完成特定操作之前將某個重做線程修改的緩存數(shù)據(jù)寫入磁盤。一個數(shù)據(jù)庫的所有實例上的線程檢查點集合組成數(shù)據(jù)庫檢查點。線程檢查點在以下情況下觸發(fā):
- 一致性數(shù)據(jù)庫關(guān)閉
- 執(zhí)行 ALTER SYSTEM CHECKPOINT 語句
- 在線重做日志切換
- 執(zhí)行 ALTER DATABASE BEGIN BACKUP 語句
-
表空間和數(shù)據(jù)文件檢查點
數(shù)據(jù)庫在完成特定操作之前將所有重做線程修改的緩存數(shù)據(jù)寫入磁盤。表空間檢查點包含一組數(shù)據(jù)文件檢查點,每個數(shù)據(jù)文件一個檢查點。這些檢查點的觸發(fā)事件包括:將表空間設(shè)置為只讀或者正常離線,收縮數(shù)據(jù)文件,或者執(zhí)行 ALTER TABLESPACE BEGIN BACKUP 命令。
- 增量檢查點
增量檢查點是一種線程檢查點,作用包括避免在線重做日志切換時的大量數(shù)據(jù)塊寫入。DBW 至少每三秒執(zhí)行一次檢查,判斷是否需要寫入數(shù)據(jù)。當(dāng) DBW 將臟緩存寫磁盤時,同時推進(jìn)檢查點位置,使得 CKPT 將檢查點位置寫入控制文件,但不會寫入數(shù)據(jù)文件頭部。
其他類型的檢查點包括實例與介質(zhì)恢復(fù)檢查點,以及刪除或截斷模式對象時的檢查點。
實例恢復(fù)
實例恢復(fù)(Instance recovery)是將在線重做日志文件中的記錄應(yīng)用到數(shù)據(jù)文件的過程,用于重建最近的檢查點之后的數(shù)據(jù)變更。
當(dāng)管理員嘗試打開一個之前未能一致性關(guān)閉的數(shù)據(jù)庫時,系統(tǒng)自動執(zhí)行實例的恢復(fù)。
實例恢復(fù)的作用
實例恢復(fù)可以確保數(shù)據(jù)庫在發(fā)生實例失敗之后能夠恢復(fù)到一致性的狀態(tài)。數(shù)據(jù)對于變更的管理方式,導(dǎo)致數(shù)據(jù)庫文件可能會處于一個非一致性的狀態(tài)。
日志線程(redo thread)是一個實例產(chǎn)生的所有變更記錄。單實例數(shù)據(jù)庫只有一個日志線程,而 Oracle RAC 數(shù)據(jù)庫包含多個日志線程,每個實例一個日志線程。
當(dāng)事務(wù)被提交時,日志寫入進(jìn)程(LGWR)將內(nèi)存中的重做日志項和該事務(wù)的 SCN 同時寫入在線重做日志。但是,數(shù)據(jù)寫入(DBW)進(jìn)程以系統(tǒng)認(rèn)為的高效方式將修改后的數(shù)據(jù)塊寫入數(shù)據(jù)文件。因此,未提交的更改可能會臨時存在數(shù)據(jù)文件中,同時已提交的修改有可能未寫入數(shù)據(jù)文件。
如果數(shù)據(jù)庫位于打開狀態(tài)時發(fā)生實例失敗(可能是由于 SHUTDOWN ABORT 語句或異常終止),將會導(dǎo)致以下狀況:
- 已提交的數(shù)據(jù)塊還沒有寫入數(shù)據(jù)文件,只記錄在在線重做日志中。這些變更必須重新應(yīng)用到數(shù)據(jù)文件中。
- 數(shù)據(jù)文件中包含一些實例失敗時未提交的變更。這些變更必須進(jìn)行回滾,以確保事務(wù)的一致性。
實例恢復(fù)只利用在線重做日志文件和當(dāng)前在線數(shù)據(jù)文件執(zhí)行數(shù)據(jù)文件的同步,確保它們的一致性。
實例恢復(fù)的時間
是否需要執(zhí)行實例恢復(fù)取決于日志線程的狀態(tài)。
當(dāng)數(shù)據(jù)庫實例以讀寫模式打開時,對應(yīng)的日志線程被標(biāo)記為打開狀態(tài),當(dāng)實例一致性關(guān)閉時,日志線程被標(biāo)記為關(guān)閉。如果日志線程在控制文件中是打開狀態(tài),但是沒有對應(yīng)的活動實例,數(shù)據(jù)庫需要執(zhí)行實例恢復(fù)。
Oracle 數(shù)據(jù)庫在以下情況下自動執(zhí)行實例恢復(fù):
- 單實例數(shù)據(jù)庫失敗后,或者 Oracle RAC 數(shù)據(jù)庫的所有實例失敗后,首次打開數(shù)據(jù)庫。這種形式的實例恢復(fù)也稱為崩潰恢復(fù)。Oracle 數(shù)據(jù)庫同時恢復(fù)所有失敗實例的在線重做日志線程。
- Oracle RAC 數(shù)據(jù)庫的部分(非全部)實例失敗 。集群中某個存活實例自動執(zhí)行實例恢復(fù)操作。
后臺進(jìn)程 SMON 負(fù)責(zé)執(zhí)行實例恢復(fù),自動應(yīng)用在線重做日志。整個過程不需要管理員介入。
檢查點的重要性
實例恢復(fù)時,使用檢查點決定需要應(yīng)用到數(shù)據(jù)文件中的變更。檢查點位置確保了所有 SCN 小于檢查點 SCN 的已提交變更都已保存到數(shù)據(jù)文件中。
下圖描繪了在線重做日志中的日志線程。
圖 13-5 在線重做日志中的檢查點位置
在執(zhí)行實例恢復(fù)時,數(shù)據(jù)庫必須應(yīng)用檢查點位置和日志線程終點之間的所有變更。如圖 13-5 所示,某些變更可能已經(jīng)寫入了數(shù)據(jù)文件。但是,只有 SCN 小于檢查點位置的變更確認(rèn)已經(jīng)寫入磁盤之中。
實例恢復(fù)步驟
實例恢復(fù)的第一步稱為緩存恢復(fù)(cache recovery)或前滾(rolling forward),將在線重做日志中的所有變更重新應(yīng)用到數(shù)據(jù)文件中。
由于在線重做日志中包含了撤銷數(shù)據(jù)(undo data),前滾操作也會重建相應(yīng)的撤銷段(undo segment)。前滾操作應(yīng)用在線重做日志文件將數(shù)據(jù)庫恢復(fù)到實例失敗之前的狀態(tài)。完成前滾操作之后,數(shù)據(jù)塊中包含了在線重做日志文件中的所有已提交變更。這些數(shù)據(jù)文件中可能還包含一些實例失敗之前寫入的未提交變更,或者緩存恢復(fù)時從在線重做日志中引入的未提交變更。
前滾之后,未提交的變更需要回滾。Oracle 數(shù)據(jù)庫使用檢查點位置確保所有 SCN 小于檢查點 SCN 的已提交變更已經(jīng)寫入磁盤。Oracle 數(shù)據(jù)庫應(yīng)用撤銷塊 回滾未提交的變更(包括實例失敗之前寫入的變更和緩存恢復(fù)時引入的變更)。這個階段稱為回滾(rolling back)或者事務(wù)恢復(fù)(transaction recovery)。
下圖演示了數(shù)據(jù)庫實例恢復(fù)的兩個必要步驟:前滾和回滾。
圖 13-6 基本實例恢復(fù)操作:前滾和回滾
Oracle 數(shù)據(jù)庫可以根據(jù)需要同時回滾多個事務(wù)。實例失敗時的所有活動事務(wù)都被標(biāo)記為終止。新的事務(wù)可以回滾各自的數(shù)據(jù)塊以獲取所需的數(shù)據(jù),而不需要等待 SMON 進(jìn)程回滾被終止的事務(wù)。
參數(shù)文件
啟動數(shù)據(jù)庫實例時,Oracle 數(shù)據(jù)庫必須讀取一個服務(wù)器參數(shù)文件(推薦方式)或者一個文本初始化參數(shù)文件(傳統(tǒng)遺留方式)。這些文件中包含了一個配置參數(shù)的列表。
手動創(chuàng)建一個數(shù)據(jù)庫時,必須使用一個參數(shù)文件啟動實例,然后執(zhí)行 CREATE DATABASE 語句。實例和參數(shù)文件可以獨立于數(shù)據(jù)庫而存在。
初始化參數(shù)
初始化參數(shù)(Initialization parameter)是一些可以影響實例操作的配置參數(shù)。實例在啟動時讀取參數(shù)文件中的初始化參數(shù)。
Oracle 數(shù)據(jù)庫提供了許多初始化參數(shù),用于優(yōu)化不同環(huán)境下的操作。只有少數(shù)參數(shù)需要顯式設(shè)置,通常只需要使用默認(rèn)值即可。
初始化參數(shù)分組
初始化參數(shù)可以按照功能分為不同的組。
大部分初始化參數(shù)屬于以下分組之一:
- 設(shè)置實體項目(例如文件或目錄)的參數(shù)
- 設(shè)置進(jìn)程限制、數(shù)據(jù)庫資源限制、或者數(shù)據(jù)庫自身限制的參數(shù)
- 影響容量的參數(shù),例如 SGA 的大小(這些參數(shù)被稱為可變參數(shù))
數(shù)據(jù)庫管理員特別關(guān)注可變參數(shù),因為他們可以通過這些參數(shù)優(yōu)化數(shù)據(jù)庫的性能。
基本參數(shù)與高級參數(shù)
初始化參數(shù)可以分為兩類:基本參數(shù)和高級參數(shù)。
通常來說,管理員需要設(shè)置并優(yōu)化大約 30 個基本的參數(shù),以達(dá)到合理的性能。基本參數(shù)用于設(shè)置一些特性,例如數(shù)據(jù)庫名稱、控制文件的位置、數(shù)據(jù)庫塊大小以及撤銷表空間。
在極少數(shù)情況下,管理員需要修改高級參數(shù),以便獲得最佳性能。DBA 專家通過可以高級參數(shù)調(diào)整數(shù)據(jù)庫的行為,以滿足特定的需求。
Oracle 數(shù)據(jù)庫在安裝軟件的啟動初始化參數(shù)文件中提供了參數(shù)值,或者可以通過數(shù)據(jù)庫配置助手(DBCA)創(chuàng)建這些參數(shù)。管理員可以根據(jù)自己的配置需求或者調(diào)優(yōu)方案,修改 Oracle 提供的這些初始化參數(shù),也可以增加其他參數(shù)。對于參數(shù)文件中沒有涉及的相關(guān)初始化參數(shù),Oracle 數(shù)據(jù)庫提供默認(rèn)值。
服務(wù)器參數(shù)文件
服務(wù)參數(shù)文件(server parameter file)是初始化參數(shù)的一個存儲庫。
服務(wù)器參數(shù)文件具有以下主要特征:
- 只能由 Oracle 數(shù)據(jù)庫讀寫服務(wù)器參數(shù)文件。
- 一個數(shù)據(jù)庫只能有一個服務(wù)器參數(shù)文件。該文件必須存放在數(shù)據(jù)庫服務(wù)器主機中。
- 服務(wù)器參數(shù)文件是一個二進(jìn)制文件,不能使用文本編輯器進(jìn)行修改。
- 服務(wù)器參數(shù)文件中的初始化參數(shù)是永久存儲的。在數(shù)據(jù)庫實例運行時對參數(shù)所做的任何更改在實例關(guān)閉和啟動后仍然生效。
服務(wù)器參數(shù)文件使得客戶端應(yīng)用不再需要維護(hù)多個文本初始化參數(shù)文件。服務(wù)器參數(shù)文件通過 CREATE SPFILE 語句從文本初始化參數(shù)文件創(chuàng)建。它可以通過數(shù)據(jù)庫配置助手直接創(chuàng)建。
文本初始化參數(shù)文件
文本初始化參數(shù)文件(text initialization parameter file)是一個文本文件,內(nèi)容是一個初始化參數(shù)的列表。
這種參數(shù)文件是歷史遺留的實現(xiàn)方式,它具有以下主要特點:
- 當(dāng)啟動或者關(guān)閉數(shù)據(jù)庫時,文本初始化參數(shù)文件必須位于連接到數(shù)據(jù)庫的客戶端主機中。
- 文本初始化參數(shù)文件時一個文本文件,而不是二進(jìn)制文件。
- Oracle 數(shù)據(jù)庫可以讀取文本初始化參數(shù)文件,但是不能寫入該文件。要想修改參數(shù)的值,必須通過文本編輯器手動進(jìn)行修改。
- 使用 ALTER SYSTEM 語句修改的初始化參數(shù)值只在當(dāng)前實例中生效。必須手動更新文件初始化參數(shù)文件并重啟實例才能永久生效。
文本初始化參數(shù)文件中包含一系列 key=value 配置,每行一個配置。例如,以下是某個參數(shù)文件中的部分內(nèi)容:
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 . . .為了說明文本參數(shù)文件可能帶來的管理問題,假設(shè)你使用了計算機 clienta 和 clientb,并且需要能夠從任意一個計算機上啟動數(shù)據(jù)庫。此時,每個計算機上都需要一個單獨的文本初始化參數(shù)文件,如圖 13-7 所示。 服務(wù)參數(shù)文件可以解決參數(shù)文件的分散存儲問題。
圖 13-7 多個初始化參數(shù)文件
修改初始化參數(shù)
管理員可以通過修改初始化參數(shù)來調(diào)整數(shù)據(jù)庫的行為。參數(shù)按照修改方式分為靜態(tài)(static)參數(shù)和動態(tài)(dynamic)參數(shù)。
下列表格總結(jié)了它們的不同之處。
表 13-5 靜態(tài)初始化參數(shù)和動態(tài)初始化參數(shù)
| 需要修改參數(shù)文件 | 是 | 否 |
| 需要重啟實例才能生效 | 是 | 否 |
| 在 Oracle Database Reference 中顯示為“Modifiable” | 否 | 是 |
| 只能修改數(shù)據(jù)庫或?qū)嵗嚓P(guān)的參數(shù) | 是 | 否 |
靜態(tài)參數(shù)包括 DB_BLOCK_SIZE、DB_NAME 以及 COMPATIBLE。動態(tài)參數(shù)分為會話級別的參數(shù)(只影響當(dāng)前會話)和系統(tǒng)級別的參數(shù)(影響數(shù)據(jù)庫和所有會話)。例如,MEMORY_TARGET 是一個系統(tǒng)級參數(shù),而 NLS_DATE_FORMAT 是一個會話級參數(shù)。
參數(shù)變更的范圍取決于變更何時生效。當(dāng)實例使用服務(wù)器參數(shù)文件啟動時,可以使用 ALTER SYSTEM SET 語句選擇以下方式修改系統(tǒng)級參數(shù):
-
SCOPE=MEMORY
參數(shù)的變更只針對當(dāng)前數(shù)據(jù)庫實例生效。數(shù)據(jù)庫關(guān)閉并重啟后變更不會持久化。
-
SCOPE=SPFILE
參數(shù)的變更只應(yīng)用于服務(wù)器參數(shù)文件,不會影響當(dāng)前實例。因此,變更只在實例重啟之后生效。
注意:對于那些在 Oracle Database Reference 中標(biāo)識為不可更改的參數(shù),修改時必須指定 SPFILE 。
-
SCOPE=BOTH
Oracle 數(shù)據(jù)庫同時將變更寫入內(nèi)存和服務(wù)器參數(shù)文件。這是數(shù)據(jù)庫使用服務(wù)器參數(shù)文件時的默認(rèn)修改范圍。
診斷文件
Oracle 數(shù)據(jù)庫提供了一個故障診斷基礎(chǔ)架構(gòu)(fault diagnosability infrastructure),用于防止、檢測、診斷和解決數(shù)據(jù)庫問題。這些問題包括代碼錯誤、元數(shù)據(jù)損壞以及客戶數(shù)據(jù)丟失等嚴(yán)重錯誤。
這個高級的故障診斷基礎(chǔ)架構(gòu)的作用包括:
- 主動發(fā)現(xiàn)問題
- 檢測到問題后控制損失和系統(tǒng)中斷
- 減少故障診斷和解決時間
- 通過拆分跟蹤文件提高可管理性,允許用戶指定每個文件的大小,以及保留的最大文件數(shù)量,并且在占用的存儲到達(dá)用戶指定的磁盤空間后關(guān)閉跟蹤
- 方便客戶與 Oracle 支持人員的交流
多租戶容器數(shù)據(jù)庫(CDB)與非 CDB 的診斷架構(gòu)不同。本節(jié)內(nèi)容針對非 CDB,除非另有說明。
自動診斷庫
自動診斷庫(ADR)是一個基于文件的資料庫,用于存儲數(shù)據(jù)庫的診斷數(shù)據(jù),例如跟蹤文件、告警日志、DDL 日志以及健康健康報告。
ADR 具有以下主要特點:
- 統(tǒng)一的目錄結(jié)構(gòu)
- 一致的診斷數(shù)據(jù)格式
- 統(tǒng)一的工具套件
以上特性使得客戶和 Oracle 支持人員能夠關(guān)聯(lián)和分析多個實例、組件和產(chǎn)品的診斷數(shù)據(jù)。
ADR 存儲在數(shù)據(jù)庫之外,Oracle 數(shù)據(jù)庫在物理庫不可用時仍然能夠訪問和管理 ADR。數(shù)據(jù)庫實例在創(chuàng)建數(shù)據(jù)庫之前創(chuàng)建 ADR。
問題和事件
ADR 可以主動發(fā)現(xiàn)問題(problems), 它們是數(shù)據(jù)庫中的一些關(guān)鍵錯誤。
關(guān)鍵錯誤顯示為內(nèi)部錯誤,例如 ORA-600,或者其他嚴(yán)重錯誤。每個問題擁有一個問題鍵(problem key),它是描述該問題的文本字符串。
當(dāng)一個問題多次發(fā)生時,ADR 為每次的錯誤創(chuàng)建一個包含時間戳的事件(incident)。事件由一個數(shù)字的事件 ID 唯一確定。當(dāng)一個事件發(fā)生時, ADR 將會發(fā)送一個事件告警(incident alert)到 Enterprise Manager。一個關(guān)鍵錯誤的診斷和解決通常從一個事件告警開始。
由于一個問題可能在短時間內(nèi)產(chǎn)生多次事件,當(dāng)該事件的次數(shù)到達(dá)一個特定閾值之后,ADR 將會采用防洪控制措施。防洪控制事件只會產(chǎn)生一個告警日志項,而不會產(chǎn)生事件轉(zhuǎn)儲信息。ADR 通過這種方式通知用戶正在發(fā)生一個嚴(yán)重的錯誤,而不會因為產(chǎn)生大量的診斷數(shù)據(jù)給系統(tǒng)帶來壓力。
ADR 目錄結(jié)構(gòu)
ADR base 是 ADR 的根目錄。
ADR 根目錄下可以存在多個 ADR 主目錄(ADR home),每個 ADR 主目錄是一個 Oracle 產(chǎn)品或組件的實例的診斷數(shù)據(jù)所在的根目錄,包括跟蹤文件、轉(zhuǎn)儲文件以及告警日志等等。例如, 在一個使用了共享存儲和 Oracle ASM 的 Oracle RAC 環(huán)境中,每個數(shù)據(jù)庫實例和 Oracle ASM 實例都擁有各自的 ADR 主目錄。
圖 13-8 顯示了一個數(shù)據(jù)庫實例的 ADR 目錄層次結(jié)構(gòu)。在相同的 ADR 根目錄下,還可以存在其他 Oracle 產(chǎn)品或組件的其他 ADR 主目錄,例如 Oracle ASM 或者 Oracle Net Services。
圖 13-8 Oracle 數(shù)據(jù)庫實例的 ADR 目錄結(jié)構(gòu)
以下是一個 Linux 環(huán)境的示例,當(dāng)你在創(chuàng)建數(shù)據(jù)庫之前使用一個唯一的 SID 和數(shù)據(jù)庫名稱啟動實例時,Oracle 數(shù)據(jù)庫默認(rèn)在文件系統(tǒng)中創(chuàng)建一個 ADR 目錄結(jié)構(gòu)。SID 和數(shù)據(jù)庫名稱成為了 ADR 主目錄中的文件路徑的一部分。
示例 13-1 創(chuàng)建 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告警日志
每個數(shù)據(jù)庫都有一個告警日志,它是一個 XML 文件,其中包含了數(shù)據(jù)庫消息和錯誤的時間日志。
告警日志包含以下內(nèi)容:
- 所有內(nèi)部錯誤(ORA-600),塊損壞錯誤(ORA-1578)以及死鎖錯誤(ORA-60)
- 數(shù)據(jù)庫管理操作,例如 SQL*Plus 的 STARTUP、
SHUTDOWN、ARCHIVE LOG 以及 RECOVER 命令 - 與共享服務(wù)器和調(diào)度進(jìn)程功能相關(guān)的一些消息和錯誤
- 物化視圖自動刷新錯誤
Oracle 數(shù)據(jù)庫使用告警日志作為在 Enterprise Manager GUI 中顯示信息的替代方案。如果成功執(zhí)行一個管理操作,Oracle 數(shù)據(jù)庫將會在告警日志中寫入一個帶時間戳的“已完成”的消息。
首次啟動一個實例時,Oracle 數(shù)據(jù)庫在圖 13-8 所示的 alert 子目錄中創(chuàng)建一個告警日志文件,即使還沒有創(chuàng)建數(shù)據(jù)庫。該文件使用 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 語句和相關(guān)細(xì)節(jié)信息。數(shù)據(jù)庫將 DDL 的信息寫入單獨的文件,以便減少告警日志的復(fù)雜性。
DDL 日志記錄 DDL 文本,或者一些額外的信息。每個 DDL 語句記錄一條日志。DDL 存儲在 ADR 主目錄下的 log/ddl 子目錄中。
跟蹤文件
跟蹤文件(trace file)存儲了用于調(diào)查問題的診斷數(shù)據(jù)。同時,跟蹤文件還可以為應(yīng)用程序或?qū)嵗齼?yōu)化的提供指導(dǎo)。
跟蹤文件的類型
每個服務(wù)器進(jìn)程或后臺進(jìn)程都可以定期寫入一個關(guān)聯(lián)的跟蹤文件。該文件中包含了進(jìn)程環(huán)境、狀態(tài)、活動以及錯誤的信息。
SQL 跟蹤工具也可以創(chuàng)建跟蹤文件,為特定 SQL 語句提供性能相關(guān)的信息。可以以不同的方式為指定客戶端標(biāo)識、服務(wù)、模塊、操作、會話、實例或者數(shù)據(jù)庫啟用跟蹤。例如,可以通過執(zhí)行 DBMS_MONITOR 包中的相應(yīng)過程或者設(shè)置事件的方式啟動跟蹤。
跟蹤文件的位置
ADR 在 trace 子目錄中存儲跟蹤文件。跟蹤文件名稱取決于不同的系統(tǒng),并且使用 .trc 擴(kuò)展名。
通常來說數(shù)據(jù)庫后臺進(jìn)程的跟蹤文件名稱包含 Oracle SID、后臺進(jìn)程名以及操作系統(tǒng)進(jìn)程編號。mytest_reco_10355.trc 是 一個 RECO 進(jìn)程跟蹤文件的示例。
服務(wù)器進(jìn)程的跟蹤文件名稱包含 Oracle SID、字符串“ora”以及操作系統(tǒng)進(jìn)程編號。mytest_ora_10304.trc 是一個服務(wù)器進(jìn)程跟蹤文件的示例。
有時候跟蹤文件還擁有一個跟蹤元數(shù)據(jù)文件,使用擴(kuò)展名 .trm。這些文件中包含了稱為跟蹤映射(trace maps)的結(jié)構(gòu)信息,數(shù)據(jù)庫利用這些信息進(jìn)行搜索和導(dǎo)航。
跟蹤文件的拆分
如果設(shè)置了跟蹤文件的大小限制,數(shù)據(jù)庫自動將其拆分成最多五個分段。每個分段都是獨立的文件,名稱和活動的跟蹤文件一致,只是加上了一個編號,例如 ora_1234_2.trc。
每個分段通常是 MAX_DUMP_FILE_SIZE 參數(shù)的 20% 大小。每當(dāng)所有分段的總大小超過了限制,數(shù)據(jù)庫將會刪除最早的分段(永遠(yuǎn)不會刪除第一個分段,因為它包含了進(jìn)程初始狀態(tài)的相關(guān)信息),然后創(chuàng)建一個新的空分段文件。
診斷轉(zhuǎn)儲文件
診斷轉(zhuǎn)儲文件(diagnostic dump file)是一種特殊的跟蹤文件,包含了關(guān)于某個狀態(tài)或結(jié)構(gòu)的詳細(xì)時間點信息。
跟蹤往往是連續(xù)的診斷數(shù)據(jù)。與此相反,轉(zhuǎn)儲通常是針對某一事件的一次性診斷數(shù)據(jù)。
跟蹤轉(zhuǎn)儲與事件
大多數(shù)跟蹤轉(zhuǎn)儲由事件觸發(fā)。
當(dāng)一個事件發(fā)生時,數(shù)據(jù)庫在該事件的事件目錄中寫入一個或多個轉(zhuǎn)儲文件。事件轉(zhuǎn)儲文件的名稱中還包含了事件編號。
創(chuàng)建事件時,應(yīng)用可能會為某個操作產(chǎn)生一個堆轉(zhuǎn)儲或者系統(tǒng)狀態(tài)轉(zhuǎn)儲。這種情況下,數(shù)據(jù)庫將轉(zhuǎn)儲名稱添加到事件文件名之后,而不是默認(rèn)的跟蹤文件名之后。例如,由于一個進(jìn)程的產(chǎn)生事件時,數(shù)據(jù)庫創(chuàng)建 prod_ora_90348.trc 文件。該事件的轉(zhuǎn)儲操作產(chǎn)生 prod_ora_90348_incident_id.trc 文件,其中 incident_id 是該事件的數(shù)字 ID。隨著該事件創(chuàng)建的堆轉(zhuǎn)儲操作產(chǎn)生一個堆轉(zhuǎn)儲文件 prod_ora_90348_incident_id_dump_id.trc,其中 dump_id 是跟蹤轉(zhuǎn)儲的數(shù)字 ID。
總結(jié)
以上是生活随笔為你收集整理的Oracle 数据库实例介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看完这篇还不知道css固定和自适应可以小
- 下一篇: 经典 SQL 数据库笔试题及答案整理