如何區分Oracle的數據庫,實例,服務名,SID

絕對清楚的區分數據庫,實例,服務名,SID

在實際的開發應用中,關於Oracle數據庫,經常聽見有人說建立一個數據庫,建立一個Instance,啓動一個Instance之類的話。其實問他們什麼是數據庫,什麼是Instance,很可能他們給的答案就是數據庫就是Instance,Instance就是數據庫啊,沒有什麼區別。


在這裏,只能說雖然他們Oracle用了可能有了一定的經驗,不過基礎的概念還是不太清楚。

    什麼是數據庫,其實很簡單,數據庫就是存儲數據的一種媒介。比如常用的文件就是一種,在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的人肯定會對實例和數據庫感到困惑,實例到底代表些什麼?爲什麼會有這個概念的出現?
ORACLE實例 = 進程 + 進程所使用的內存(SGA)
實例是一個臨時性的東西,你也可以認爲它代表了數據庫某一時刻的狀態!
數據庫 = 重做文件 + 控制文件 + 數據文件 + 臨時文件
數據庫是永久的,是一個文件的集合。
ORACLE實例和數據庫之間的關係
1.          臨時性和永久性
2.          實例可以在沒有數據文件的情況下單獨啓動 startup nomount , 通常沒什麼意義
3.          一個實例在其生存期內只能裝載(alter database mount)和打開(alter database open)一個數據庫
4.          一個數據庫可被許多實例同時裝載和打開(即RAC),RAC環境中實例的作用能夠得到充分的體現!

下面對實例和數據庫做詳細的詮釋:

在Oracle領域中有兩個詞很容易混淆,這就是“實例”(instance)和“數據庫”(database)。作爲Oracle術語,這兩個詞的定義如下:

 數據庫(database):物理操作系統文件或磁盤(disk)的集合。使用Oracle 10g的自動存儲管理(Automatic Storage Management,ASM)或RAW分區時,數據庫可能不作爲操作系統中單獨的文件,但定義仍然不變。

 實例(instance):一組Oracle後臺進程/線程以及一個共享內存區,這些內存由同一個計算機上運行的線程/進程所共享。這裏可以維護易失的、非持久性內容(有些可以刷新輸出到磁盤)。就算沒有磁盤存儲,數據庫實例也能存在。也許實例不能算是世界上最有用的事物,不過你完全可以把它想成是最有用的事物,這有助於對實例和數據庫劃清界線。

這兩個詞有時可互換使用,不過二者的概念完全不同。實例和數據庫之間的關係是:數據庫可以由多個實例裝載和打開,而實例可以在任何時間點裝載和打開一個數據庫。實際上,準確地講,實例在其整個生存期中最多能裝載和打開一個數據庫稍後就會介紹這樣的一個例子。

是不是更糊塗了?我們還會做進一步的解釋,應該能幫助你搞清楚這些概念。實例就是一組操作系統進程(或者是一個多線程的進程)以及一些內存。這些進程可以操作數據庫;而數據庫只是一個文件集合(包括數據文件、臨時文件、重做日誌文件和控制文件)。在任何時刻,一個實例只能有一組相關的文件(與一個數據庫關聯)。大多數情況下,反過來也成立:一個數據庫上只有一個實例對其進行操作。不過,Oracle的真正應用集羣(Real Application Clusters,RAC)是一個例外,這是Oracle提供的一個選項,允許在集羣環境中的多臺計算機上操作,這樣就可以有多臺實例同時裝載並打開一個數據庫(位於一組共享物理磁盤上)。由此,我們可以同時從多臺不同的計算機訪問這個數據庫。Oracle RAC能支持高度可用的系統,可用於構建可擴縮性極好的解決方案。

 

實例 就是治理相關庫的內存結構的名字(由SGA、PGA、服務器進程、用戶進程、後臺進程等組成)

數據庫 就是實際的磁盤上的文件(數據文件、日誌文件、控制文件等),負責保存數據,但由對應的實例來操作它的數據

服務名 就是對外公佈的名稱,爲網絡監聽服務

其實,在我們傳統的概念裏,數據庫是一個統稱的名字,在Oracle中,你可以把“數據庫”理解成一個大概念,也要把它理解成一個小概念

 

1、一個Oracle數據庫系統中可以同時安裝幾個數據庫,每一個數據庫對應一個唯
一的實例,但是OPS系統除外,可以多個實例同時對一個數據庫操作,稱爲並行服務

2、只是一個名字,SID即是INSTANCE_NAME,SERVICE_NAMES主要用在監聽器中,
爲了方便吧,有些是爲了傳統習慣的延續,有些是爲了更方便的使用

3、NET EASY CONFIG操縱的應該是主機字符串,是爲客戶端服務的
一個數據庫可以對外公佈多個服務名(SERVICE_NAMES)
一個客戶端也可以用多個主機字符串連接到同一個數據庫服務器上

4、一個OS上可以裝多個Oracle數據庫(小的概念),每個庫可以對外公佈多個服
務名,都通過init.ora和listener.ora來實現


今天運氣真好,竟碰到了高手。
我得抓緊時間。
那麼再問:
假如按你的解釋,主機字符串,數據庫服務名,數據庫別名應該是同一個概念吧?

不太一樣

service_names是對外的服務名,是服務器端使用的,一個庫可以設置多個對外服
務名,以實現不同的目的


“主機字符串”的叫法主要在SQL*Plus中使用,是在客戶端使用,
“數據庫別名”主要用在一些開發工具連接Oracle服務器時使用,是通俗叫法
還有像配置ODBC時的Data Source的Service Name,

它們都是一個道理,指向的都是客戶端tnsnames.ora文件中的一小段文本

差不多明白了。
但我還要問:
1。在SQL/PLUS中的登陸中,用USER/PWD@***,那麼,這個***是什麼呢?是主機字
符串還是服務名呢?
2。在設置ODBC時的用戶和密碼是不是一定要是ORACLE中的合法用戶和密碼?
3。 若要向ORACLE代理商購買ORACLE,是以用戶數來算錢的。
那麼,這個“用戶”跟我們在ORACLE中通過CREATE USER USERNAME IDENTIFIED 
BY PASSWord創建的用戶是一個概念嗎?若不是一樣的話,他們有什麼區別?

還有,ORCLE是通過什麼機制來控制用戶的最大數量的?要是我買了8個用戶的,我
能開12個用戶嗎?
能給我的EMAIL嗎?

 

1、主機字符串
2、是的,但不輸也行,引用ODBC名時再給出也可以
3、不是,“用戶數”指的是併發訪問用戶數
(我理解是同時間訪問同一個內存地址的進程數)

買8個用戶,建幾十、上百個用戶也沒問題,只要峯值達不到併發數就可以了
(這裏的用戶數不是Oracle內部的自己建立的那種用戶,應該是進程數)
(多臺機器,每個Oracle內部用戶多次調用,開多個進程)

 

打個比方,你的名字叫小明,但是你有很多外號。你父母叫你小明,但是朋友都叫你的外號。

這裏你的父母就是oracle實例,小明就是sid,service name就是你的外號。

sid用於實例區分各個數據庫,service name用於外部鏈接。

    對於初接觸Oracle 數據庫的人來講,很容易混淆的兩個概念即是Oracle 實例和Oracle 數據庫。這兩

概念不同於SQL sever下的實例與數據庫,當然也有些相似之處。只是在SQL server我們根本不需要花費太

多的精力去搞清SQL實例和數據庫,因爲它簡單易於理解。下面簡要說明一下SQL實例、數據庫,更多的是講

述Oracle下的實例及數據庫。

 

一、SQL server中的實例與數據庫

       1.SQL中的實例指的是一個SQL server服務器上僅有一個缺省實例。缺省實例名即爲機器名ServerName

         (或IP),如果在同一臺機器上再安裝SQL server,我們可以對實例命名如ServerName/InstanceName。

         即一臺SQL server服務器上可以存在多個不同的實例。一個實例下可以存在多個不同的數據庫。

         對於不同實例下的數據庫的訪問,使用ServerName/InstanceName:PortNo即可實現訪問,缺省實例

         爲ServerName:PortNo。

       2.對不同的實例配置IP地址,相關的訪問協議,端口等等。

       3.實例的可訪問性需要啓動該實例對應的相關服務。此處需要注意的是實例名和實例的服務名並不是相

         同的。缺省的實例的服務名爲MSSQLSERVER,而命名實例的服務名爲MSSQL$INSTANCE_NAME。

       4.實例的相關功能性的設置可以通過外圍應用配置來實現。

       5.上述完成後,即可實現對數據庫的訪問。

