Oracle數據庫啟動,你關注過麼?說實話,我很少關注。數據庫就在那裡,不用你起,也能用;平時工作,也就是遠程登陸主機,也沒讓我去啟動數據庫(資格不夠)。但是,作為好奇的我,有強烈強迫症的我,還是決定將這個啟動的過程,進行稍微的研究一下,多了解一點知識,也撐不死。畢竟常在河邊走,說不定哪天讓我去管理數據庫呢,是吧;說不定哪天我就又成為了一個DBA了呢,是吧。夢想還是需要有的,接下來就看我們怎麼去實現了。
對於我們熟悉的領域,當出現問題時,我們可以很有把握去搞定問題;當對於我們不熟悉的地方,我們就總是祈禱這裡不要出現問題,但是對於這些事情來說,貌似都遵循一個法則,你希望不出問題的地方,往往越是會出現問題,對於Oracle的啟動,我們都希望它能很順利的啟動起來,越是這樣希望,它越容易出現問題,這個時候我們就會變的手忙腳亂。這就要求我們去了解Oracle的啟動過程,及其原理。
Oracle的啟動過程,從大的角度來說,分為以下三步:
就這三步,這三步之中有任何一步出現了問題,都會導致Oracle啟動失敗。
下面就來詳細的說說啟動數據庫的這三步。
首先,我們需要明白我們啟動的這個實例,是個什麼概念。
實例=內存+進程
內存:啟動實例的時候,需要分配一塊內存區域,叫做系統全局區;
進程:啟動實例的時候,需要啟動一系列的後台進程(至於有哪些,後面再說);
就是這塊內存和這些後台進程組成了這個實例。
更直白的打個比方,數據庫好比一個倉庫,而實例就好比這個倉庫的管理員,任何人要訪問這個倉庫,都需要經過這個倉庫管理員這一關;所以說,實例實際上控制著數據庫的訪問。
啟動實例是一個復雜的過程,這中間需要去讀取配置文件,讀取一些信息,比如內存開辟多大啊,這些信息是如何得到的呢?這就要說到《PFILE和SPFILE》了。Oracle就是根據PFILE和SPFILE文件中指定的一些參數進行啟動實例的,而後續的很多參數都是從這兩個文件中得到的。
我們可以在本地進行測試一下。打開SQLPLUS,以SYSDBA的身份登錄,輸入以下命令:
startup nomount
SQL> startup nomount
ORACLE 例程已經啟動。Total System Global Area 535662592 bytes
Fixed Size 1375792 bytes
Variable Size 327156176 bytes
Database Buffers 201326592 bytes
Redo Buffers 5804032 bytes
我們可以看到實例已經啟動了,系統SGA的大小等信息。
在實例啟動完成以後,數據庫還沒有和實例關聯,這個時候,數據庫是不能被訪問的。接下來就要說說裝載。
裝載數據庫,顧名思義,就是把數據庫文件和實例關聯起來。如何關聯呢?
做完以上三步,沒有任何錯誤的情況下,這個時候Oracle就已經把實例和數據庫關聯起來了。但是,對於普通用戶而言,這個時候數據庫還是不可用的。只有等到經歷了最後一步——打開數據庫之後,才能使用數據庫。
我們可以在本地進行測試一下。打開SQLPLUS,以SYSDBA的身份登錄,輸入以下命令:
startup mount
SQL> startup mount
ORACLE 例程已經啟動。Total System Global Area 535662592 bytes
Fixed Size 1375792 bytes
Variable Size 327156176 bytes
Database Buffers 201326592 bytes
Redo Buffers 5804032 bytes
數據庫裝載完畢。
相比startup nomount
而言,多了一句數據庫裝載完畢的提示。
打開數據庫就表示Oracle打開數據庫文件和重做日志文件。這時候,數據庫可以使用,也就是說普通用戶可以登陸數據庫,並對數據庫進行操作。
當我們執行startup
命令時,也就包含了執行這三步,完成數據庫的整個啟動過程。顯示以下完整信息:
SQL> startup
ORACLE 例程已經啟動。Total System Global Area 535662592 bytes
Fixed Size 1375792 bytes
Variable Size 327156176 bytes
Database Buffers 201326592 bytes
Redo Buffers 5804032 bytes
數據庫裝載完畢。數據庫已經打開。
有的伙計在執行startup
命令的時候,會提示以下錯誤信息:
ORA-01081: 無法啟動已在運行的 ORACLE - 請首先關閉它
然後就蒙了,這是為什麼?我明明沒有啟動實例,運行Oracle,為什麼現在提醒我呢?這是Oracle的實例有一個自動啟動和自動關系的概念。當你沒有運行startup
命令,但是Oracle卻已經在運行了,這說明Oracle自動啟動了。
對於Windows系統,可以在系統服務中找到命名格式為:OracleService+<SID_NAME>
的服務器名,這個服務在啟動的時候,會去注冊表的以下位置讀取一些重要信息:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
可以找到一個命名格式為ORA_<SID_NAME>_AUTOSTART
的字段,該值被設置成了TRUE
。這就意味著把數據庫設置成了自動啟動。
動手把該字段改成FALSE,然後重新啟動
OracleService+<SID_NAME>
服務,再登陸數據庫,看看效果。
說到自動啟動,當然有自動關閉了,對應的字段命名格式為:ORA_<SID_NAME>_SHUTDOWN
。意思基本和自動啟動一樣,不過多總結。
有時間了,把這些注冊表中的值都可以看看,理解一下。
現在問題來了,明明一步就可以把數據庫啟動起來,為什麼要麻煩的分為3步呢?
你要知道,存在即合理;這樣三步走的設計,對於普通用戶來說是多余的,但是對於DBA來說,卻是非常重要的;DBA可以在每步之後做一些事情,比如:
所以說,當數據庫的管理與維護過程中,我們可以根據我們的需要將數據庫啟動到上述3步中的任意一步,完成數據庫的維護工作。
看似簡單分工的三步,但是每一步都有自己的工作去完成,這樣的設計思路,對你今後的軟件開發與設計,是否也有一定的啟迪呢?
“工欲善其事必先利其器”,在實際生產中,Oracle基本都是部署在Unix平台上,你工作的工具基本都是和各種命令打交道,而熟練的掌握各種命令,是在眾人面前展現你高大“逼格”的一種方式。接下來就將Oracle啟動過程中常用的一些命令進行總結:
命令
含義
CONNECT sys AS SYSDBA
使用sys用戶以SYSDBA的身份登錄數據庫
STARTUP NOMOUNT
啟動數據庫到NOMOUNT狀態,也就是啟動實例
STARTUP MOUNT
啟動數據庫到MOUNT狀態,也就是加載數據庫
ALTER DATABASE MOUNT
如果數據庫處於NOMOUNT狀態,直接從NOMOUNT狀態切換至MOUNT狀態
STARTUP
執行數據庫的整個啟動過程,包含了啟動過程中的三步
ALTER DATABASE OPEN
如果數據庫處於MOUNT狀態,直接從MOUNT狀態切換至OPEN狀態
這些理論知識總是很枯燥的,但是這又有什麼辦法呢?只有掌握了扎實的理論基礎,才能在實踐中更好的發揮,不是麼?