第三章、創建數據庫

 本章學習創建一個數據庫的理論和實踐,通過相關工具,圖形界面或者命令行和一些管理選項來創建數據庫方面的技巧,從而對Oracle服務器體系結構又更進一步瞭解。但是往往這個過程讓人感覺到神祕化。創建一個數據庫並不是像人們想象的那麼費力,只要你理解上面是必須的並且準備好適當的腳本你可以在喝一杯茶的時間內創建20個數據庫。另外你不用擔心如何正確的創建,幾乎所有的事情都在創建的這個時候已經自己準備好了。它可能會讓你想到這個數據庫結構是如何一步一步的建立的,數據庫的作用和運行環境,但是所有的這些問題都可以在創建後再進行改變(除了一個不能改變)。通常在這個階段儘量使問題簡單化。先創建並讓它工作着,過後再考慮如何根據用戶再進行配置。
Oracle服務器的體系結構
一個Oracle服務器包括兩個實體:實例(instance)和數據庫(database)(如圖3-1)
              圖3-1
它們是相互獨立的並又連接起來。通過數據庫創建進程首先創建實例然後才創建數據庫。在一個典型的單一實例環境下實例和數據庫是一對一的,一個單一的實例連接一個單一的數據庫。但是通常情況下是實例和數據庫是多對一的:在不同計算機上的多個實例在一個共享的磁盤系統下操縱一個公共數據庫。比如大家所熟知的真正應用集羣(Real Application Cluster),即RAC。RAC可以在執行,容錯和可伸縮性方面具有令人驚訝的能力並是Oracle網格計算所必須的技術。在以前發佈的RAC版本(或者更早的Oracle Parallel Server)都是額外收費附加產品。但是在Oracle Database 10g 標準版中,RAC是免費捆綁在其中的,這也表明Oracle公司很想向用戶推廣其RAC應用環境。標準版的RAC限制計算機的CPU數量最多不能超過2個,並且在一個集羣環境中最多只能有4臺計算機,但是儘管這樣已經爲用戶提供了很強大的連接環境了。RAC在企業版中是需要額外購買才能使用的,其可伸縮性將更加有效,無任何限制除非你自己的硬件和操作系統本身有限制。它當然也可以一個實例通過數據庫連接連接到多個數據庫。在過去你可能處理過許多這樣的情形:一個電腦上一個實例打開存儲在本地磁盤上的一個數據庫。
   實例(instance)有存儲結構和進程組成。它在你的內存和CPU中的存在是短暫的。數據庫(database)由磁盤上的物理文件組成。這樣實例的生命週期僅僅是當它在內存中的那段時間---它可以被開始和停止。與之相比,數據庫一旦被創建就一直存在除非你故意刪除組成數據庫的那些文件。在數據庫的物理結構中,管理員和用戶看到的是數據庫的邏輯結構。Oracle數據庫負責邏輯結構和物理結構的和對應:程序員不用知道數據庫如何存取數據以及數據存放的具體位置,他們只需關注數據庫的邏輯結構,比如表。同樣管理員不可能知道哪個字節的數據在哪個物理結構中,唯一能看到的是系統中存放數據的文件而已。只有數據庫管理員被允許(也是必須)即看到物理結構又能看到邏輯結構。數據字典包括描述整個服務器的元數據以及管理數據庫物理結構和邏輯結構的一致性。創建數據字典是創建數據庫所必須的一步。創建進程最後才通過產生一些必要的視圖,PL/SQL包,和易於管理的Enterprise Manager Database Control使數據庫可用。
實例:存儲結構和進程
一個Oracle實例由一塊被叫做系統全局區(System Global Area即SGA)和一些進程組成。系統全局區(SGA)至少包括3個數據區:共享池(shared pool),數據庫緩衝區(database buffer cache)和日誌緩衝區(log buffer)。通常情況下還有大池(large pool),java池(java pool)和流池(streams pool)。當開始一個實例,這些系統全局區的部分區塊大小便被固定下來;而一些是可以動態改變的,但是沒有一個是在數據庫創建的時候固定下來的:你可以隨時停止和重新開始一個實例,併爲實例可以配置不同的SGA大小。
考試小貼士:
記住系統全局區(SGA)的組成:共享池,數據庫緩衝區和日誌緩衝區。
    共享池(shared pool)又可再細分爲一些其它的組成結構。本書僅簡單的介紹兩種共享池組成結構:庫緩衝區(library cache)和數據字典緩衝區(data dictionary cache)。庫緩衝區主要用來以存儲最近執行的代碼的解析形態。解析是把程序員的代碼轉換成可執行的一個過程,這個比較慢的過程也是Oracle所必須的。通過緩存被解析的代碼可以讓這些解析過的代碼重用,避免了再次緩慢的解析過程,從而大大提高了數據庫性能。數據字典緩衝區用來存儲最近用過的對象定義:有關表,索引,用戶和其它元數據定義的描述。把這些信息放進內存然後再不斷讀取要比經常從磁盤中讀取這些數據性能強多了。
    數據庫緩衝區是Oracle執行SQL的工作區域。用戶不必一直更新磁盤上的數據。Oracle將數據複製到內存中的數據庫緩衝區並在那裏更新。理想情況下,所有要經常存取的數據都將在數據庫緩衝區裏以達到減少磁盤I/O提高性能的作用。
   日誌緩衝區是一個非常小的內存塊,用來快速存儲數據庫緩衝區中數據變化信息。在第九章將詳細講解SQL撤銷和操縱數據中日誌緩衝區和數據庫緩衝區的用處。
    大池是一個可有可無的內存區,如有大池可被一些進程自動使用,否則那些進程會自動使用共享池中的內存來代替大池的作用。在第十三章討論共享服務器(或多線程服務器)將介紹大池的主要用途。在接下來的章節裏介紹恢復管理器(Recovery Manager)和RMAN也將介紹大池的用處。
    java池僅當在數據庫中有java存儲過程需要處理時纔要求用到,然而現在Oracle的很多部分也是有java寫成的,所以java池在現在以成爲被考慮的標準了。
    流池被Oracle流所用。
小貼士:SGA的大小對性能很重要。通常應該足夠大但是又不能太大。太大反而會降低性能!
    和SGA一樣,實例至少要有5個進程:系統監視進程(SMON),進程監視進程(PMON),數據庫寫入進程(DBWn)(該進程最多可有10個),日誌寫入進程(LGWR)和檢查點進程(CKPT)。這些就是大家所熟知的“後臺進程”,因爲無論是否有會話在實例或者甚至沒有連接該實例的數據庫被創建或者打開,只要實例在運行這些進程總是存在。
    SMON的主要作用是打開數據庫:使實例和數據庫能夠連接。第五章將詳細介紹這些。在日常運行中它肩負着大量的監控工作和整理工作。
    PMON監視用戶會話,當會話出現問題時進行適當的操作。例如在用戶已登錄數據庫但是電腦突然重新啓動,PMON會檢測到這個行爲並整理用戶剛纔的工作。
    DBWn(或多個該進程 默認一個實例每8個CPU有一個數據庫寫入器)負責將所有數據寫入數據文件。記住沒有一個會話直接在磁盤上更新數據;它們僅僅在數據庫緩衝區更新數據:所有更新的數據然後數據庫寫入進程負責再從數據庫緩衝區寫入磁盤。通常數據庫寫入進程會儘可能一點一點的緩慢寫入。Oracle認爲大量的磁盤I/O會降低性能,因此保持數據庫寫入進程以佔用最小的資源向磁盤寫入數據。
    LGWR將數據庫緩衝區內的所有數據變化記錄到磁盤的在線重做日誌文件,與DBWn相比,LGWR的寫入幾乎是在瞬時完成的--當提交一個事務時,它幾乎是實時完成的:迅速把高手日誌緩衝區中的變化寫入到磁盤的在線日誌文件中。LGWR確保將所有用戶的工作日誌實時保存到磁盤從而確保一旦數據文件遭到破壞時,這些改變能被重新用到恢復備份上。通過這種機制,Oracle能確保從來不會丟失任何數據。
    CKPT負責確保實例與數據庫的實時同步。原則上數據庫總是是過期的:數據庫的改變先是應用到內存中的緩衝區而並沒有實時地被DBWn寫入到磁盤中的數據文件中去(儘管這些改變被LGWR幾乎實時的寫入到在線日誌文件)。某些場合可能要求強制把內存中數據庫緩衝區的改變存儲到數據文件中而達到即時更新改變。CKPT者控制着這種行爲的發生頻率。
考試小貼士:記住5個必須的後臺進程:系統監視進程(SMON),進程監視進程(PMON),數據庫寫入進程(DBWn)和日誌寫入進程(LGWR)。
    當然除了必須的後臺進程外還有一些其它的可選進程(10g中比以前的版本中更多),這些在後面的章節中將會介紹。有些進程是可被調控的。比如你可以決定有多少個數據庫寫入進程運行,並可以控制將數據塊從數據塊緩衝區寫入到數據文件的頻率。
數據庫:物理結構
    Oracle數據庫由3種類型的文件組成,當然嚴格的說還存在一些其它可選的文件類型存在。必須的文件是控制文件,在線重做日誌文件,和數據文件。其它一些外部文件主要是初始化參數文件,密碼文件和歸檔重做日誌文件。
    每個數據庫都有一個控制文件,但是一個有良好習慣的DBA總是會創建許多控制文件的副本以便一個控制文件損壞,數據庫能倖免一難。如果所有的控制文件副本都丟失(儘管這種情況幾乎不會存在)的化,就要進行數據庫還原(recover)了,但是還是最好不讓自己陷入這種困境。我們不用擔心多個控制文件的同步問題,Oracle將會自己幫我們管理這些。控制文件雖小但是卻有着重要的作用。它包括數據庫中的一些指示器:在線重做日誌文件和數據文件的存儲位置。它也存儲一些保證數據庫完整性所必須的數據:各種臨界段標誌和時間週期標誌。比如當用到Recovery Manager,RMAN工具時,一些備份信息也會被存儲到控制文件中。控制文件大小通常也不過幾MB大小而已,但是它卻是必不可少的。控制文件是自動起作用的,你唯一能控制的是控制文件的副本個數以及副本所放置的地方。
    每個數據庫至少有2個在線重做日誌文件,但是同控制文件一樣一個良好的DBA會創建每個在線重做日誌文件的多個副本。在線重做日誌文件儲存着一系列按時間排序的有關應用到數據庫的變化信息。這裏是要求重建或者重做和改變所需的最基本的信息。重做日誌包括數組重做日誌文件,每個文件是一個成員。Oracle要求至少有2組且每組至少一個成員。考慮到性能原因可以創建多於2組並且爲安全起見每組都至少2個以上成員。之所以要求至少要有兩組在線重做日誌是因爲一個組可以接受當前的改變而另一組則一邊備份日誌(或者叫“歸檔”)。一個組是“當前”組:數據庫的改變通過LGWR寫入當前日誌文件組。衆所周之所有的用戶都在數據庫緩衝區更新數據並同時將改變信息傳送到重做日誌緩衝區。而LGWR不斷地將重做日誌緩衝區內的信息寫入到當前在線日誌組。重做日誌文件的大小是看固定的,因此最終由這些文件成員組成的當前組會滿的。而LGWR會執行一個叫做“日誌交換”的操作。這個操作使第二組成爲當前組並開始向其寫入日誌信息。如果你的數據庫經過適當的配置,就會歸檔(也就是備份)這些日誌文件成員組成第一組。當第二組滿了的時候LGWR就會交換回到第一組使其再次成爲當前組,然後覆蓋寫入日誌數據。這樣在線重做日誌組就能循環使用而不用擔心會滿。
    同控制文件一樣,如果每個日誌組有很多成員(應該這樣)並不需擔心如何保證它們的同步性,LGWR確保把所有都寫入進去,保證它們同步。假如丟失了一個組的一個成員,只要還存在其它成員,數據庫就仍能繼續運作。
    重做日誌文件組的大小和成員數量的設置很重要。通常要選擇一個適當的大小以分出來供重做日誌組使用。一個非常繁忙的數據庫比一個很大的靜態數據庫需要更多的重做日誌組成員。每個日誌組需要的成員數根據數據庫的容錯需要而定,然而在數據庫創建的時候並不需要考慮這些。我們可以隨時移走,增加或者刪除重做日誌文件,並且可以隨時創建一個不同大小的重做日誌文件。這些操作可以在線操作也就是並不需要關閉數據庫才能操作。因此它們對終端用戶是透明的。
    組成數據庫的第三種文件是數據文件。在創建數據庫的時候必須至少創建兩個數據文件,在10g以前的版本可以只創建一個數據文件,但是從10g就必須創建至少2個數據文件。當然可以需要自己的需要可以創建更多的數據文件。
    數據文件主要用來存儲數據庫的數據的。它們的大小和數量在理論上是沒有限制的。一個小型數據庫可能僅僅有幾GB大小,6個左右數據文件而每個數據文件也不過幾百MB大小。一個大的數據庫可能有數千個數據文件,大小受主機軟硬件的限制依實際情況而不同。
    數據文件是系統管理員可以看到的物理結構,邏輯上它們以段存儲程序員能看到的用戶數據,這些段組成數據字典。數據文件可以在任何時候被重命名,改變大小,移動,增加,或者刪除,但是要記住在一些數據文件的某些操作可能要求關閉數據庫才能進行。
邏輯結構:表空間和段
    組成數據庫的物理結構是可以被系統管理員看見的操作系統文件。而用戶看到的是邏輯結構比如表。Oracle用術語“段”描述任何包含數據的結構。一個典型的段是表包含數行數據,但是在Oracle中有很多類型的段,一些比較重要的段有表段,索引段,重做段,這些段在以後會詳細介紹。現在我們需要知道的是一個表包含很多行數據信息;索引機制可以快速的讓我們訪問到任何一個我們所關注的行;重做段是用來存儲那些可能需要被回滾的數據的數據結構。
    系統管理員看到的是物理結構而程序員看到的是邏輯結構。Oracle把物理存儲以表空間抽象出來成爲邏輯存儲結構。一個表空間是邏輯上一個或者多個段的集合,物理上是一個或者多個數據文件的集合。段和數據文件是多對多的關係:一個表可以被分成多個數據文件,而一個數據文件也可能包含多個表。通過在段和數據文件件引入表空間的概念,解決Oracle中這種物理和邏輯上多對多的關係。
    一些段必須在數據庫創建的時候就被創建:這些段組成數據字典。這些段存儲在兩個表空間中:SYSTEM和SYSAUX表空間。其中SYSAUX表空間是在10g版本中新增的:在以前的版本中所有的數據字典數據都在SYSTEM表空間。數據庫創建進程必須至少創建這兩個表空間併爲每個表空間至少創建一個數據文件從而存儲數據字典。
考試小貼士:在10g版本中創建數據庫時必須創建SYSAUX表空間,如果創建時沒有指定的話,數據庫創建進程會自動默認創建。
數據字典
    數據字典就是元數據:關於數據的數據。它從物理和邏輯上描述數據庫和數據庫中的內容。用戶定義,安全信息,完整性約束和性能監視信息(10g版本纔有)都是數據字典的一部分。它以多個段的集合的形式存儲在SYSTEM和SYSAUX表空間中。
    在很多方面,組成數據字典的段大多是表段和索引段。不同的是數據字典的表是在數據庫創建的時候產生的,用戶並不能直接訪問它們。但是一個好奇的數據庫管理員還是可以直接訪問它們的,如果隨便改變了這些表段的內容可能會破壞數據庫造成不可挽回的錯誤。創建一個數據字典是由數據庫創建進程來完成的。當用戶使用CREATE TABLE命令或者GRANT等SQL命令時實際是在向數據字典的表中插入數據行。
    爲了查詢數據字典,Oracle提供了一些視圖。這些視圖主要有三中形式,視圖名分別以DBA_,ALL_和USER_開頭,以USER_開頭的視圖主要描述當前用戶所擁有的對象,因此兩個不同的用戶查詢以USER_開頭的視圖一定是不同的結果。以ALL_開頭的視圖主要描述當前用戶連接的對象,這個對象可以屬於當前用戶也可以屬於其它用戶。以DBA_開頭的視圖包含描述數據庫中任何對象的信息。這些視圖由數據庫創建進程在數據庫創建階段連同一些PL/SQL包一起被創建的。這些PL/SQL包是供數據庫管理員管理數據庫和程序員開發應用程序用的,PL/SQL代碼也是存儲在數據字典中的。
考試小貼士:記住能讓你查看數據庫中所有表的信息的表是DBA_TABLES,而不是ALL_TABLES
管理工具
    Oracle Database 10g提供兩個管理環境:Enterprise Manager Database Control和Enterprise Manager Grid Control。這兩個管理工具雖然是可選擇的但是Oracle推薦使用它們,並不希望用戶使用第三方工具管理,其中Grid Control功能更復雜更強大,但是需要額外付費購買。
外部文件
    下面主要討論在創建數據庫之前的三個外部文件:參數文件,密碼文件和歸檔日誌文件。
    參數文件詳細定義了一個實例。大家知道實例是由內存組織和進程組成。實例的一些特殊參數在參數文件中指定,比如各種內存組織應該多大,後臺進程應該如何運行。參數文件也指定某些限制比如限制可以有多少個用戶會話併發連接到實例。參數文件中的內容除了DB_NAME外其它都有默認值:DB_NAME指定實例要連接的數據庫的名字。除了這個其它都可以保持默認,但是這樣的實例並不會有什麼實際用途。許多參數是動態的意味着這些參數的值可以在實例運行和數據庫打開的情況下被改變,但是一些是在實例開始運行的時候被固定的。一個例外是所有的參數都可以在關閉數據庫和停止實例後進行修改,具體過程是關閉數據庫,停止實例,編輯參數文件,然後重新開始運行實例打開數據庫。唯一一個不能過後被修改的是DB_BLOCK_SIZE(數據塊大小)。在創建一個數據庫之前必須先創建一個參數文件並用這個參數文件在內存中構建一個實例。
小貼士:參數分爲“基本”和“高級”,我們只需設置一些基本參數(數量少點)即可,那些高級參數(太多了)留着默認值即可。
    有兩種參數文件:舊式的靜態參數文件(通常命名爲init/SID/.ora,/SID/是實例名)和自9i版本以來纔有的動態參數文件(命名爲spfileSID.ora)。靜態參數文件類似文本文件,可以用任何文本編輯器對其編輯(在Windows可用記事本在Unix可用vi)。靜態參數文件只在實例啓動的時候被讀取一次。動態參數文件是一個二進制文件,由Oracle本身維護和編輯,以命令的方式與用戶交互。
    密碼文件在Oracle中比較容易讓人引起混亂,在一些不理解的人看來當數據庫還沒有打開的時候或者是數據庫就根本沒有創建異或實例還沒有開始的時候是如何進行身份驗證的呢,在他們看來,身份驗證信息無非是存儲在數據字典中的數據行,可以通過查詢視圖DBA_USERS查詢到加密過的密碼。當創建一個用戶的時候無非就是向數據字典中的表插入一行數據。按照這樣的邏輯,如果在還沒有權限創建或者打開數據庫時Oracle無法從數據字典查詢身份信息也就無法驗證你的身份讓你連接數據庫。爲了解決這種問題,Oracle提供了兩種不是基於數據字典的身份驗證因此可以在數據庫沒有被打開甚至還沒有創建數據庫的情況下完成身份驗證。這兩種身份驗證方法分別是操作系統驗證和密碼文件驗證。
    操作系統驗證是指Oracle把對用戶的身份驗證任務交給主機操作系統來完成。在安裝的時候(不是創建數據庫的時候)就已經指定了一個能擁有Oracle的操作系統組的名字,在Unix中默認是dba,在Windows是ORA_DBA。如果你沒有以指定的組用戶登錄安裝Oracle的主機操作系統,將不能連接到實例,或者打開和創建數據庫。但是這種身份驗證方法不適用於遠程連接數據庫,因爲用於身份驗證的信息是在安裝Oracle的那臺主機上的系統文件。而密碼文件則可以用於遠程連接數據庫,在工作計算機上輸入用戶名和密碼連接遠程數據庫而遠程的計算機通過工作計算機上的密碼文件來確認你的身份信息。如果不需要遠程管理只要用操作系統驗證就行了,但是出於某些特殊用途,最好要有密碼文件。
    在後面的章節將介紹歸檔日誌文件。它們是在線重做日誌滿了以後的拷貝:當在線重做日誌被填滿時它們以歸檔日誌的形式被拷貝到其它地方存儲,這樣就可以提供一個完整的關於應用到數據庫的變化信息。然而歸檔日誌並不是Oracle強制要求的,而是出於商業需要避免丟失數據的一個措施。
創建數據庫
    創建數據庫的步驟:
1、創建一個參數文件和一個密碼文件。
2、用參數文件在內存中構建一個實例。
3、使用CREATE DATABASE命令創建一個數據庫,該命令將按默認創建一個數據庫:一個控制文件,兩個在線重做日誌文件,兩個分別用於SYSTEM和SYSAUX表空間的數據文件和一個數據字典。
4、運行SQL腳本產生數據字典視圖和一些應用PL/SQL包。
5、運行SQL腳本產生Enterprise Manager Database Control和一些其它數據要求的選項(如java)。
    在Windows系統有個額外的步驟因爲Oracle在Windows系統以服務的方式運行,要確保創建了這些服務。
考試小貼士:你可以僅用兩個單詞就創建一個數據庫,但是所有參數都是按默認的來創建。
    這些創建步驟可以通過一些交互式工具如SQL*Plus提示符或者圖形界面工具數據庫配置助手(DBCA)來完成。作爲選擇,你可以通過用腳本或者DBCA響應文件來自動化這個過程。無論在哪個平臺,創建數據庫最簡單的方法是是通過DBCA。你可以把運行DBCA作爲安裝的一部分,在創建的整個過程中都會有一些提示信息。它將首先創建一個參數文件和一個密碼文件併產生一個啓動實例的腳本,然後創建數據庫,產生數據字典,數據字典視圖和企業管理控制器。當然你也可以手工建立參數文件和密碼文件然後通過SQL*Plus會話完成剩下的工作。許多DBA都結合使用這兩種方法,他們用DBCA產生文件和腳本然後通過手工修改後再由SQL*Plus運行。
    DBCA是用java語言寫成的,因此可以跨平臺。唯一不同的是Windows系統你必須在你要運行DBCA的計算機前工作才行,而在Unix系統你可在任何你想創建數據庫的計算機上運行DBCA只要你有一個X-Window終端即可而無需坐在要運行DBCA的計算機前。在Unix系統可以設置環境變量DISPLAY告訴應用程序終端窗口的位置,例如:
export DISPLAY=10.10.1065:0.0
將指定X Window的IP地址是10.10.10.65而不管你實際運行DBCA是在哪個計算機。
練習3-1用DBCA創建一個數據庫
  在這個練習中首先用DBCA創建一個數據庫並查看和解釋它所產生的腳本。
  1、以Oracle擁有者的組成員用戶登錄操作系統。在Unix中默認組是dba,在Windows中默認組是ORA_DBA。
    2、配置軟件安裝的家目錄ORACLE_HOME,在Unix中運行命令:echo $ORACLE_HOME
       在Windows中在安裝時會自動寫入註冊表。
    3、配置包含Oracle目錄bin的搜索路徑。在Unix中用下面命令顯示搜索路徑:echo $PATH
       在Windows用命令:echo %PATH%
       在Unix系統需要一個額外的變量是DISPLAY。必須指定你工作的終端位置,可以用下面的命令查看:echo $DISPLAY
       如果你就在要安裝軟件的計算機上工作,那麼DISPLAY設置可能就是
       export DISPLAY=127.0.0.1:0.0
    4、運行DBCA。在Unix系統是文件dbca;在Windows系統是文件dbca.bat。它位於ORACLE_HOME/bin目錄也就是配置的搜索路徑。
    5、接下來的安裝就是按提示選擇並點下一步即可,安裝過程和其它軟件一樣,這裏省略部分內容。
數據庫創建腳本
    在數據庫創建的同時,看看DBCA產生的數據庫創建腳本。DBCA會告訴你這些腳本的位置--通常在安裝Oracle目錄下的admin/<dbname>/scripts目錄(dbname指的是你要創建的數據庫的名字)。init.ora文件的內容類似如下:
############################################################################
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
############################################################################
###########################################
# Cache and I/O
###########################################
db_block_size=8192
db_cache_size=25165824
db_file_multiblock_read_count=16
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# Database Identification
###########################################
db_domain=""
db_name=ocp10g
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=C:/oracle/admin/ocp10g/bdump
core_dump_dest=C:/oracle/admin/ocp10g/cdump
user_dump_dest=C:/oracle/admin/ocp10g/udump
###########################################
# File Configuration
###########################################
control_files=("C:/oracle/oradata/ocp10g/control01.ctl",
"C:/oracle/oradata/ocp10g/control02.ctl",
"C:/oracle/oradata/ocp10g/control03.ctl")
db_recovery_file_dest=C:/oracle/flash_recovery_area
db_recovery_file_dest_size=2147483648
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Miscellaneous
###########################################
compatible=10.1.0.2.0
###########################################
# Pools
###########################################
java_pool_size=0
large_pool_size=8388608
shared_pool_size=83886080
###########################################
# Processes and Sessions
###########################################
processes=150
###########################################
# Security and Auditing
###########################################
remote_login_passwordfile=EXCLUSIVE
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=25165824
sort_area_size=65536
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_tablespace=UNDOTBS1
    注意到這是個靜態參數文件,進程隨後會把它轉化成動態參數文件。這些參數被用來在實例中構建一個實例,兩個需要強調的變量是DB_BLOCK_SIZE和CONTROL_FILES。DB_BLOCK_SIZE決定數據庫緩衝區中緩衝塊的大小。當實例創建一個數據庫時這個大小也被用來格式化組成SYSTEM和SYSAUX表空間的數據文件。DB_BLOCK_SIZE的大小在創建數據庫後便不能再被改變。CONTROL_FILES指向允許實例發現的數據庫控制文件,也包括控制文件的所有副本。在我們的練習中控制文件不存在:這個參數便會告訴實例在哪創建控制文件。Some of the other parameters are self-explanatory, but
eventually you must refer to the Oracle Documentation Library (the volume you need
is titled “Reference”) and read up on all of them. All!
考試小帖士:數據塊大小參數值在數據庫創建後就再也不能改變了,而其它所有參數值都可以在數據庫創建後再修改!
    下面是ocp10g.bat文件中的內容(在Unix中可能是個shell腳本):
mkdir C:/oracle/admin/ocp10g/bdump
mkdir C:/oracle/admin/ocp10g/cdump
mkdir C:/oracle/admin/ocp10g/create
mkdir C:/oracle/admin/ocp10g/pfile
mkdir C:/oracle/admin/ocp10g/udump
mkdir C:/oracle/flash_recovery_area
mkdir C:/oracle/oradata/ocp10g
mkdir C:/oracle/product/10.1.0/Db_1/database
set ORACLE_SID=ocp10g
C:/oracle/product/10.1.0/Db_1/bin/oradim.exe -new -sid OCP10G
-startmode manual -spfile
C:/oracle/product/10.1.0/Db_1/bin/oradim.exe -edit -sid OCP10G
-startmode auto -srvcstart system
C:/oracle/product/10.1.0/Db_1/bin/sqlplus /nolog
@C:/oracle/admin/ocp10g/scripts/ocp10g.sql
    這個腳本創建一些目錄,設置ORACLE_SID環境變量然後用ORADIM.EXE(本例在Windows系統下)爲實例創建Windows服務並讓它自動運行。然後運行SQL*Plus執行名爲ocp10g.sql的腳本文件:
set verify off
PROMPT specify a password for sys as parameter 1;
DEFINE sysPassword = &1
PROMPT specify a password for system as parameter 2;
DEFINE systemPassword = &2
PROMPT specify a password for sysman as parameter 3;
DEFINE sysmanPassword = &3
PROMPT specify a password for dbsnmp as parameter 4;
DEFINE dbsnmpPassword = &4
host C:/oracle/product/10.1.0/Db_1/bin/orapwd.exe
file=C:/oracle/product/10.1.0/Db_1/database/PWDocp10g.ora
password=&&sysPassword force=y
@C:/oracle/admin/ocp10g/scripts/CreateDB.sql
@C:/oracle/admin/ocp10g/scripts/CreateDBFiles.sql
@C:/oracle/admin/ocp10g/scripts/CreateDBCatalog.sql
@C:/oracle/admin/ocp10g/scripts/emRepository.sql
@C:/oracle/admin/ocp10g/scripts/postDBCreation.sql
    這個腳本提示一些在運行DBCA就已經提供的密碼,然後調用ORAPWD.EXE(在Unix中爲orapwd)創建一個外部密碼文件。然後調用執行另外5個SQL腳本。第一個腳本是CreateDB.sql:
connect SYS/&&sysPassword as SYSDBA
set echo on
spool C:/oracle/product/10.1.0/Db_1/assistants/dbca/logs/CreateDB.log
startup nomount pfile="C:/oracle/admin/ocp10g/scripts/init.ora";
CREATE DATABASE "ocp10g"
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE 'C:/oracle/oradata/ocp10g/system01.dbf' SIZE 300M
REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE 'C:/oracle/oradata/ocp10g/sysaux01.dbf' SIZE 120M REUSE
AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE
'C:/oracle/oradata/ocp10g/temp01.dbf' SIZE 20M REUSE AUTOEXTEND ON
NEXT 640K MAXSIZE UNLIMITED
UNDO TABLESPACE "UNDOTBS1" DATAFILE 'C:/oracle/oradata/ocp10g/undotbs01.dbf'
SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K MAXSIZE UNLIMITED
CHARACTER SET WE8MSWIN1252
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('C:/oracle/oradata/ocp10g/redo01.log') SIZE 10240K,
GROUP 2 ('C:/oracle/oradata/ocp10g/redo02.log') SIZE 10240K,
GROUP 3 ('C:/oracle/oradata/ocp10g/redo03.log') SIZE 10240K
USER SYS IDENTIFIED BY "&&sysPassword" USER SYSTEM IDENTIFIED BY
"&&systemPassword";
spool off
    這個腳本連接到實例,用語法通過密碼文件進行身份驗證。然後通過STARTUP NOMOUNT命令在內存中用之前提到的靜態參數文件構建一個實例。有關NOMOUNT的重要性將在第5章中詳細說明,現在只要知道必須這樣就行了因爲現在並沒有數據庫可以裝載並打開。然後從CREATE DATABASE命令一直到文件結束是創建數據庫。第一部分設置一些有管數據庫的全侷限制,不過這些設置過後都可以被修改的。接着是有關兩個數據文件的詳細設置:這些文件將被用於SYSTEM和SYSAUX表空間。接下來是指定TEMPORARY表空間和UNDO表空間(更多細節在16章中講述)。然後指定字符集。直到9i版本,以前一旦字符集在創建的時候指定後就不能在修改了,而從9i版本以後這個設置就可以在以後需要修改的時候修改了。但是修改的過程還是比較麻煩的,因此建議創建的時候最好正確指定字符集。最後是定義三個在線日誌文件組,每個組有一個成員,然後初始化數據庫用戶SYS和SYSTEM的密碼。
    這一個文件就會創建一個數據庫。當它成功執行完畢後將在內存中運行一個實例和一個由控制文件及其副本(通過參數CONTROL_FILES指定),數據文件和重做日誌文件(CREATE DATABASE命令指定)組成的數據庫。同時產生一個數據字典。儘管數據庫已經被創建但是目前仍是不可用的,下面ocp10g.sql腳本調用的幾個腳本將使數據庫可用:
CreateDBfiles.sql創建另外一個表空間作爲用戶數據的默認儲存位置。
CreateDBcatalog.sql產生數據字典視圖和一些PL/SQL包。
emRepository.sql產生企業管理控制器工具
postDBcreation.sql作一些掃尾工作。
    以上所有過程都是由DBCA完成,作爲測試,可以在Windows系統下的命令提示符中設置ORACLE_SID環境變量並登錄新數據庫:
C:/>
C:/>set ORACLE_SID=ocp10g
C:/>sqlplus sys/oracle as sysdba
SQL*Plus: Release 10.1.0.2.0 - Production on Sun Jul 25 12:34:14 2004
Copyright (c) 1982, 2004, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> select name,open_mode from v$database;
NAME OPEN_MODE
--------- ----------
OCP10G READ WRITE
SQL>
DBCA附加功能
    在運行DBCA的界面中有下面4個選項:
    創建一個數據庫。
    配置數據庫選項。
    刪除一個數據庫。
    管理模板。
    配置數據庫選項可以幫助修改一個已存在數據庫的各種參數。
    如果以後要安裝一些附加功能,比如Java或者OLAP,只需重新運行DBCA就可輕鬆實現,當然也可通過手工運行腳本來實現,但是這樣難免會因粗心出現一些小錯誤,所以使用DBCA更方便。
    通過刪除一個數據庫的選項將會提示你選擇向要刪除的數據庫然後會通過一些步驟刪除所有組成數據庫的文件並且在Windows系統還會調用ORADIM.EXE刪除系統服務。
    最後管理模板爲以後重新創建類似的數據庫提供了方便。通過模板儲存了創建一個數據所需的各種參數設置,爲方便以後創建數據庫,用戶可以創建多個數據庫模板,這樣的需要創建這些類似參數數據庫時就可以直接利用模板進行創建了,到時便可以爲用戶省下不少功夫。
章節回顧
章節開始詳細介紹Oracle服務體系結構。對此有個深刻的理解對以後繼續學習用處很大,必須熟悉這些有關實例和數據庫的基本原理:內存結構,進程和文件類型。然後對數據字典的用處和內容有個大致的瞭解並對錶空間內的段的邏輯結構作了簡單的討論。最後用DBCA創建數據庫並熟悉各種腳本和命令的作用。
習題
    1、下面哪個內存結構是SGA中所必須有的(3個答案)?
    A、數據庫緩衝區
    B、Java池
    C、大池
    D、重做日誌緩衝區
    E、共享池
    F、流池
    2、創建一個數據庫,把下面步驟按正確順序排列:
    A、建立數據字典
    B、創建一個參數文件
    C、創建數據字典視圖
    D、使用CREATE DATABASE命令
    E、使用STARTUP NOMOUNT命令
    3、如果在用CREATE DATABASE命令創建數據庫時沒有指定SYSAUX數據文件,將會如何(選擇最佳)?
    A、因爲SYSAUX是必須的表空間所以這個命令會失敗
    B、這個命令會成功執行但是必須在創建完數據庫後增加一個SYSAUX表空間
    C、這個命令會成功執行並創建一個默認SYSAUX表空間
    D、這個命令會成功執行但是數據字典將會在SYSTEM表空間
    4、下面哪個在數據庫創建後就再也不能被改變了(選擇最佳)?
    A、數據塊大小
    B、數據庫字符集
    C、數據庫名字
    D、以上都不對,所有值都可以在創建後修改
    5、創建數據庫時下面哪個是必須的(選擇最佳)?
    A、操作系統的root密碼(Unix或Linux系統)或Administrator密碼(Windows系統)
    B、運行DBCA的權限
    C、至少要有滿足SGA需要的足夠的物理內存大小
    D、以上都不對
    6、你在Unix或者Linux系統中運行DBCA,沒有任何反應,可能是什麼原因(選擇最佳)?
  A、你不是dba組的成員
    B、你的DISPLAY變量設置的不是你當前的終端。
    C、你沒有設置DISPLAY變量
    D、你沒有設置ORACLE_SID變量
    7、下面哪些文件是可選的(3個答案)?
    A、在線重做日誌文件
    B、參數文件
    C、密碼文件
    D、SYSTEM表空間數據文件
    E、SYSAUX表空間數據文件
    F、UNDO表空間數據文件
    8、如果在用CREATE DATABASE命令創建數據庫的時候沒有指定一個UNDO表空間,將會怎樣(選擇最佳)?
    A、因爲UNDO表空間是必須的所以這個命令將會失敗
    B、這個命令會成功執行並創建一個默認UNDO表空間
    C、這個命令會成功執行但是你必須在過後創建一個UNDO表空間
    D、這個命令會成功執行,你可以在過後建立一個UNDO表空間
    9、你已經建立一個數據庫但是卻無法用Database Control連接到這個數據庫,可能是什麼原因(選擇最佳)?
    A、你沒有通過操作系統或者密碼文件的身份驗證
    B、你沒有運行創建Database Control的腳本
    C、Grid Control是運行Database Control的前提條件
    D、你沒有被授權使用Database Control
    10、數據字典是在什麼時候建立的(選擇最佳)?
    A、當你創建數據庫的時候
    B、當你通過CreateDBcatalog.sql腳本調用運行腳本catalog.sql和catproc.sql的時候
    C、當SYSTEM和SYSAUX表空間創建的時候
    D、不需要創建,它總是實例的一部分
       11、下列哪些進程是可選的(3個答案)?
    A、歸檔進程
    B、檢查點進程
    C、數據庫監聽進程
    D、Grid Control Management 代理進程
    E、日誌寫入進程
    F、進程監視進程
    12、你創建一個數據庫有兩組在線重做日誌組且每組都有一個成員,你必須如何作才能提供容錯性(選擇最佳)?
    A、增加存在的這兩組的兩組鏡像
    B、每組增加一個成員
    C、無需作任何事,這些已經在創建的時候固定下來了
    D、無需作任何事情,第二組已經是第一組的鏡像了
    13、哪個數據字典視圖可以讓你查看到數據庫中所有的表(選擇最佳)?
    A、ALL_TABLES
    B、DAB_TABLES
    C、USER_TABLES
    D、以上都不對,要查看所有的表必須直接查詢數據字典
    14、下面哪個不是存儲在數據字典中的(選擇最佳)?
    A、用戶定義信息
    B、提供的PL/SQL包
    C、數據字典視圖
    D、以上都是存儲在數據字典中
    15、你在運行DBCA的時候沒有選擇Oracle Java虛擬機,但是過後又想安裝它的時候該怎麼辦(選擇最佳)?
    A、在數據庫中創建Java池
    B、運行腳本創建JVM
    C、刪除數據庫,重新創建數據庫的時候選擇JVM
    D、運行JVM後臺進程
答案
1、ADF
2、BEDAC
3、C
4、A
5、D
6、B
7、BCF
8、D
9、B
10、A
11、ACD
12、B
13、B
14、D
15、B

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