1. oracle的基本概念
(1)全局數據庫名(global_name)
主要用於在分佈式數據庫系統中區分不同的數據庫,它是由數據庫名和數據庫域名組成,格式為“數據庫名.數據庫域名”,數據庫域名允許為空,即只寫數據庫名。
全局數據庫名(global_name)=數據庫名(db_name)+數據庫域名(db_domain)。
如數據庫名為myOracle ,數據庫宿主機的域為mydomain,則數據庫的全局數據庫名為myOracle.mydomain,呵呵 又出來個數據庫名和數據庫域名。
查詢當前全局數據庫名
方法一: select * from global_name;
(2)數據庫名(db_name)
oracle可以在一台電腦上可以創建多個數據庫,數據庫名(db_name)就是一個數據庫的標識。db_name會保持在數據文件頭裏。
查詢當前數據庫名
方法一: select name from v$database;
方法二:show parameter db_name
方法三:查看參數文件
(3)數據庫域名(db_domain)
定義一個數據庫所在的域,該域的命名同互聯網的’域’沒有任何關係,只是數據庫管理員為了更好的管理分佈式數據庫而根據實際情況決定的。當然為了管理方便,可以將其等於互聯網的域。
查詢數據庫域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter db_domain
方法三:在參數文件中查詢
使用數據庫名(da_name)對一個數據庫進行唯一標識,這種表示對於單個數據庫是足夠的,但是隨着由多個數據庫構成的分佈式數據庫的普及,這種命令數據庫的方法給數據庫的管理造成一定的負擔,因為各個數據庫的名字可能一樣,造成管理上的混亂。為了解決這種情況,引入了db_domain參數,這樣在數據庫的標識是由db_name和db_domain兩個參數共同決定的,避免了因為數據庫重名而造成管理上的混亂。這類似於互連網上的機器名的管理。我們將db_name和db_domain兩個參數用‘.’連接起來,表示一個數據庫,並將該數據庫的名稱稱為global_name,即它擴展了db_name。db_name參數只能由字母、數字、’_’、’#’、’$’組成,而且最多8個字符。
一個完整的Oracle數據庫包括兩個部分:數據庫和數據庫實例。
(4)數據庫
數據庫是存儲數據的多個物理文件的集合,如控制文件,數據文件,參數文件,日誌文件,臨時文件等 ,它是靜態的、永久的,只要文件存在它就存在。數據庫名(db_name)就是對數據庫的標識。
(5)數據庫實例
oarcle數據庫服務器主要有兩部分組成:物理數據庫和數據庫管理系統
數據庫管理系統是用户和物理數據庫之間的一箇中間層,是軟件層。這個軟件層具有一定的結構,這個結構又被稱為實例結構。
在啓動數據庫時,oracle首先要在內存中獲取、劃分、保留各種用途的區域,運行各種用途的後台進程,即創建一個實例(instance),然後由該實例裝載、打開數據庫,最後由這個實例來訪問和控制數據庫的各種物理結構。 數據庫至少由一個oracle實例引用,該實例由oracle系統標識符(system identity)唯一標識,用於區別此計算機上的任何其他實例。
在啓動數據庫並使用數據庫的時候,實際上是連接到該數據庫的實例,通過實例來連接、使用數據庫。所以實例是用户和數據庫之間的一箇中間層。
實例是由操作系統的內存結構和一系列進程所組成的,可以啓動和關閉。
一台計算機上可以創建多個oracle數據庫,當同時要使用這些數據庫時,就要創建多個實例。為了不使這些實例相互混淆,每個實例都要用稱為SID的符號來區分,即創建這些數據庫時填寫的數據庫SID。
數據庫實例是用户訪問數據庫的中間層,是使用數據庫的手段,它為用户訪問數據庫提供了必要的內存空間和多個工作進程,它是動態的、臨時的,簡單的説,Oracle實例就是由內存空間和工作進程兩部分組成。 我們只能通過實例操作數據庫,同一時間,一個實例只能打開一個數據庫,也就是一個實例只能操作或管理一個數據庫,但一個數據庫可以被多個是實例打開。實例可以在沒有數據文件的情況下單獨啓動,(startup nomount)但這通常是沒有意義的,一個實例在生成期內只能裝載(alter database mount)和打開(alter database open)數據庫。
ORACLE實例有兩種類型:單進程實例 和 多進程實例。
單進程ORACLE(又稱單用ORACLE)是一種數據庫系統,一個進程執行全部ORACLE代碼。由於ORACLE部分和客户應用程序不能分別以進程執行,所以ORACLE的代碼和用户的數據庫應用是單個進程執行。在單進程環境下的ORACLE 實例,僅允許一個用户可存取。例如在MS-DOS上運行ORACLE 。
多進程ORACLE實例(又稱多用户ORACLE)使用多個進程來執行ORACLE的不同部分 ,對於每一個連接的用户都有一個進程。
在多進程系統中,進程分為兩類:用户進程 和ORACLE進程。當一用户運行一應用程序,如PRO*C程序或一個ORACLE工具(如SQL*PLUS),為用户運行的應用建立一個用户進程。
進程是操作系統的基本執行單元,它是具有獨立數據處理功能的正在執行的程序。Oracle系統的進程包括三種類型:
①用户進程
用户在客户端運行一個應用程序(例如 Pro*C 程序)或 Oracle 工具(如OEM或 SQL*Plus)時,系統將為該用户創建一個用户進程。
用户進程負責與Oracle服務器建立連接和會話並向服務器發出數據處理請求,得到處理結果後再輸出給用户。
Oracle允許為一個用户同時創建多個會話 。
②服務進程
Oracle為用户進程創建一個服務進程或分配一個空閒的服務進程。
服務進程負責在用户進程和Oracle實例之間調度請求和響應,主要完成:
•解析與運行應用程序提交的SQL語句;
•數據處理時用到的數據如果不在SGA 中,負責將所需的數據塊從磁盤上的數據文件讀入SGA 的數據緩存區;
•以用户進程能理解的形式返回SQL 語句的執行結果。
用户進程和服務進程之間的對應關係是由Oracle數據庫的工作模式決定的。數據庫通常有兩種工作模式:
③後台進程
Oracle實例啓動時,為了保證該實例的正常使用,系統將為該實例啓動一些後台進程。
這些進程是操作數據庫的基礎,不管有沒有用户連接數據庫,這些進程都會被啓動。
後台進程包括:
DBWR(Database Write) : 數據庫寫入程序
LGWR(Log Write) : 日誌寫入程序
CKPT(Checkpoint) : 檢查點
SMON (System Monitor): 系統監控
PMON(Process Monitor) : 進程監控
ARCH(Archive) : 歸檔
RECO : 恢復
LCKn : 封鎖;
(6)實例名(instance_name)
數據庫實例名(instance_name)用於對外部連接。在操作系統中要取得與數據庫的聯繫,必須使用數據庫實例名。例如,要去連接一個數據庫服務器,就必須知道其數據庫實例名。
查詢當前數據庫實例名
方法一:select instance_name from v$instance;
方法二:show parameter instance_name
方法三:在參數文件中查詢。
(7)服務名(Service_name)
該參數是oracle8i新引進的。在8i以前,我們用SID來表示標識數據庫的一個實例,但是在Oracle的並行環境中,一個數據庫對應多個實例,這樣就需要多個網絡服務名,設置繁瑣。為了方便並行環境中的設置,引進了Service_name參數,該參數對應一個數據庫,而不是一個實例,而且該參數有許多其它的好處。該參數的缺省值為Db_name. Db_domain,即等於Global_name。一個數據庫可以對應多Service_name,以便實現更靈活的配置。該參數與SID沒有直接關係,即不必Service name 必須與SID一樣。如果數據庫有域名,則數據庫服務名就是全局數據庫名,否則,數據庫服務名與數據庫名相同。
查詢當前數據庫服務名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三
:select instance_namefrom v$instance;
方法四:在參數文件中查詢。
注意:方法三:select instance_namefrom v$instance; 的值是來自操作系統的oracle_sid,oracle_sid是操作系統的環境變量。
以上這些概念非常容易混淆,且不容易理解,有的可能在使用過程中才能理解的比較透徹。