程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 數據庫啟動原理

Oracle 數據庫啟動原理

編輯:Oracle數據庫基礎
 

Oracle數據庫啟動,你關注過麼?說實話,我很少關注。數據庫就在那裡,不用你起,也能用;平時工作,也就是遠程登陸主機,也沒讓我去啟動數據庫(資格不夠)。但是,作為好奇的我,有強烈強迫症的我,還是決定將這個啟動的過程,進行稍微的研究一下,多了解一點知識,也撐不死。畢竟常在河邊走,說不定哪天讓我去管理數據庫呢,是吧;說不定哪天我就又成為了一個DBA了呢,是吧。夢想還是需要有的,接下來就看我們怎麼去實現了。

啟動三步走

對於我們熟悉的領域,當出現問題時,我們可以很有把握去搞定問題;當對於我們不熟悉的地方,我們就總是祈禱這裡不要出現問題,但是對於這些事情來說,貌似都遵循一個法則,你希望不出問題的地方,往往越是會出現問題,對於Oracle的啟動,我們都希望它能很順利的啟動起來,越是這樣希望,它越容易出現問題,這個時候我們就會變的手忙腳亂。這就要求我們去了解Oracle的啟動過程,及其原理。

Oracle的啟動過程,從大的角度來說,分為以下三步:

  1. 啟動實例;
  2. 裝載數據庫;
  3. 打開數據庫。

就這三步,這三步之中有任何一步出現了問題,都會導致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的大小等信息。

在實例啟動完成以後,數據庫還沒有和實例關聯,這個時候,數據庫是不能被訪問的。接下來就要說說裝載。

裝載數據庫

裝載數據庫,顧名思義,就是把數據庫文件和實例關聯起來。如何關聯呢?

  1. Oracle根據參數文件PFILE或者SPFILE中的參數找到控制文件;
  2. 打開控制文件;
  3. 從控制文件獲得數據文件和重做日志文件的名字及位置;

做完以上三步,沒有任何錯誤的情況下,這個時候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可以在每步之後做一些事情,比如:

  1. 在實例啟動完成以後,數據庫還沒有和實例關聯,此時,數據庫是不可訪問的。DBA可以在這個階段對數據庫進行維護,比如重建控制文件;
  2. 在加載完成以後,數據庫還不可以被訪問,這個階段,DBA可以進行恢復數據庫等操作;
  3. 在完成打開數據庫以後,一般的普通用戶才能對數據庫進行操作。

所以說,當數據庫的管理與維護過程中,我們可以根據我們的需要將數據庫啟動到上述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狀態

 

總結

這些理論知識總是很枯燥的,但是這又有什麼辦法呢?只有掌握了扎實的理論基礎,才能在實踐中更好的發揮,不是麼?

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved