qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          Oracle實例與數據庫的概念詳細解釋

          剛接觸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能支持高度可用的系統,可用于構建可擴縮性極好的解決方案。
            一個實例在其生存期中最多只能裝載和打開一個數據庫。要想再打開這個(或其他)數據庫,必須先丟棄這個實例,并創建一個新的實例。
            重申一遍:
            實例是一組后臺進程和共享內存。
            數據庫是磁盤上存儲的數據集合。
            實例“一生”只能裝載并打開一個數據庫。
            數據庫可以由一個或多個實例(使用RAC)裝載和打開。
            前面提到過,大多數情況下,實例和數據庫之間存在一種一對一的關系。可能正因如此,才導致人們很容易將二者混淆。從大多數人的經驗看來,數據庫就是實例,實例就是數據庫。

          運行一個Oracle實例,但是它訪問的數據庫每天都可能不同(甚至每小時都不同),這取決于我的需求。只需有不同的配置文件,我就能裝載并打開其中任意一個數據庫。在這種情況下,任何時刻我都只有一個“實例”,但有多個數據庫,在任意時間點上只能訪問其中的一個數據庫。
            所以,你現在應該知道,如果有人談到實例,他指的就是Oracle的進程和內存。提到數據庫時,則是說保存數據的物理文件。可以從多個實例訪問一個數據庫,但是一個實例一次只能訪問一個數據庫。
            1.oracle數據庫系統中,DBMS可以管理多個數據庫實例嗎?還是需要一個oracle服務管理一個實例?
            oracle里面一個數據庫系統可以又多個實例。你可以運行dbca,在界面里面你可以看到可以創建新的實例,但是大多數情況下,oracle都只是建立一個實例。
            2需要建立教務數據庫,財務數據庫兩個db,
            是可以的,不過通常的做法是建再2個用戶放在不同的tablespaces上面。一個用戶存儲教務數據庫表數據,一個存放財務數據庫表數據。
            3.oracle中的schema屬于哪個層次?
            schema簡單來講,你可以理解成一個用戶以及用戶所擁有的所有對象。其實就相當于sqlserver的庫。
            4.oracle中這樣做。
            create user Test;
            grant [connect,……]to Test;
            create table……
            創建屬于此用戶的表及其他對象,那么這個用戶數否可以代表為一個應用db?
            同3一樣,你可以這樣理解成一個用戶以及用戶下面所有的對象其實就是sqlserver中的db了,實際生產環境中,為了減少成本和充分利用oracle數據庫的資源,我們都是一個項目一個用戶,一個應用一個用戶,然后在不同的用戶下面建立相應的表、視圖、存儲過程、存儲函數、序列等等。
            下面來看一個簡單的例子。假設我們剛安裝了Oracle 10g10.1.0.3。我們執行一個純軟件安裝,不包括初始的“啟動”數據庫,除了軟件以外什么都沒有。
            通過pwd命令可以知道當前的工作目錄(這個例子使用一個Linux平臺的計算機)。我們的當前目錄是dbs(如果在Windows平臺上,則是database目錄)。執行ls–l命令顯示出這個目錄為“空”。其中沒有init.ora 文件,也沒有任何存儲參數文件(stored parameter file,SPFILE);存儲參數文件將在第3章詳細討論。
            使用ps(進程狀態)命令,可以看到用戶ora10g運行的所有進程,這里假設ora10g是Oracle軟件的所有者。此時還沒有任何Oracle數據庫進程。
            然后使用ipcs命令,這個UNIX命令可用于顯示進程間的通信設備,如共享內存、信號量等。目前系統中沒有使用任何通信設備。
            然后啟動SQL*Plus(Oracle的命令行界面),并作為SYSDBA連接(SYSDBA賬戶可以在數據庫中做任何事情)。連接成功后,SQL*Plus報告稱我們連上了一個空閑的實例:
            我們的“實例”現在只包括一個Oracle服務器進程,見以下輸出中粗體顯示的部分。此時還沒有分配共享內存,也沒有其他進程。
            現在來啟動實例:
            這里提示的文件就是啟動實例時必須要有的一個文件,我們需要有一個參數文件(一種簡單的平面文件,后面還會詳細說明),或者要有一個存儲參數文件。現在就來創建參數文件,并放入啟動數據庫實例所需的最少信息(通常還會指定更多的參數,如數據庫塊大小、控制文件位置,等等)。
            然后再回到SQL*Plus:
            這里對startup命令加了nomount選項,因為我們現在還不想真正“裝載”數據庫(要了解啟動和關閉的所有選項,請參見SQL*Plus文檔)。
            注意
            在Windows上運行startup命令之前,還需要使用oradim.exe實用程序執行一條服務創建語句。
            現在就有了所謂的“實例”。運行數據庫所需的后臺進程都有了,如進程監視器(process monitor,PMON)、日志寫入器(log writer,LGWR)等,這些進程將在第5章詳細介紹。
            再使用ipcs命令,它會首次報告指出使用了共享內存和信號量,這是UNIX上的兩個重要的進程間通信設備:
            注意,我們還沒有“數據庫”呢!此時,只有數據庫之名(在所創建的參數文件中),而沒有數據庫之實。如果試圖“裝載”這個數據庫,就會失敗,因為數據庫根本就不存在。下面就來創建數據庫。有人說創建一個Oracle數據庫步驟很繁瑣,真是這樣嗎?我們來看看:
            這里創建數據庫就是這么簡單。但在實際中,也許要使用一個稍有些復雜的CREATE DATABASE命令,因為可能需要告訴Oracle把日志文件、數據文件、控制文件等放在哪里。不過,我們現在已經有了一個完全可操作的數據庫了。可能還需要運行$ORACLE_HOME/rdbms/admin/ catalog.sql腳本和其他編錄腳本(catalog script)來建立我們每天使用的數據字典(這個數據庫中還沒有我們使用的某些視圖,如ALL_OBJECTS),但不管怎么說,數據庫已經有了。可以簡單地查詢一些Oracle V$視圖(具體就是V$DATAFILE、V$LOGFILE和V$CONTROLFILE),列出構成這個數據庫的文件:
            Oracle使用默認設置,把所有內容都放在一起,并把數據庫創建為一組持久的文件。如果關閉這個數據庫,再試圖打開,就會發現數據庫無法打開:
            一個實例在其生存期中最多只能裝載和打開一個數據庫。要想再打開這個(或其他)數據庫,必須先丟棄這個實例,并創建一個新的實例。
            重申一遍:
            1.實例是一組后臺進程和共享內存。
            2.數據庫是磁盤上存儲的數據集合。
            3.實例“一生”只能裝載并打開一個數據庫。
            4.數據庫可以由一個或多個實例(使用RAC)裝載和打開。
            前面提到過,大多數情況下,實例和數據庫之間存在一種一對一的關系。可能正因如此,才導致人們很容易將二者混淆。從大多數人的經驗看來,數據庫就是實例,實例就是數據庫。
            不過,在許多測試環境中,情況并非如此。在我的磁盤上,可以有5個不同的數據庫。測試主機上任意時間點只會運行一個Oracle實例,但是它訪問的數據庫每天都可能不同(甚至每小時都不同),這取決于我的需求。只需有不同的配置文件,我就能裝載并打開其中任意一個數據庫。在這種情況下,任何時刻我都只有一個“實例”,但有多個數據庫,在任意時間點上只能訪問其中的一個數據庫。
            所以,你現在應該知道,如果有人談到實例,他指的就是Oracle的進程和內存。提到數據庫時,則是說保存數據的物理文件。可以從多個實例訪問一個數據庫,但是一個實例一次只能訪問一個數據庫。

          posted on 2013-11-22 12:20 順其自然EVO 閱讀(214) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2013年11月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 凤凰县| 伽师县| 翁牛特旗| 千阳县| 五家渠市| 平陆县| 丁青县| 浑源县| 云南省| 金门县| 来宾市| 高雄县| 星子县| 望江县| 南汇区| 枞阳县| 太谷县| 大城县| 余干县| 石狮市| 杭锦后旗| 大兴区| 措勤县| 色达县| 固始县| 锡林浩特市| 延川县| 中方县| 满洲里市| 锦屏县| 永嘉县| 康定县| 运城市| 都昌县| 金堂县| 津南区| 岱山县| 于都县| 定南县| 江西省| 黄石市|