二、Oracle 實例

        一個Oracle Server由一個Oracle實例和一個Oracle數據庫組成。

           即:Oracle Server = Oracle Instance + Oracle Database

       Oracle實例

           包括了內存結構(SGA)和一系列後臺進程(Background Process),兩者合起來稱爲一個Oracle實例

           即:Oracle Instance = SGA + Background Process

       Oracle內存結構

           包含系統全局區(SGA)和程序全局區(PGA)

           即Oracle Memory Structures = SGA + PGA

           SGA由服務器和後臺進程共享

           PGA包含單個服務器進程或單個後臺進程的數據和控制信息,與幾個進程共享的SGA 正相反,PGA是

              只被一個進程使用的區域,PGA 在創建進程時分配在終止進程時回收。即由服務器進程產生。

      

    1.SGA

       系統全局區SGA,SGA = 數據緩衝區+ 重做日誌緩衝區+ 共享池+ 大池+ Java 池+ 流池

           系統全局區是動態的,由參數SGA_MAX_SIZE決定。

           查看當前系統的SGA大小:show parameter sga_max_size;

           要修改:alter system set sga_max_size=1200m scope=spfile;

           因爲實例內存的分配是在數據庫啓動時進行的,所以要讓修改生效,要重啓數據庫。

          

           ORACLE 10G 引入了ASMM(自動共享內存管理),DBA只需設置SGA_TARGET,ORACLE就會

           自動的對共享池、JAVA池、大池、數據緩衝區、流池進行自動調配。取消自動調配就是

           sga_target設爲。

          

       數據緩衝區(Database buffer cache):存儲從數據文件中獲得的數據塊的鏡像

           大小由db_cache_size 決定

           查看:show parameter db_cache_size;

           設置:alter system set db_cache_size=800M;

          

       重做日誌緩衝區(Redo log buffer):對數據庫的任何修改都按順序被記錄在該緩衝,然後由LGWR進程將

           它寫入磁盤,大小由LOG_BUFFER決定

      

       共享池(Shared pool):是SGA中最關鍵的內存片段,共享池主要由庫緩存(共享SQL區和PL/SQL區)和數據

           字典緩存組成,它的作用是存放頻繁使用的sql,在有限的容量下,數據庫系統根據一定的算法決

           定何時釋放共享池中的sql。

           庫緩存大小由shared_pool_size 決定

              查看:show parameter shared_pool_size

              修改:alter system set shared_pool_size=120m;

          

           數據字典緩存:

              存儲數據庫中數據文件、表、索引、列、用戶和其它數據對象的定義和權限信息

              大小由shared_pool_size 決定,不能單獨指定

          

       大池(Large pool):是一個可選的區域,用於一些大型的進程如Oracle的備份恢復操作、IO服務器進程等

      

       Java 池:該程序緩衝區就是爲Java 程序保留的。如果不用Java程序沒有必要改變該緩衝區的默認大小

      

       流池(Stream pool):被Oracle流所使用

                    

    2.PGA

       是爲每個用戶進程連接ORACLE數據庫保留的內存

       進程創建時分配,進程結束時釋放,只能被一個進程使用

       PGA包括了以下幾個結構:

       ()排序區

       ()遊標狀態區

       ()會話信息區

       ()堆棧區

       由參數:pga_aggregate_target 決定

      

    3.幾類進程:用戶進程,服務器進程,後臺進程,其它可選進程

       用戶進程

           在用戶連接數據庫產生,請求oracle服務器連接,必須要先建立一個連接,不會直接和oracle服務器連接

       服務器進程

           當連接實例並建立用戶會話時產生,獨立服務器或者提供共享服務器都能產生

       後臺進程

           維持物理和內存之間的聯繫,用來管理數據庫的讀寫,恢復和監視等工作。

           Server Process主要是通過他和user process進行聯繫和溝通,並由他和user process進行數據的交換。

           在Unix機器上,Oracle後臺進程相對於操作系統進程,也就是說,一個Oracle後臺進程將啓動一個操作

           系統進程。

           在Windows機器上,Oracle後臺進程相對於操作系統線程,打開任務管理器,我們只能看到一個

           ORACLE.EXE的進程,但是通過另外的工具,就可以看到包含在這裏進程中的線程。

 

        必須要有的後臺進程

       DBWn       -->數據庫寫進程

       PMON       -->程序監控進程

       SMON       -->系統監控進程

       LGWr       -->日誌寫進程

       CKPT       -->檢查點進程

 

       可選進程:

       ARCN       歸檔進程

       RECO

       Snnn

       pnnn

 

       DBWn(數據庫寫進程)

           負責將修改過的數據塊從數據庫緩衝區高速緩存寫入磁盤上的數據文件中

       寫入條件:

       發生檢查點

       髒緩存達到限制

       沒有自由的緩存

       超時發生

       表空間離線

       表空間只讀

       表被刪除或者截斷

       開始備份表空間

           可以修改數據寫進程的數量

           alter system set db_writer_processes=3 scope=spfile;

          

      

       PMON(程序監控進程)

           清除失效的用戶進程,釋放用戶進程所用的資源。

           如PMON將回滾未提交的工作,釋放鎖,釋放分配給失敗進程的SGA資源。

       清除失敗的進程

       回滾事務

       釋放鎖

       釋放其他資源

      

       SMON(系統監控進程)

           檢查數據庫的一致性,當啓動失敗時完成災難恢復等

       實列恢復時,前滾所有重做日誌中的文件,打開數據庫爲了用戶能訪問,回滾未提交的事務,釋放臨時表空間

       清除臨時空間,聚結空閒空間,從不可用的文件中恢復事務的活動,OPS中失敗節點的實例恢復

       清除OBJ$表

       縮減回滾段

       使回滾段脫機

      

       LGWr(日誌寫進程)

           將重做日誌緩衝區中的更改寫入在線重做日誌文件

       條件:

       提交的時候(commit)

       達到/滿

       每隔秒

       有大於M 重做日誌緩衝區未被寫入磁盤

       DBWR需要寫入的數據的SCN號大於LGWR 記錄的SCN號,DBWR 觸發LGWR寫入

       超時

       在dbwr進程些之前寫日誌

      

       CKPT(檢查點進程)

           DBWR/LGWR的工作原理,造成了數據文件,日誌文件,控制文件的不一致,CKPT進程負責同步數據文件,

              日誌文件和控制文件

           CKPT會更新數據文件/控制文件的頭信息

       條件:

       在日誌切換的時候

       數據庫用immediate ,transaction ,normal選項shutdown數據庫的時候

       根據初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設置的數值來確定

       用戶觸發

      

       ARCN(歸檔進程)

           在每次日誌切換時把已滿的日誌組進行備份或歸檔

       條件:

       數據庫以歸檔方式運行的時候

 

       RECO

           負責解決分佈事物中的故障。Oracle可以連接遠程的多個數據庫,當由於網絡問題,有些事物處於懸而未決的狀態。

           RECO進程試圖建立與遠程服務器的通信,當故障消除後,RECO進程自動解決所有懸而未決的會話。

      

       Server Process(服務進程)

           分爲專用服務進程(Dedicated Server Process)和共享服務進程(MultiTreaded Server Process)

           專用服務進程:一個服務進程對應多個用戶進程,輪流爲用戶進程服務。

      

       用戶進程(User Process)、服務進程(Server Process)、後臺進程(Background Processes)的啓動

           用戶進程: 數據庫用戶請求Oralce server會話時被啓動

           服務進程:當用戶會話啓動後,連接到Oracle實例時該進程被啓動

           後臺進程:當Oracle實例被啓動時,啓動相關的後臺進程

          

三、Oracle 數據庫

       一系列物理文件的集合

            包括控制文件、數據文件、聯機日誌文件、參數文件、密碼文件等  

            即:Oracle Database = Controlfile + datafile + logfiel + spfile +..

    1.控制文件(controlfile)

        數據庫的名字,檢查點信息,數據庫創建的時間戳

       所有的數據文件,聯機日誌文件,歸檔日誌文件信息

       備份信息等

             

    2.數據文件(datafile)

        包含了用戶和應用程序的所有數據

       --查看數據文件信息

      

      

    3.聯機日誌文件

        記錄了用戶對數據庫的所有操作,一個數據庫中至少要有兩個日誌組文件,每個日誌組中至少有一個日誌成員

       日誌組中的多個日誌成員是互爲鏡相關係

      

    4.歸檔日誌文件

        Oracle可以運行在兩種模式之中,歸檔模式和非歸檔模式。在歸檔模式中,爲了保存用戶的所有修改,

       在聯機日誌文件切換後和被覆蓋之間系統將他們另外保存成一組連續的文件系列,該文件系列就是歸檔日誌文件。

        用戶恢復意外情況出現的數據丟失、異常等。

      

    5.參數文件(pfile和spfile)

        initSID.ora或init.ora文件,通常位於:$ORACLE_BASE/admin/<SID>/pfile

        初始化文件記載了許多數據庫的啓動參數,如內存,控制文件,進程數等,在數據庫啓動的時候加載(Nomount時加載)

   

    6.其他文件

       密碼文件:用於Oracle 的具有sysdba權限用戶的認證.

       告警日誌文件:報警日誌文件(alert.log或alrt.ora),記錄數據庫啓動,關閉和一些重要的出錯信息

           查看路徑:select value from v$PARAMETER where name =‘background_dump_dest’;

   

    7.數據庫邏輯組織結構

       表空間、段、區、塊

       一個數據庫由一個或多個表空間組成,一個表空間只能屬於一個數據庫

       一個表空間由一個或多個多個數據文件組成,一個數據文件只能屬於一個表空間

       一個數據文件由一個或多個操作系統塊組成,每一個操作系統塊只能數以一個數據文件

       一個表空間可以包含一個或多個段,一個段只能屬於一個表空間

       一個段由一個或多個區組成,每一個區只能屬於一個段

       一個區由一個或多個Oracle 塊組成,每一個Oracle塊只能屬於一個區

       一個區只能屬於一個數據文件,數據文件的空間可以分配到一個或多個區

       一個Oracle 塊由一個或多個操作系統塊組成,一個操作系統塊是一個Oracle塊的一部分

      

      

四、Oracle實例和Oracle數據庫的關係

    1.一個實例能夠裝載及打開僅僅一個數據庫      

    2.一個數據庫能夠被多個實例裝載並打開

    3.實例與數據庫的對應關係是一對一或多對一的關係

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章