1. 程式人生 > >資料庫:Oracle - 資料庫,例項,服務名,SID

資料庫:Oracle - 資料庫,例項,服務名,SID

轉載自:http://www.zhetao.com/content240
絕對清楚的區分資料庫,例項,服務名,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/[email protected]***,那麼,這個***是什麼呢?是主機字
符串還是服務名呢?
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.例項與資料庫的對應關係是一對一或多對一的關係