oracle nomount小議

dotaddjj發表於2011-08-04

關於資料庫的nomount狀態的一點資訊。
資料庫的啟動nomount mount open三個狀態,其中nomount中今天檢視eygle的部落格發現後臺altersid.log中存在輸出了pid和os id兩個資訊。
pid代表該程式在資料庫內部的程式識別符號,而os id則代表該程式在作業系統上的程式識別符號。
SQL> startup nomount;
ORACLE instance started.

Total System Global Area 1073741824 bytes
Fixed Size 1223488 bytes
Variable Size 264242368 bytes
Database Buffers 801112064 bytes
Redo Buffers 7163904 bytes
此時先是oracle的sga的分配

然後讀取spfile中的引數
System parameters with non-default values:
processes = 300
event = 10046 trace name context forever,level 12
__shared_pool_size = 130023424
shared_pool_size = 67108864
__large_pool_size = 4194304
__java_pool_size = 4194304
__streams_pool_size = 0
resource_manager_plan =
...
PSP0 started with pid=3, OS id=3944
PMON started with pid=2, OS id=4024
MMAN started with pid=4, OS id=456
DBW0 started with pid=5, OS id=640
DBW1 started with pid=6, OS id=2060
DBW2 started with pid=7, OS id=580
....
檢視上面的具體的altersid.log中的,可以檢視到oracle後臺程式和spfile引數來指定,nomount狀態啟動oracle例項,分配sga和後臺程式。
檢視上面的關於後臺程式中包含pid和os id兩個資訊,pid就是該oracle後臺程式在資料庫內部的識別符號,os id也就是該後臺程式在作業系統上對應的識別符號。
select * from v$process

其中有pid=1的程式但是altersid.log中不存在此記錄,檢視關於eygle的部落格中說到pid=1的程式是一個pseundo程式,這個程式被認為是初始化資料庫的程式,啟動其他程式之前就被啟用,並一直存在資料庫中。
v$process中的pid也就是altersid.log中提到的後臺程式識別符號,spid就是該程式對應於os上面的程式識別符號,透過spid,資料庫的v$process可以和os聯絡,通俗的說就是pid是oracle內部編排的,spid是oracle內部程式對應於作業系統的。
昨天blog的提到關於latch的解釋,今天檢視資料發現v$process檢視中也存在latchwait和latchspin。

latch作為資料庫記憶體中序列鎖機制,主要用來控制記憶體上的併發獲取,資料中提到多個處理器系統上,oracle程式透過spin來進行latch爭奪。
v$process中的addr就是該程式的地址,同樣在v$session檢視中也存在一個paddr,也是存在於session的程式地址。現在透過v$process中的pid和spid把資料庫的程式和os上的程式聯絡,v$process和v$session可以透過v$process的addr和v$session的paddr來聯絡。

startup nomount
此時oracle資料庫只需要一個spfile或者pfile,而且曾經幫助網友們檢視資料庫的問題中發現很多情況是引數檔案有問題,nomount起不來肯定找引數檔案,有一部分是spfile檔案手動修改導致的,由於spfile是二進位制檔案,如果手工修改就會損壞此檔案
所以我們一般都是alter system set scope=both/spfile來對引數檔案修改,上次的一個網友弄的更是鬱悶,他的spfile中有個指定background_dump_dest指定的目錄在os上面不存在,俺也是看了半天才發現的,最後修改引數的目錄然後nomount。
當初也是因為他的報錯資訊是個亂碼,oracle的字符集 ?等問題也是一個比較常見的問題,後面俺專門整理了再曬出來,不然沒有亂碼,英語好點oracle的報錯資訊一般都能看出個大概:就是指定目錄不存在。

經過幫網友除錯後發現spfile究竟需要什麼引數就可以啟動資料庫到nomount了,後來試驗只需要db_name,其餘的都可以不要,因為需要用db_name來鎖定mount狀態資料庫所需要控制檔案。如果不自己試試,肯定不會知道還可以這麼玩的。

提到了sid和oracle_sid。網上的解釋很多,sid就是oracle資料庫的一個識別。用於在用一個oracle_home下用來識別不同的資料庫的。
set oracle_sid=test
export oracle_sid=test
在命令模式下最好連線資料庫時都指定oracle_sid,這個也就是存在oracle的系統變數,oracle的後臺程式都是透過oracle_sid來識別而啟動屬於此資料庫的後臺程式的。
但是上面提到了是同一個oracle_base下嗎,如果在不同的oracle_base下是可以存在相同的sid的。
透過檢視資料:透過Oracle提供的一個小工具sysresv,我們可以找到對應於不同的ORACLE_SID,作業系統上建立的共享記憶體段ID(Shared Memory)和訊號量ID(Semaphores)等資訊。
不過俺沒有用過sysresv工具,只能把eygle的先記錄下來。

instance_name
也就是oracle資料庫的例項名,例項是訪問oracle資料庫的一種方式,沒有例項我們無法訪問此資料庫。instance_name預設的就是oracle_sid,但是instance_name和oracle_sid是可以不同的,oracle_sid才是識別資料庫的,不同的資料庫可以擁有相同的instance_name
show parameter instance_name
但是關於v$instance其中的instance_name並不是instance_name而是資料庫的例項的sid,也就是一個唯一的識別碼了。
alter system set instance_name='test001' scope=spfile
shutdown immediate
startup
select instance_name from v$instance

db_name
例項所掛載的資料庫名稱,關係到了具體檔案,個人在spfile中db_name如果不等於controlfile中的db_name也就無法查詢到controlfile,資料庫也就無法mount了。
db_name不操作8個字元的文字串,db_name記錄在資料檔案,日誌檔案和控制檔案,前面的控制檔案和db_name掛鉤已經清楚了,後面的資料檔案和日誌檔案了,其實從mount到open狀態,資料庫要透過db_name來查詢資料檔案和日誌檔案,咋感覺有點像scn。

一個例項可以開啟開啟任何資料庫,因為例項的啟動只需要引數檔案,後面的控制檔案 日誌檔案都是後面的mount open的
一個資料庫可以被一個或多個例項開啟,rac環境下多個例項公用一個資料庫

nomount現在俺也就整理這些,至於mount和open狀態更多的是涉及到資料庫恢復 scn等的情況,陸續會更新關於備份 恢復的篇幅,更多的是從原理上來理解oracle的機制。謝謝了!

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1053437/,如需轉載,請註明出處,否則將追究法律責任。

相關文章