1 數據庫啟動
1.1 需要的權限
SYSDBA或者SYSOPER系統權限。
1.2 啟動的方法
- SQL*Plus STARTUP command
- Oracle Enterprise Manager (Enterprise Manager)
- SRVCTL utility
1.3 啟動的過程
啟動主要分為三個步驟:
1)啟動數據庫到Nomount狀態
2)啟動數據庫到Mount狀態
3)啟動數據庫到Open狀態

1.3.1 啟動到Nomount
Nomount的過程實質上是創建數據庫實例的過程。這個過程在后台是啟動Oracle可執行程序的過程,Windows上是執行oracle.exe文件進行初始化,在Unix/Linux上是執行$ORACLE_HOME/bin/oracle可執行文件進行初始化。
主要的步驟:
1)根據ORACLE_SID到缺省目錄下查找參數文件。若在啟動時指定了參數文件,則會查找指定的參數文件。
2)讀取參數文件中的初始化參數。
3)基於初始化參數分配SGA。
4)依次啟動Oracle后台進程。
5)打開告警日志和跟蹤文件。
可用下面的命令啟動到nomount:
startup nomount [PFILE=filename]
此時可通過動態性能視圖v$instance,查看實例狀態:
SQL> select status from v$instance;
STATUS
------------
STARTED
參數文件的缺省目錄:
Windows缺省目錄為 $ORACLE_HOME\database
Unix/Linux 下缺省目錄為$ORACLE_HOME/dbs
查找參數文件的順序:
spfile<ORACLE_SID>.ora --> spfile.ora --> init<ORACLE_SID>.ora
實例啟動的最小參數需求:
db_name
查詢后台進程信息:
select addr,pid,spid,username,program from v$process;
告警日志位置:
在ORACLE 10g中,BACKGROUND_DUMP_DEST參數確定了告警日志的位置,但是告警日志的文件名無法修改,告警日志的名稱為:alert_<SID>.log ,其中<SID>是實例的名稱。
從ORACLE 11g開始,告警日志文件的位置有了變化。主要是因為引入了ADR(Automatic Diagnostic Repository:一個存放數據庫診斷日志、跟蹤文件的目錄),關於ADR對應的目錄位置可以通過查看v$diag_info系統視圖。告警日志存放在Diag Trace目錄下。
1.3.2 啟動到Mount
Oracle根據參數文件中control_files參數的值,找到控制文件,並且根據控制文件中記錄的數據文件位置進行數據文件的存在性判斷。
將數據庫啟動到mount的命令:
startup mount [PFILE=filename]
將數據庫由nomount轉換到mount狀態:
alter database mount;
通常在Linux/Unix平台下,在$ORACLE_HOME/dbs目錄下,還會存在另外一個文件,該文件命名規則為lk<ORACLE_SID>,lk指lock。該文件在數據庫mount時創建,用於操作系統對數據庫的鎖定。當數據庫啟動時獲得鎖定,數據庫關閉時釋放。
用下面的命令可以查看該文件的鎖定信息:
$ fuser -u $ORACLE_HOME/dbs/lkFSDB
/u01/app/oracle/product/11.2.0/dbhome_1/dbs/lkFSDB: 15228(oracle) 15230(oracle) 15236(oracle) 15240(oracle) 15244(oracle) 15246(oracle) 15248(oracle) 15250(oracle) 15252(oracle) 15254(oracle) 15256(oracle) 15258(oracle)
1.3.3 啟動到Open
控制文件中記錄了數據庫中數據文件、日志文件的位置信息,檢查點信息等重要信息,在數據庫的Open階段,Oracle根據控制文件中記錄的這些信息找到這些文件,然后進行檢查點及完整性檢查。如果不存在問題就可以啟動數據庫,如果存在不一致或文件丟失則需要進行恢復。
主要步驟:
1)打開除undo表空間之外其它表空間的在線數據文件。
2)獲取一個undo表空間。
3)打開在線重做日志文件。
Oracle在Open階段將要進行很多校驗檢查,其中主要的校驗包括以下兩項:
1)第一次檢查數據文件頭中的檢查點計數(Checkpoint cnt)是否和控制文件中的檢查點計數(Checkpoint cnt)一致。此步驟檢查用以確認數據文件是來自同一版本,而不是從備份中恢復而來(因為Checkpoint Cnt不會被凍結,會一直被修改)。
2)第二次檢查數據文件頭的開始SCN和控制文件中記錄的該文件的結束SCN是否一致,如果控制文件中記錄的結束SCN等於數據文件頭的開始SCN,則不需要對那個文件進行恢復(如果此前數據庫異常崩潰,則結束SCN會保持在最大值(無窮大),數據庫必須執行實例恢復以確保一致性)。
2 數據庫關閉

Oracle 11g中數據庫關閉的分步驟操作:
1)關閉數據庫
alter database close;
Close數據庫僅允許在沒有連接的情況下進行,否則可能遇到 ORA-01093錯誤。
2)卸載數據庫
alter database dismount;
3)關閉數據庫實例
shutdown;
2.1 關閉方式
Database Behavior |
ABORT |
IMMEDIATE |
TRANSACTIONAL |
NORMAL |
Permits new user connections |
No |
No |
No |
No |
Waits until current sessions end |
No |
No |
No |
Yes |
Waits until current transactions end |
No |
No |
Yes |
Yes |
Performs a checkpoint and closes open files |
No |
Yes |
Yes |
Yes |
2.1.1 SHUTDOWN NORMAL
SHUTDOWN命令的缺省選項就是NORMAL,當執行SHUTDOWN命令時,Oracle即以正常方式關閉數據庫。
采用這種方式關閉數據庫,在下一次啟動時不需要進行任何的實例恢復,但是由於Normal方式要等所有用戶斷開連接后才能關閉數據庫,所以等待時間可能超長;在生產環境中,這種方式幾乎無法關閉有大量用戶連接的數據庫,所以很少被采用。
2.1.2 SHUTDOWN IMMEDIATE
SHUTDOWN IMMEDIATE方式是最為常用的一種關閉數據庫的方式,使用這個命令時,當前正在被Oracle處理的事務立即中斷,未提交的事務將全部回滾,系統不等待連接到數據庫的用戶退出,強制斷開所有的連接用戶。然后執行檢查點,將變更數據全部寫回數據文件,關閉數據庫。使用這種方式關閉數據庫,在下次啟動數據庫時不需要進行實例恢復,是一種安全的數據庫關閉方式。
但是注意,如果數據庫系統繁忙,當前有大量事務執行(甚至是大事務正在處理),那么使用此選項關閉數據庫也可能需要大量時間。
2.1.3 SHUTDOWN TRANSACTIONAL
SHUTDOWN TRANSACTIONAL選項僅在Oracle 8i后可用,使用該命令時,數據庫不再允許建立新的連接,禁止新事務的進行,但是允許當前活動事務執行完畢。
在所有活動的事務完成后,數據庫將和SHUTDOWN IMMEDIATE同樣的方式關閉數據庫。
2.1.4 SHUTDOWN ABORT
SHUTDOWN ABORT是最不推薦采用的關閉數據庫的方法,使用該選項,數據庫會立即終止所有用戶連接、中斷所有事務、立即關閉數據庫,使用這種方式關閉數據庫,未完成事務不會回滾,數據庫也不會執行檢查點,所以在下次啟動時,數據庫必須執行實例恢復,實例恢復可能會需要大量時間,數據庫的啟動因此可能需要等候很長時間。
Abort的方式關閉數據庫,就類似於數據庫服務器突然斷電,可能會導致不一致的情況出現,所以除非不得已,輕易不要使用這種方式關閉數據庫。那么在什么情況下需要使用Shutdown abort方式關閉數據庫呢?以下是一些常見的場景:
- 數據庫或應用異常,其他方式無法關閉數據庫
- 因為馬上到來的斷電或其他維護情況,需要快速關閉數據庫
- 啟動異常后需要重新嘗試啟動
- 當使用Shutdown Immediate無法關閉時
- 需要快速重新啟動數據庫
- Shutdown超時或異常
2.2 關閉的過程
2.2.1 關閉數據庫
非abort方式:
將SGA中的數據寫入到數據文件和在線重做日志文件。之后關閉數據文件和在線重做日志文件。
Abort方式:
直接關閉數據庫和實例。與斷電類似。
2.2.2 卸載數據庫
斷開數據庫和實例的關聯。
關閉數據庫的控制文件。
2.2.3 關閉數據庫實例
終止相關進程,回收SGA所占內存。
參考資料: