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