標籤:
1. 資料庫和執行個體
什麼是資料庫,其實很簡單,資料庫就是儲存資料的一種媒介。比如常用的檔案就是一種,在Oracle10g中,資料的儲存有好幾種。第一種是檔案形 式,也就是在你的磁碟中建立一批檔案,然後在這些檔案中儲存資訊。第二種就是磁碟陣列形式,這個是什麼意思呢,這個就是說明資料庫不是存放為某個檔案,而 是把一個或者多個磁碟格式化成Oracle的一種格式了,等於整個磁碟就是存放Oracle資料庫的,不能作為別的用途。這樣的優點是儲存效能高,因為不再藉助別的檔案格式了,而是把整個磁碟都成為Oracle最適應的檔案系統格式。當然還可能有別的形式,比如網路什麼的。不過我們最常用的還是檔案格式 的,在檔案格式中,資料庫指的就是那些資料檔案,控制檔案以及REDO檔案等等一系列檔案。
而什麼是Instance呢,Instance其實就是指的作業系統中一系列的進程以及為這些進程所分配的記憶體塊。在Oracle中,我們可以建立一個 Oracle的Instance,這個時候雖然有了進程還有SGA等一系列的記憶體快,但是這個時候並沒有把資料庫檔案讀取進來。所以只是一個執行個體,以後你可以通過命令手動或者自動地把資料庫檔案載入進我們的資料庫Instance中,這個時候的資料庫才可以讓我們真正的開始訪問操作。
所以說,資料庫的應用如果想實現,資料庫和資料庫Instance是缺一不可的,如果只有資料庫的那些檔案,那麼,只能代表資料在這個檔案中,但是我們無法直接進行操作。而如果只有資料庫Instance,那麼我們雖然可以進行操作,但是也不知道操作哪些資料,操作產生的資料也無法儲存等等。所以,當一個 Oracle Instance真正Load了一個Oracle Database了以後,資料庫才可以被我們使用。
在這裡要注意一點的是,Oracle的執行個體在啟動以後,只能load一次資料庫,如果想把資料庫與Instance斷開,然後再重新掛在一個資料庫 Instance,那麼就需要你首先把資料庫Instance進程結束,然後重建立立這個instance的一個進程,再load另外一個資料庫。否則肯 定要拋除ORA-16169錯誤,說資料庫已經被開啟。因為一個資料庫Instance在其生存期中最多隻能load和開啟一個instance.
資料庫伺服器 = 資料庫 + 執行個體
資料庫 = 重做檔案 + 控制檔案 + 資料檔案 + 臨時檔案
ORACLE執行個體 = 進程 + 進程所使用的記憶體(SGA)
ORACLE執行個體和資料庫之間的關係1. 臨時性和永久性2. 執行個體可以在沒有資料檔案的情況下單獨啟動 startup nomount , 通常沒什麼意義3. 一個執行個體在其生存期內只能裝載(alter database mount)和開啟(alter database open)一個資料庫4. 一個資料庫可被許多執行個體同時裝載和開啟(即RAC),RAC環境中執行個體的作用能夠得到充分的體現
2. db_name instance_name ORACLE_SID
db_name用於區分一個資料庫的內部標識,在安裝資料庫、建立新資料庫、建立控制檔案、修改資料庫結構、利用RMAN備份時都需要使用資料庫名。
存在於(但不僅限於)以下地方:
(1) 以二進位方式儲存在控制檔案中。
(2) Pfile/spfile中:db_name
(3) 資料庫物理結構檔案目錄中
D:\oracle\oradata\db_name\*.*
D:\oracle\admin\db_name\*.*
查詢方法:select name from v$database;
instance_name用於和作業系統進行聯絡。在作業系統中要取得與資料庫之間的互動必須使用執行個體名。例如,要和某一個資料庫伺服器串連,則必須知道其資料庫執行個體名,知道資料庫名是沒用的。在安裝/建立資料庫後,執行個體名允許修改的。
存在於(但不僅限於)以下地方:
(1) Windows nt/2000註冊表中(oracle_sid)
(2) pfile/spfile中:instance_name
(3) 資料庫參數檔案名稱中:init.ora
查詢方法:select instance_name from v$instance;
與資料庫名的關係:一般是一一對應的,RAC中除外。 從名稱上來說,instance_name=oracle_sid。對於資料庫執行個體名的描述,有時使用instance_name,有時使用oracle_sid,這兩個都是資料庫執行個體名。但instance_name是oracle資料庫參數,而oracle_sid是作業系統環境變數。
Oracle_sid用於和作業系統互動。也就是說,在作業系統中要想得到執行個體名,必須使用oracle_sid。例如同一伺服器上建立了多個資料庫,則就有多個對應的執行個體,可以通過在作業系統中設定oracle_sid指定要登入的資料庫:
$oracle_sid=orcl
$export oracle_sid
C:\>set oracle_sid=orcl
存在於(但不僅限於)以下地方:
(1) Windows nt/2000註冊表中(oracle_sid)
(2) 資料庫參數檔案名稱中:init.ora
執行個體名除用於和作業系統聯絡外,還用於網路連接,即與用戶端或其他伺服器之間的串連。配置網路連接,就是配置網路連接串。
3. sid、service name、net service name
SID唯一地標識一個Oracle執行個體,而ORACLE_SID啟動該執行個體,啟動之後我們得到一個Oracle執行個體,這個執行個體有一個名字:INSTANCE_NAME。SID==>>ORACLE_SID==>>INSTANCE_NAME這三者是一致的,是完全相同的。同時這個執行個體向外提供服務,所以又有一個SERVICE_NAME。
而SID_NAME出現在lisnter.ora檔案中:
1 SID_LIST_LISTENER = 2 (SID_LIST = 3 (SID_DESC = 4 (SID_NAME = PL***tProc) 5 (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) 6 (PROGRAM = extproc) 7 ) 8 (SID_DESC = 9 (SID_NAME = jiagulun)10 (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)11 (GLOBAL_DBNAME = jiagulun)12 )13 )14 15 LISTENER =16 (DESCRIPTION_LIST =17 (DESCRIPTION =18 (ADDRESS = (PROTOCOL = TCP)(HOST = redhat4)(PORT = 1521))19 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))20 )21 )
listener.ora中的SID_NAME的值必須與SID的值一致。通過listener.ora中的SID_NAME和GLOBAL_DBNAME兩 個參數以及用戶端的tnsnames.ora中的SERVICE_NAME,這三個參數一起作用,可以實現ORACLE用戶端與服務端的隔離。
1 //tnsnames.ora 2 3 JIAGULUN = 4 (DESCRIPTION = 5 (ADDRESS_LIST = 6 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521)) 7 ) 8 (CONNECT_DATA = 9 (SERVICE_NAME = jiagulun)10 )11 )12 13 EXTPROC_CONNECTION_DATA =14 (DESCRIPTION =15 (ADDRESS_LIST =16 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))17 )18 (CONNECT_DATA =19 (SID = PL***tProc)20 (PRESENTATION = RO)21 )22 )
用戶端根據tnsname.ora中的SERVICE_NAME和地址(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521)),到這個地址去訪問監聽器。然後監聽器根據檔案lisnter.ora檔案中的GLOBAL_NAME來判斷是否有一個
GLOBAL_DBNAME 和 SERVICE_NAME 相等。 如果相等,則建立用戶端到SID標識的服務端執行個體的串連。(有一個例外:tnsnames.ora中可以用參數SID來取代SERVICE_NAME,這 時比較的是tnsnames.ora中的SID和lisnter.ora中的SID_NAME,但是從oracle9i開始不推薦使用SID。因為SID 無法隔離用戶端和服務端) tnsnames.ora中的地址(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))是監聽器監聽的地址。監聽器進程一直在這個地址上監聽,等待用戶端的串連。
總結一下:
1)用戶端和服務端的隔離是通過lisnter.ora中的GLOBAL_DBNAME來實現的,GLOBAL_DBNAME是一個串連用戶端和服務端的橋樑:a>client端tnsnames.ora中的SERVICE_NAME和server端lisnter.ora中的GLOBAL_DBNAME相等;b>server端的lisnter.ora中的SID_NAME與系統的SID相等;
2)SID==>>SID_NAME==>>ORACLE_SID==>>INSTANCE_NAME 四者是一致的,相等的;3)可以在lisnter.ora中配置多個不同的GLOBAL_NAME來供不同的用戶端SERVICE_NAME來對應,從而實現不同的用戶端使用不同的SERVICE_NAME來訪問同一個SID執行個體使用,配置如下:
1 //lisnter.ora 2 3 (SID_DESC = 4 (SID_NAME = jiagulun) 5 (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1) 6 (GLOBAL_DBNAME = jiagulun) 7 ) 8 (SID_DESC = 9 (SID_NAME = jiagulun)10 (ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1)11 (GLOBAL_DBNAME = jgl)12 )13 14 15 //tnsnames.ora16 17 JIAGULUN =18 (DESCRIPTION =19 (ADDRESS_LIST =20 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))21 )22 (CONNECT_DATA =23 (SERVICE_NAME = jiagulun)24 )25 )26 27 JGL =28 (DESCRIPTION =29 (ADDRESS_LIST =30 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.100)(PORT = 1521))31 )32 (CONNECT_DATA =33 (SERVICE_NAME = jgl)34 )35 )
Oracle基本概念