vista

          回顧※展望                     潛心技術(shù)&&不再擱淺

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            12 Posts :: 1 Stories :: 13 Comments :: 0 Trackbacks

          主  題:

          ?

          ORACLE 體系結(jié)構(gòu) (Architecture of ORACLE)

          作  者:

          ?

          penitent (只取一瓢)

          等  級:

          ?

          值:

          ?

          100

          所屬論壇:

          ?

          Oracle 高級技術(shù)

          問題點數(shù):

          ?

          0

          回復(fù)次數(shù):

          ?

          12

          發(fā)表時間:

          ?

          2003-03-31 21:32:

          ??? 很多人和我一樣,大楷都是從 SQL Server 轉(zhuǎn)過來的,可能是受 MS 的影響太深,老想著用 SQL Server 的方法來解決 ORACLE 的問題,這就是一個極大的失誤,比如有人就老喜歡用那個 OEM ,那個我一直認為是 ORACLE 的糟粕的一個代表, ORACLE 的精髓是代碼的管理,任何管理、備份、恢復(fù)都可以通過代碼或腳本實現(xiàn)。比如還有的人就喜歡 SQL Server 過程中能直接寫 select 語句,認為 ORACLE 必須要能做,有人認為 SQL SERVER 的過程能執(zhí)行 DDL 語句,那 ORACLE 也必須要這樣……誠然,我不是承認不可以,但是很多的很多的這一切,就是你實現(xiàn)了,卻是 ORACLE 強烈反對的,因為它們對 ORACLE 的性能可能有很大的影響。

          ??? 我想,要學(xué)好 ORACLE ,就必須腳踏實地,一步一步來,你可以拿兩個數(shù)據(jù)庫來比較,但是不要想著關(guān)系型數(shù)據(jù)庫都是一樣的,它們是有差別的,或多或少,一個簡單的例子,在 SQL Server 中,一個表的修改是以頁面級來鎖定的,對表的修改是阻塞讀操作的(如 Select ),所以 SQL Server 的鎖是非常昂貴的,如果不是特別指定,一個語句就是一個事務(wù)。在 ORACLE 中,這一切都變了, ORACLE 可以提供最小的行級鎖,所有對表的鎖定不影響 Select 查詢,在 ORACLE 中,鎖的資源占用是非常小的,所以 ORACLE 默認開啟事務(wù),直到你提交或回滾。

          ??? 我學(xué) ORACLE 也就兩年時間,到現(xiàn)在專職做 ORACLE 管理和 ORACLE 數(shù)據(jù)倉庫,也是自己慢慢走過來的,我其實也沒有得到高人指點,就是自己慢慢啃書,慢慢查資料。論壇可以用來交流,但是想讓它讓你有很大進步,可能性不大,畢竟,論壇上面系統(tǒng)性的東西太少。要想做一個好的 DBA ,是不容易的,有人總結(jié)了 DBA 10 點該做的和不該做的。

          > #1 - Do Maintain your Expertise

          > #2 - Do Use the DBMS_STATS Package to Collect Statistics

          > #3 - Do Use Bind Variables

          > #4 - Do Put your Production Database in ARCHIVELOG Mode

          > #5 - Do Use Locally Managed Tablespaces

          > #6 - Do Monitor Your Database

          > #7 - Do Practice Recoveries

          > #8 - Do Get Involved with User Groups and Other Resources

          > #9 - Do Establish Standards and Change Control Processes

          > #10 - Do Think Ahead

          ?

          > Oracle Database Top 10 Don'ts

          > #1 - Don't Waste Time Re-Organizing Your Databases

          > #2 - Don't Use .Log or Other Common Extensions For Your Database File Names

          > #3 - Don't Leave Your Database Open To Attack

          > #4 - Don't Decide Against Hot Backups

          > #5 - Don't Use ASSM

          > #6 - Don't Forget the 80/20 Rule

          > #7 - Don't Stack Views

          > #8 - Don't Be a Normalization Bigot

          > #9 - Don't Forget to Document Everything

          > #10 - Do Not Use Products You are Not Licensed For.

          ???? CSDN 上的專職從事數(shù)據(jù)庫管理的可能很少,也就導(dǎo)致了這里很多人的問題都是在開發(fā)上面,當(dāng)然,我不是要求大家學(xué)管理,就是開發(fā),也需要對數(shù)據(jù)庫理解,半懂不懂的搞開發(fā),最可能的后果,可能就是項目的失敗,而這是一個程序員的恥辱。

          ???? 正因為 CSDN 的這種特殊情況,很多高手都不愿意來這里,我問其原因,回答很簡單, CSDN 只能讓我退步,我去干什么,大家也都清楚,現(xiàn)在是一個信息化的時代,不是不進則退了,是進步慢也是退步的時代了。

          ???? 今天就寫這么多,下面開始轉(zhuǎn)入正文,因為時間倉促,多少可能有些筆誤或錯誤,也就希望大家指正,在以后的時間里,我會定期的寫這么一些文章,希望大家有所收獲,我的下一篇文章計劃是“ ORACLE 的備份策應(yīng)”。

          ????? 此文不經(jīng)許可,不可轉(zhuǎn)載,如有必要,也需要注明出處!

          -------------------------------------------------------------------------

          ?

          ????????????????????????????????? 概要

          在本章里你可以了解以下內(nèi)容

          • ORACLE 實例——包括內(nèi)存結(jié)構(gòu)與后臺進程
          • ?ORACLE 數(shù)據(jù)庫——物理操作系統(tǒng)文件的集合
          • 了解內(nèi)存結(jié)構(gòu)的組成
          • 了解后臺進程的作用
          • 了解數(shù)據(jù)庫的物理文件
          • ?解釋各種邏輯結(jié)構(gòu)

          ?

          ?


          一、 ORACLE 事例

          1 ORACLE 實例

          System Global Area(SGA) Background Process 被成為數(shù)據(jù)庫的實例。

          2 ORACLE 數(shù)據(jù)庫

          一系列物理文件的集合(數(shù)據(jù)文件,控制文件,聯(lián)機日志,參數(shù)文件等)

          3 、系統(tǒng)全局共享區(qū) System Global Area(SGA)

          System Global Area 是一塊巨大的共享內(nèi)存區(qū)域,他被看做是 Oracle 數(shù)據(jù)庫的一個大緩沖池,這里的數(shù)據(jù)可以被 ORACLE 的各個進程共用。其大小可以通過如下語句查看:

          SQL> select * from v$sga;

          NAME VALUE

          -------------------- ---------

          Fixed Size 39816

          Variable Size 259812784

          Database Buffers 1.049E+09

          Redo Buffers 327680

          更詳細的信息可以參考 V$sgastat V$buffer_pool

          主要包括以下幾個部分:

          a 共享池 (Shared pool)

          共享池是 SGA 中最關(guān)鍵的內(nèi)存片段,特別是在性能和可伸縮性上。一個太小的共享池會扼殺性能,使系統(tǒng)停止,太大的共享池也會有同樣的效果,將會消耗大量的 CPU 來管理這個共享池。不正確的使用共享池只會帶來災(zāi)難。共享池主要又可以分為以下兩個部分:

          · SQL 語句緩沖 (Library Cache)

          當(dāng)一個用戶提交一個 SQL 語句, Oracle 會將這句 SQL 進行分析 (parse) ,這個過程類似于編譯,會耗費相對較多的時間。在分析完這個 SQL Oracle 會把他的分析結(jié)果給保存在 Shared pool Library Cache 中,當(dāng)數(shù)據(jù)庫第二次執(zhí)行該 SQL 時, Oracle 自動跳過這個分析過程,從而減少了系統(tǒng)運行的時間。這也是為什么第一次運行的 SQL 比第二次運行的 SQL 要慢一點的原因。

          下面舉例說明 parse 的時間

          SQL> select count(*) fromscpass ;

          COUNT(*)

          ----------

          243

          Elapsed: 00:00:00.08

          這是在 Share_pool Data buffer 都沒有數(shù)據(jù)緩

          沖區(qū)的情況下所用的時間

          SQL> alter system flush SHARED_POOL;

          System altered.

          清空 Share_pool ,保留 Data buffer

          SQL> select count(*) from scpass ;

          COUNT(*)

          ----------

          243

          Elapsed: 00:00:00.02

          SQL> select count(*) from scpass ;

          COUNT(*)

          ----------

          243

          Elapsed: 00:00:00.00

          從兩句 SQL 的時間差上可以看出該 SQL Parse 時間約為 00:00:00.02

          對于保存在共享池中的 SQL 語句,可以從 V$Sqltext v$Sqlarea 中查詢到,對于編程者來說,要盡量提高語句的重用率,減少語句的分析時間。一個設(shè)計的差的應(yīng)用程序可以毀掉整個數(shù)據(jù)庫的 Share pool ,提高 SQL 語句的重用率必須先養(yǎng)成良好的變成習(xí)慣,盡量使用 Bind 變量。

          ·數(shù)據(jù)字典緩沖區(qū) (Data Dictionary Cache)

          顯而易見,數(shù)據(jù)字典緩沖區(qū)是 ORACLE 特地為數(shù)據(jù)字典準備的一塊緩沖池,供 ORACLE 內(nèi)部使用,沒有什么可以說的。

          b 塊緩沖區(qū)高速緩存 (Database Buffer Cache)

          這些緩沖是對應(yīng)所有數(shù)據(jù)文件中的一些被使用到的數(shù)據(jù)塊。讓他們能夠在內(nèi)存中進行操作。在這個級別里沒有系統(tǒng)文件 , ,戶數(shù)據(jù)文件,臨時數(shù)據(jù)文件,回滾段文件之分。也就是任何文件的數(shù)據(jù)塊都有可能被緩沖。數(shù)據(jù)庫的任何修改都在該緩沖里完成,并由 DBWR 進程將修改后的數(shù)據(jù)寫入磁盤。

          這個緩沖區(qū)的塊基本上在兩個不同的列表中管理。一個是塊的“臟”表 (Dirty List) ,需要用數(shù)據(jù)庫塊的書寫器 (DBWR) 來寫入,另外一個是不臟的塊的列表 (Free List) ,一般的情況下,是使用最近最少使用 (Least Recently Used,LRU) 算法來管理。

          塊緩沖區(qū)高速緩存又可以細分為以下三個部分( Default pool,Keep pool,Recycle pool )。如果不是人為設(shè)置初始化參數(shù) (Init.ora) ORACLE 將默認為 Default pool

          由于操作系統(tǒng)尋址能力的限制,不通過特殊設(shè)置,在 32 位的系統(tǒng)上,塊緩沖區(qū)高速緩存最大可以達到 1.7G ,在 64 位系統(tǒng)上,塊緩沖區(qū)高速緩存最大可以達到 10G

          c 重做日志緩沖區(qū) (Redo log buffer)

          重做日志文件的緩沖區(qū),對數(shù)據(jù)庫的任何修改都按順序被記錄在該緩沖,然后由 LGWR 進程將它寫入磁盤。這些修改信息可能是 DML 語句,如 (Insert,Update,Delete) ,或 DDL 語句,如 (Create,Alter,Drop )

          重做日志緩沖區(qū)的存在是因為內(nèi)存到內(nèi)存的操作比較內(nèi)存到硬盤的速度快很多,所以重作日志緩沖區(qū)可以加快數(shù)據(jù)庫的操作速度,但是考慮的數(shù)據(jù)庫的一致性與可恢復(fù)性,數(shù)據(jù)在重做日志緩沖區(qū)中的滯留時間不會很長。所以重作日志緩沖區(qū)一般都很小,大于 3M 之后的重作日志緩沖區(qū)已經(jīng)沒有太大的實際意義。

          d Java 程序緩沖區(qū) (Java Pool)

          Java 的程序區(qū), Oracle 8I 以后, Oracle 在內(nèi)核中加入了對 Java 的支持。該程序緩沖區(qū)就是為 Java 程序保留的。如果不用 Java 程序沒有必要改變該緩沖區(qū)的默認大小。

          e 大池 (Large Pool)

          大池的得名不是因為大,而是因為它用來分配大塊的內(nèi)存,處理比共享池更大的內(nèi)存,在 8.0 開始引入。

          下面對象使用大池:

          · MTS ——在 SGA Large Pool 中分配 UGA

          ·語句的并行查詢 (Parallel Executeion of Statements) ——允許進程間消息緩沖區(qū)的分配,用來協(xié)調(diào)并行查詢服務(wù)器

          ·備份 (Backup) ——用于 RMAN 磁盤 I/O 緩存

          4 后臺進程 (Background process)

          后臺進程是 Oracle 的程序,用來管理數(shù)據(jù)庫的讀寫,恢復(fù)和監(jiān)視等工作。 Server Process 主要是通過他和 user process 進行聯(lián)系和溝通,并由他和 user process 進行數(shù)據(jù)的交換。在 Unix 機器上, Oracle 后臺進程相對于操作系統(tǒng)進程,也就是說,一個 Oracle 后臺進程將啟動一個操作系統(tǒng)進程;在 Windows 機器上, Oracle 后臺進程相對于操作系統(tǒng)線程,打開任務(wù)管理器,我們只能看到一個 ORACLE.EXE 的進程,但是通過另外的工具,就可以看到包含在這里進程中的線程。

          Unix 上可以通過如下方法查看后臺進程:

          ps –ef | grep ora_

          # ps -ef | grep ora_ | grep XCLUAT

          oracle 29431 1 0 Sep 02 ? 2:02 ora_dbwr_SID

          oracle 29444 1 0 Sep 02 ? 0:03 ora_ckpt_SID

          oracle 29448 1 0 Sep 02 ? 2:42 ora_smon_SID

          oracle 29442 1 0 Sep 02 ? 3:25 ora_lgwr_SID

          oracle 29427 1 0 Sep 02 ? 0:01 ora_pmon_SID

          a Oracle 系統(tǒng)有 5 個基本進程他們是

          • DBWR( 數(shù)據(jù)文件寫入進程 )
          • LGWR( 日志文件寫入進程 )
          • SMON( 系統(tǒng)監(jiān)護進程 )
          • PMON( 用戶進程監(jiān)護進程 )
          • CKPT( 檢查點進程 , 同步數(shù)據(jù)文件 , 日志文件 , 控制文件 )

          b DBWR

          將修改過的數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)寫入對應(yīng)數(shù)據(jù)文件

          維護系統(tǒng)內(nèi)的空緩沖區(qū)

          這里指出幾個容易錯誤的概念 :

          ·當(dāng)一個更新提交后 ,DBWR 把數(shù)據(jù)寫到磁盤并返回給用戶提交完成 .

          · DBWR 會觸發(fā) CKPT 后臺進程

          · DBWR 不會觸發(fā) LGWR 進程

          上面的概念都是錯誤的 .

          DBWR 是一個很底層的工作進程,他批量的把緩沖區(qū)的數(shù)據(jù)寫入磁盤。和任何前臺用戶的進程幾乎沒有什么關(guān)系,也不受他們的控制。至于 DBWR 會不會觸發(fā) LGWR CKPT 進程,我們將在下面幾節(jié)里討論。

          DBWR 工作的主要條件如下

          · DBWR 超時

          ·系統(tǒng)中沒有多的空緩沖區(qū)用來存放數(shù)據(jù)

          · CKPT 進程觸發(fā) DBWR

          c LGWR

          將重做日志緩沖區(qū)的數(shù)據(jù)寫入重做日志文件, LGWR 是一個必須和前臺用戶進程通信的進程。當(dāng)數(shù)據(jù)被修改的時候,系統(tǒng)會產(chǎn)生一個重做日志并記錄在重做日志緩沖區(qū)內(nèi)。這個重做日志可以類似的認為是以下的一個結(jié)構(gòu) :

          SCN=000000001000

          數(shù)據(jù)塊 ID

          對象 ID=0801

          數(shù)據(jù)行 =02

          修改后的數(shù)據(jù) =0011

          提交的時候, LGWR 必須將被修改的數(shù)據(jù)的重做日志緩沖區(qū)內(nèi)數(shù)據(jù)寫入日志數(shù)據(jù)文件,然后再通知前臺進程提交成功,并由前臺進程通知用戶。從這點可以看出 LGWR 承擔(dān)了維護系統(tǒng)數(shù)據(jù)完整性的任務(wù)。

          LGWR 工作的主要條件如下

          ·用戶提交

          ·有 1/3 重做日志緩沖區(qū)未被寫入磁盤

          ·有大于 1M 重做日志緩沖區(qū)未被寫入磁盤

          ·超時

          · DBWR 需要寫入的數(shù)據(jù)的 SCN 號大于 LGWR 記錄的 SCN 號, DBWR 觸發(fā) LGWR 寫入

          d SMON

          工作主要包含

          ?? ·清除臨時空間

          ?? ·在系統(tǒng)啟動時,完成系統(tǒng)實例恢復(fù)

          ?? ·聚結(jié)空閑空間

          ?? ·從不可用的文件中恢復(fù)事務(wù)的活動

          ?? · OPS 中失敗節(jié)點的實例恢復(fù)

          ?? ·清除 OBJ$

          ?? ·縮減回滾段

          ?? ·使回滾段脫機

          e PMON

          主要用于清除失效的用戶進程,釋放用戶進程所用的資源。如 PMON 將回滾未提交的工作,釋放鎖,釋放分配給失敗進程的 SGA 資源。

          f CKPT

          同步數(shù)據(jù)文件,日志文件和控制文件,由于 DBWR/LGWR 的工作原理,造成了數(shù)據(jù)文件,日志文件,控制文件的不一至,這就需要 CKPT 進程來同步。 CKPT 會更新數(shù)據(jù)文件 / 控制文件的頭信息。

          CKPT 工作的主要條件如下

          ·在日志切換的時候

          ·數(shù)據(jù)庫用 immediate ,transaction , normal 選項 shutdown 數(shù)據(jù)庫的時候

          ·根據(jù)初始話文件 LOG_CHECKPOINT_INTERVAL LOG_CHECKPOINT_TIMEOUT FAST_START_IO_TARGET 的設(shè)置的數(shù)值來確定

          ·用戶觸發(fā)

          以下進程的啟動需要手工配置

          g ARCH

          當(dāng)數(shù)據(jù)庫以歸檔方式運行的時候, Oracle 會啟動 ARCH 進程,當(dāng)重做日志文件被寫滿時,日志文件進行切換,舊的重做日志文件就被 ARCH 進程復(fù)制到一個 / 多個特定的目錄 / 遠程機器。這些被復(fù)制的重做日志文件被叫做歸檔日志文件。

          h RECO

          負責(zé)解決分布事物中的故障。 Oracle 可以連接遠程的多個數(shù)據(jù)庫,當(dāng)由于網(wǎng)絡(luò)問題,有些事物處于懸而未決的狀態(tài)。 RECO 進程試圖建立與遠程服務(wù)器的通信,當(dāng)故障消除后, RECO 進程自動解決所有懸而未決的會話。

          i 、服務(wù)進程 Server Process

          服務(wù)進程的分類

          ·專用服務(wù)進程 (Dedicated Server Process)

          一個服務(wù)進程對應(yīng)一個用戶進程

          ·共享服務(wù)進程 (MultiTreaded Server Process)

          一個服務(wù)進程對應(yīng)多個用戶進程,輪流為用戶進程服務(wù)。

          PGA & UGA

          PGA = Process Global Area

          UGA = User Global Area

          他保存了用戶的變量、權(quán)限、堆棧、排序空間等用戶信息,對于專用服務(wù)器進程, UGA PGA 中分配。對于多線程進程, UGA Large pool 中分配。

          j 、用戶進程 User Process

          在客戶端,將用戶的 SQL 語句傳遞給服務(wù)進程

          5 、一個貫穿數(shù)據(jù)庫全局的概念 ---- 系統(tǒng)改變號 SCN(System Change Number)

          系統(tǒng)改變號,一個由系統(tǒng)內(nèi)部維護的序列號。當(dāng)系統(tǒng)需要更新的時候自動增加,他是系統(tǒng)中維持數(shù)據(jù)的一致性和順序恢復(fù)的重要標志。

          a. 查詢語句不會使 SCN 增加,就算是同時發(fā)生的更新,數(shù)據(jù)庫內(nèi)部對應(yīng)的 SCN 也是不同的。這樣一來就保證了數(shù)據(jù)恢復(fù)時候的順序。

          b. 維持數(shù)據(jù)的一致性,當(dāng)一個查詢執(zhí)行的時候,他會先從系統(tǒng)中得到一個當(dāng)前的 SCN 號,在他查找數(shù)據(jù)的同時,他會檢查每個數(shù)據(jù)行和他對應(yīng)的 SCN 號,只有那些不比他的 SCN 號大的行才能從對應(yīng)用戶數(shù)據(jù)文件的緩沖區(qū)內(nèi)取出,而那些大于他 SCN 號的行,就應(yīng)該從回滾段數(shù)據(jù)文件的緩沖中取出。

          實例分析 :

          一個查詢返回以下 5

          ID Name

          ------------------------

          1 ShangHai

          2 Beijing

          3 Gugangzhou

          4 ShenZhen

          5 HanZhou

          用戶 A 12:00 開始運行,到 12:05 結(jié)束在 12:01 用戶 B 執(zhí)行了一條 Update 語句,更新了 ID 2 的那條記錄把 Beijing 該成了 Tianjing. 并提交,這時候用戶 A 的那個查詢是不會出現(xiàn) Tianjing 的記錄。 12:00 查詢時候的 SCN N 然后用戶 B 的更新使得系統(tǒng)的 SCN 變成 N+1 當(dāng)用戶 A 查詢到 ID=2 的記錄的時候發(fā)現(xiàn)他的 SCN 已經(jīng)大于查詢開始時候的 SCN ,他就會在回滾段數(shù)據(jù)緩沖中找到 SCN=N 的那條記錄,并把它返回。


          二、 ORACLE 數(shù)據(jù)庫

          ORACLE 數(shù)據(jù)庫的組成——物理操作系統(tǒng)文件的集合。主要包括以下幾種。

          1 、控制文件(參數(shù)文件 init.ora 記錄了控制文件的位置)

          控制文件包括如下主要信息

          ·數(shù)據(jù)庫的名字,檢查點信息,數(shù)據(jù)庫創(chuàng)建的時間戳

          ·所有的數(shù)據(jù)文件,聯(lián)機日志文件,歸檔日志文件信息

          ·備份信息等

          有了這些信息, Oracle 就知道那些文件是數(shù)據(jù)文件,現(xiàn)在的重做日志文件是哪些,這些都是系統(tǒng)啟動和運行的基本條件,所以他是 Oracle 運行的根本。如果沒有控制文件系統(tǒng)是不可能啟動的。控制文件是非常重要的,一般采用多個鏡相復(fù)制來保護控制文件,或采用 RAID 來保護控制文件。控制文件的丟失,將使數(shù)據(jù)庫的恢復(fù)變的很復(fù)雜。

          控制文件信息可以從 V$Controlfile 中查詢獲得

          ?

          2 、數(shù)據(jù)文件(數(shù)據(jù)文件的詳細信息記載在控制文件中)

          可以通過如下方式查看數(shù)據(jù)文件

          SQL> select name from v$datafile;

          NAME

          ---------------------------------------------

          /u05/dbf/PROD/system_01.dbf

          /u06/dbf/PROD/temp_01.dbf

          /u04/dbf/PROD/users_01.dbf

          /u09/dbf/PROD/rbs_01.dbf

          /u06/dbf/PROD/applsys_indx_01.dbf

          /u05/dbf/PROD/applsys_data_01.dbf

          從以上可以看出,數(shù)據(jù)文件大致可以分為以下幾類:

          i. 系統(tǒng)數(shù)據(jù)文件 (system_01.dbf)

          存放系統(tǒng)表和數(shù)據(jù)字典,一般不放用戶的數(shù)據(jù),但是用戶腳本,如過程,函數(shù),包等卻是保存在數(shù)據(jù)字典中的。

          名詞解釋:數(shù)據(jù)字典

          數(shù)據(jù)字典是一些系統(tǒng)表或視圖,他存放系統(tǒng)的信息,他包括數(shù)據(jù)庫版本,數(shù)據(jù)文件信息,表與索引等段信息,系統(tǒng)的運行狀態(tài)等各種和系統(tǒng)有關(guān)的信息和用戶腳本信息。數(shù)據(jù)庫管理員可以通過對數(shù)據(jù)字典的查詢,就可以了解到 Oracle 的運行狀態(tài)。

          ii. 回滾段文件 (rbs_01.dbf)

          如果數(shù)據(jù)庫進行對數(shù)據(jù)的修改,那么就必須使用回滾段,回滾段是用來臨時存放修改前的數(shù)據(jù) (Before Image) 。回滾段通常都放在一個單獨的表空間上(回滾表空間),避免表空間碎片化,這個表空間包含的數(shù)據(jù)文件就是回滾數(shù)據(jù)文件。

          iii. 臨時數(shù)據(jù)文件 (temp_01.dbf)

          主要存放用戶的排序等臨時數(shù)據(jù),與回滾段相似,臨時段也容易引起表空間碎片化,而且沒有辦法在一個永久表空間上開辟臨時段,所以就必須有一個臨時表空間,它所包含的數(shù)據(jù)文件就是臨時數(shù)據(jù)文件,主要用于不能在內(nèi)存上進行的排序操作。我們必須為用戶指定一個臨時表空間。

          iv. 用戶數(shù)據(jù)文件 (/applsys_data_01.dbf ,applsys_indx_01.dbf)

          存放用戶數(shù)據(jù),這里列舉了兩類常見的用戶型數(shù)據(jù),一般數(shù)據(jù)和索引數(shù)據(jù),一般來說,如果條件許可的話,可以考慮放在不同的磁盤上。

          3 、重做日志文件(聯(lián)機重做日志)

          用戶對數(shù)據(jù)庫進行的任何操作都會記錄在重做日志文件。在了解重做日志之前必須了解重做日志的兩個概念,重做日志組和重做日志組成員 (Member) ,一個數(shù)據(jù)庫中至少要有兩個日志組文件,一組寫完后再寫另一組,即輪流寫。每個日志組中至少有一個日志成員,一個日志組中的多個日志成員是鏡相關(guān)系,有利于日志文件的保護,因為日志文件的損壞,特別是當(dāng)前聯(lián)機日志的損壞,對數(shù)據(jù)庫的影響是巨大的。

          聯(lián)機日志組的交換過程叫做切換,需要特別注意的是,日志切換在一個優(yōu)化效果不好的數(shù)據(jù)庫中會引起臨時的“掛起”。掛起大致有兩種情況:

          ·在歸檔情況下,需要歸檔的日志來不及歸檔,而聯(lián)機日志又需要被重新利用

          ·檢查點事件還沒有完成(日志切換引起檢查點),而聯(lián)機日志需要被重新利用

          解決這種問題的常用手段是:

          i. 增加日志組

          ii. 增大日志文件成員大小

          通過 v$log 可以查看日志組, v$logfile 可以查看具體的成員文件。

          4 、歸檔日志文件

          Oracle 可以運行在兩種模式之中,歸檔模式和不歸檔模式。如果不用歸檔模式,當(dāng)然,你就不會有歸檔日志,但是,你的系統(tǒng)將不會是一個實用系統(tǒng),特別是不能用于生產(chǎn)系統(tǒng),因為你可能會丟失數(shù)據(jù)。但是在歸檔模式中,為了保存用戶的所有修改,在重做日志文件切換后和被覆蓋之間系統(tǒng)將他們另外保存成一組連續(xù)的文件系列,該文件系列就是歸檔日志文件。

          有人或許會說,歸檔日志文件占領(lǐng)我大量的硬盤空間,其實,具體想一想,你是愿意浪費一點磁盤空間來保護你的數(shù)據(jù),還是愿意丟失你的數(shù)據(jù)呢?顯而義見,我們需要保證我們的數(shù)據(jù)的安全性。其實,歸檔并不是一直占領(lǐng)你的磁盤空間,你可以把她備份到磁帶上,或則刪除上一次完整備份前的所有日志文件。

          5 、初始化參數(shù)文件

          initSID.ora init.ora 文件,因為版本的不一樣,其位置也可能會不一樣。在 8i 中,通常位于 $ORACLE_HOME/admin/<SID>/Pfile

          初始化文件記載了許多數(shù)據(jù)庫的啟動參數(shù),如內(nèi)存,控制文件,進程數(shù)等,在數(shù)據(jù)庫啟動的時候加載( Nomount 時加載),初始化文件記錄了很多重要參數(shù),對數(shù)據(jù)庫的性能影響很大,如果不是很了解,不要輕易亂改寫,否則會引起數(shù)據(jù)庫性能下降。

          6 、其他文件

          i . 密碼文件

          用于 Oracle 的具有 sysdba 權(quán)限用戶的認證 .

          ii. 日志文件

          ·報警日志文件( alert.log alrt<SID>.ora

          記錄數(shù)據(jù)庫啟動,關(guān)閉和一些重要的出錯信息。數(shù)據(jù)庫管理員應(yīng)該經(jīng)常檢查這個文件,并對出現(xiàn)的問題作出即使的反應(yīng)。你可以通過以下 SQL 找到他的路徑 select value from v$PARAMETER where name ='background_dump_dest';

          ·后臺或用戶跟蹤文件

          系統(tǒng)進程或用戶進程出錯前寫入的信息,一般不可能讀懂,可以通過 ORACLE TKPROF 工具轉(zhuǎn)化為可以讀懂的格式。對于系統(tǒng)進程產(chǎn)生的跟蹤文件與報警日志文件的路徑一樣,用戶跟蹤文件的路徑,你可以通過以下 SQL 找到他的路徑 select value from v$PARAMETER where name ='user_dump_dest';

          ?

          三、 ORACLE 邏輯結(jié)構(gòu)

          1 表空間 (tablespace)

          表空間是數(shù)據(jù)庫中的基本邏輯結(jié)構(gòu),一系列數(shù)據(jù)文件的集合。一個表空間可以包含多個數(shù)據(jù)文件,但是一個數(shù)據(jù)文件只能屬于一個表空間。

          2 (Segment)

          段是對象在數(shù)據(jù)庫中占用的空間,雖然段和數(shù)據(jù)庫對象是一一對應(yīng)的,但段是從數(shù)據(jù)庫存儲的角度來看的。一個段只能屬于一個表空間,當(dāng)然一個表空間可以有多個段。

          表空間和數(shù)據(jù)文件是物理存儲上的一對多的關(guān)系,表空間和段是邏輯存儲上的一對多的關(guān)系,段不直接和數(shù)據(jù)文件發(fā)生關(guān)系。一個段可以屬于多個數(shù)據(jù)文件,關(guān)于段可以指定擴展到哪個數(shù)據(jù)文件上面。

          段基本可以分為以下四種

          ·數(shù)據(jù)段 (Data Segment)

          ·索引段 (Index Segment)

          ·回滾段 (Rollback Segment)

          ·臨時段 (Temporary Segment)

          3 、區(qū)間 (Extent)

          關(guān)于 Extent 的翻譯有多種解釋,有的譯作擴展,有的譯作盤區(qū),我這里通常譯為區(qū)間。在一個段中可以存在多個區(qū)間,區(qū)間是為數(shù)據(jù)一次性預(yù)留的一個較大的存儲空間,直到那個區(qū)間被用滿,數(shù)據(jù)庫會繼續(xù)申請一個新的預(yù)留存儲空間,即新的區(qū)間,一直到段的最大區(qū)間數(shù) (Max Extent) 或沒有可用的磁盤空間可以申請。

          ORACLE8i 以上版本,理論上一個段可以無窮個區(qū)間,但是多個區(qū)間對 ORACLE 卻是有性能影響的, ORACLE 建議把數(shù)據(jù)分布在盡量少的區(qū)間上,以減少 ORACLE 的管理與磁頭的移動。

          4 Oracle 數(shù)據(jù)塊 (Block)

          ORACLE 最基本的存儲單位,他是 OS 數(shù)據(jù)塊的整數(shù)倍。 ORACLE 的操作都是以塊為基本單位,一個區(qū)間可以包含多個塊(如果區(qū)間大小不是塊大小的整數(shù)倍, ORACLE 實際也擴展到塊的整數(shù)倍)。

          5 、基本表空間介紹

          a. 系統(tǒng)表空間

          主要存放數(shù)據(jù)字典和內(nèi)部系統(tǒng)表基表

          查看數(shù)據(jù)數(shù)據(jù)字典的 SQL

          select * from dict

          查看內(nèi)部系統(tǒng)表的 SQL

          select * from v$fixed_view_definition

          DBA 對系統(tǒng)的系統(tǒng)表中的數(shù)據(jù)字典必須有一個很深刻的了解,他們必須準備一些基礎(chǔ)的 SQL 語句,通過這些 SQL 可以立即了解系統(tǒng)的狀況和數(shù)據(jù)庫的狀態(tài),這些基本的 SQL 包括

          系統(tǒng)的剩余空間

          系統(tǒng)的 SGA

          狀態(tài)系統(tǒng)的等待

          用戶的權(quán)限

          當(dāng)前的用戶鎖

          緩沖區(qū)的使用狀況等

          在成為 DBA 的道路上我們不建議你過分的依賴于 OEM/Quest 等優(yōu)秀的數(shù)據(jù)庫管理工具,因為他們不利于你對數(shù)據(jù)數(shù)據(jù)字典的理解, SQL 語句可以完成幾乎全部的數(shù)據(jù)庫管理工作。

          大量的讀少量的寫是該表空間的一個顯著的特點。

          b. 臨時表空間 .

          臨時表空間顧名思義是用來存放臨時數(shù)據(jù)的,例如排序操作的臨時空間,他的空間會在下次系統(tǒng)啟動的時候全部被釋放。

          c. 回滾段表空間

          i. 回滾段在系統(tǒng)中的作用

          當(dāng)數(shù)據(jù)庫進行更新插入刪除等操作的時候,新的數(shù)據(jù)被更新到原來的數(shù)據(jù)文件,而舊的數(shù)據(jù) (Before Image) 就被放到回滾段中,如果數(shù)據(jù)需要回滾,那么可以從回滾段將數(shù)據(jù)再復(fù)制到數(shù)據(jù)文件中。來完成數(shù)據(jù)的回滾。在系統(tǒng)恢復(fù)的時候, 回滾段可以用來回滾沒有被 commit 的數(shù)據(jù),解決系統(tǒng)的一直性讀。

          ????? 回滾段在什么情況下都是大量的寫,一般是少量讀,因此建議把回滾段單獨出來放在一個單獨的設(shè)備(如單獨的磁盤或 RAID ),以減少磁盤的 IO 爭用。

          ii. 回滾段的工作方式

          ·一個回滾表空間可以被劃分成多個回滾段 .

          ·一個回滾段可以保存多個會話的數(shù)據(jù) .

          ·回滾段是一個圓形的數(shù)據(jù)模型

          假設(shè)回滾段由 4 個區(qū)間組成,他們的使用順序就是區(qū)間 1 à區(qū)間 2 à區(qū)間 3 à區(qū)間 4 à區(qū)間 1 。也就是說,區(qū)間是可以循環(huán)使用的,當(dāng)區(qū)間 4 到區(qū)間 1 的時候,區(qū)間 1 里面的會話還沒有結(jié)束 , 區(qū)間 4 用完后就不能再用區(qū)間 1, 這時系統(tǒng)必須分配區(qū)間 5 ,來繼續(xù)為其他會話服務(wù)服務(wù)。

          我們分析一個 Update 語句的完成

          . 用戶提交一個 Update 語句

          . Server Process 檢查內(nèi)存緩沖 .

          如果沒有該數(shù)據(jù)塊的緩沖,則從磁盤讀入

          i. 如果沒有內(nèi)存的有效空間, DBWR 被啟動將未寫入磁盤的臟緩沖寫入磁盤

          ii. 如果有有效空間,則讀入

          . 在緩沖內(nèi)更新數(shù)據(jù)

          i. 申請一個回滾段入口,將舊數(shù)據(jù)寫如回滾段

          ii. 加鎖并更新數(shù)據(jù)

          iii. 并在同時將修改記錄在 Redo log buffer

          . 用戶提交一個 Commit 語句

          i. SCN 增加

          ii. Redo log buffer 寫入 Redo log file

          iii. 返回用戶 Commit 完成


          四、 ORACLE 核心初探

          1 LRU 算法和數(shù)據(jù)緩沖區(qū)

          我們知道 Oracle 數(shù)據(jù)庫的文件大小遠遠大于 Oracle 的所擁有的內(nèi)存區(qū)域 SGA LRU 就是一種盡可能將常用的數(shù)據(jù)保留在內(nèi)存的算法。當(dāng)數(shù)據(jù)庫需要一個數(shù)據(jù)緩沖區(qū),他會從數(shù)據(jù)庫緩沖區(qū)的 LRU 隊列的尾部找一個空閑的緩沖,將一個數(shù)據(jù)塊讀入,然后數(shù)據(jù)庫會把這個緩沖區(qū)放到 LRU 隊列的中部,如果該緩沖被其他程序用到的話,那么他會往隊列的頭上移動,如果這個緩沖沒有被其他程序用到,并且沒有被修改過,那么他會慢慢的移動到 LRU 隊列的尾部,最終被認為是空緩沖區(qū)被其他數(shù)據(jù)塊所覆蓋。一旦這個緩沖區(qū)被修改過 DBWR 把他從 LRU 隊列中移出,放到 LRUW 隊列 ( 也叫贓緩沖區(qū) ) 中,等待 DBWR 把他們批量寫入數(shù)據(jù)文件,然后再把他們的緩沖區(qū)連接到 LRU 隊列的尾部,周而復(fù)始的工作。

          理解 HASH 算法,為了提高速度 Oracle 在設(shè)計中采用了大量的 HASH 算法,這里我們講一下 HASH 算法的理論知識,在以后的閱讀中會對 Oracle 有更好的理解。 HASH 是一種以空間換取時間的做法。假如我有 100 萬條數(shù)據(jù),以隊列的方式存儲,如果我要從里面找一條數(shù)據(jù),那么我要從頭開始找,我所需要的空間是 100 萬個存儲單元,如果我用 HASH 的方法來存儲,我把存儲空間劃分為 1000*2000 的數(shù)組,把 100 萬個數(shù)據(jù)分別按照如下規(guī)則添入該數(shù)組:

          1. 定義一個函數(shù),使得每條數(shù)據(jù)對應(yīng)一個 0-999 的值

          2. 把該行記錄存儲在以函數(shù)返回值為下標的數(shù)組里

          3. 我們稱該函數(shù)為 hash 函數(shù) f(row). hash 函數(shù)的返回值為 hash . 數(shù)組為

          hash 數(shù)組 HashArray[n][m].

          即有下列公式

          find a unused buffer in HashArray[f(row)][?]

          HashArray[f(row)][?] = row;

          這樣,當(dāng)我們需要一個行時候我們只需簡單的計算該行的 hash 值,然后到下標為 hash 值的 hash 數(shù)組里找就可以了。即使用最簡單的方法也可以很快的找到

          For (I=1;I<=2000; I ++)

          If (HashArray[f(row)][I] == row ) return;

          Next

          當(dāng)然 HASH 算法還是很復(fù)雜的,這里只是一個最最簡單的例子。如果大家有興趣可以看看有關(guān)數(shù)據(jù)結(jié)構(gòu)的資料 , 這里就不具體展開了。

          ?

          2 LATCH(Oracle 內(nèi)部鎖 )

          有許多人問我 Latch Lock 的區(qū)別,其實很簡單, Latch Oracle 內(nèi)部的 Lock ,他負責(zé)更為細小的內(nèi)部讀寫,比如 Oracle 要把用戶更新的數(shù)據(jù)寫入緩沖區(qū),這時候 Oracle 就會在該緩沖區(qū)上加上 latch ,用來防止 DBWR 把他寫出到磁盤,因為如果沒有這個 Latch DBWR 會把一半新一半老沒有用的數(shù)據(jù)寫到磁盤上。

          ?

          ?

          五、常見問題

          1 、實例和 SID 的關(guān)系是什么?

          經(jīng)常有人問 SID 是什么?在 Oracle 系統(tǒng)中 SID 是一個經(jīng)常出現(xiàn)的變量,如環(huán)境變量 ORACLE_SID 初始化文件 initSID.ora ,那究竟什么是 SID 呢?其實 SID 就是 Oracle 實例的標識,不同的 SID 對應(yīng)不同的內(nèi)存緩沖 (SGA) 和不同的后臺進程。這樣一來我們就可以得當(dāng)在一臺物理的服務(wù)器上可以有多個 SID 的數(shù)據(jù)庫實例。

          2 Oracle 數(shù)據(jù)庫和實例的關(guān)系是什么?

          數(shù)據(jù)庫是由物理文件和存取數(shù)據(jù)文件的實例組成,當(dāng)存取數(shù)據(jù)文件的實例是一個的時候,數(shù)據(jù)庫被稱做單節(jié)點數(shù)據(jù)庫。這是我們看到的最多的數(shù)據(jù)庫形式。當(dāng)然還有一種多節(jié)點數(shù)據(jù)庫,就是一個以上的實例共同訪問一個數(shù)據(jù)庫 ( 或者說共同訪問一組數(shù)據(jù)文件 ) 更好的提供穩(wěn)定性和并行處理能力。這在 8i 中被稱為 OPS(Oracle Parallel Server ) ,在 Oracle9i 中被稱為 RAC(real application cluster) 。在這種數(shù)據(jù)庫中。兩個 / 多個實例分別在不同服務(wù)器上,所有 Oracle 數(shù)據(jù)文件在共享的磁盤陣列上,多個服務(wù)器上的實例可以同時工作,他們通過一個內(nèi)部的網(wǎng)絡(luò)進行通信。如果一臺服務(wù)器不能提供服務(wù)的話,另一臺會接管它的工作,特別是在關(guān)鍵的業(yè)務(wù)有很大的潛力。

          3 、在運行的數(shù)據(jù)庫中數(shù)據(jù)文件中是不是可能存在沒有被提交的數(shù)據(jù)?

          這是可能存在的,因為用戶數(shù)據(jù)文件的數(shù)據(jù)是由 DBWR 寫入的, DBWR 是一個很底層的后臺進程,不負責(zé)與用戶交互。用戶的交互是由 LGWR 完成的。

          4 、在問題 3 中,如果存在沒有寫入的數(shù)據(jù),那么機器突然斷電,數(shù)據(jù)完整性會不會損壞?

          不會的,因為數(shù)據(jù)庫的完整性是 LGWR 來保證的,而且 ORACLE 保證了 DBWR 寫入數(shù)據(jù)文件的任何修改已經(jīng)被記錄在重做日志文件中。當(dāng)系統(tǒng)再次啟動的時候,通過讀取重做日志文件就可以知道那些數(shù)據(jù)沒有被提交。這時候 ORACLE 會自動回滾那些數(shù)據(jù)。所以說聯(lián)機日志的損壞,特別是當(dāng)前聯(lián)機日志的損壞,對數(shù)據(jù)庫的影響是巨大的,可能會導(dǎo)致數(shù)據(jù)庫的不完整。

          5 、數(shù)據(jù)文件損壞會丟失數(shù)據(jù)嗎?

          可以這么說,如果你有備份和歸檔,就不會。因為所有對數(shù)據(jù)修改的記錄都在重做日志中有記錄,所以不會丟失數(shù)據(jù),你只要恢復(fù)以前的備份再用歸檔日志文件恢復(fù)和當(dāng)前的在線重做日志就可以恢復(fù)所有數(shù)據(jù)。

          6 、在線重做日志損壞會丟失數(shù)據(jù)嗎?

          以上說了,在線日志對數(shù)據(jù)庫的損壞是極大的,所以不僅可能丟失數(shù)據(jù),還可能引起數(shù)據(jù)庫的不同步。在重做日志中的所有 commit 的記錄都會丟失,這也是 Oracle 為什么要對在線重做日志文件做鏡像的原因。任何的數(shù)據(jù)丟失都是不允許的。

          7 、我在事務(wù)能不能指定不寫回滾段?

          不可以的,寫回滾段是 ORACLE 保證一致性讀和事務(wù)一致性的根本。回滾段是高寫入段,建議把它放到單獨的設(shè)備上來。

          對于 DDL 語句,如 DROP,TRUNCATE 卻可以不寫回滾段(沒有 UNDO 信息),所以對于整個表的刪除,如果數(shù)據(jù)量比較大,建議用 Truncate Table 的方法。

          不寫聯(lián)機日志也是不可能的,但可以在某些特定操作中,可以寫很少的聯(lián)機日志,如以 NOLOGGING 的方式通過 Create table tablename as select 創(chuàng)建表,或以 Append 的方式 Insert 數(shù)據(jù)到表,或直接載入等操作。

          六、小結(jié)

          這里,我們了解了實例和數(shù)據(jù)庫的關(guān)系,一個數(shù)據(jù)庫可以有多個實例,但是一個實例卻不可能對應(yīng)多個數(shù)據(jù)庫,在一般的情況下,我們都是用的單節(jié)點數(shù)據(jù)庫,即一個實例僅僅對應(yīng)一個數(shù)據(jù)庫。

          我們了解了 ORACLE 實例的組成,包括內(nèi)存和后臺進程,進一步解釋了 SGA 的組成與 SGA 的作用,并分析了語句重用的好處。在后臺進程中,重要的闡述了 DBWR LGWR ,其中 DBWR 是一個底層的由 ORACLE 控制的后臺進程,而 LGWR 負責(zé)與用戶交互 .

          ORACLE 數(shù)據(jù)庫中 , 我們重要闡述了數(shù)據(jù)庫的物理與邏輯結(jié)構(gòu),在物理結(jié)構(gòu)中,需要注意四類以下文件:控制文件,聯(lián)機日志,數(shù)據(jù)文件與參數(shù)文件。在邏輯結(jié)構(gòu)中,需要清楚每個邏輯結(jié)構(gòu)的關(guān)系,從大到小的順序為:表空間à段à區(qū)間à塊。

          最后,簡單的描敘了兩個 ORACLE 的核心內(nèi)容, LRU 算法與 LATCH ,并初步闡述了 HASH 算法的相關(guān)內(nèi)容。有關(guān) ORACLE 更多的核心內(nèi)容,可以參考相關(guān)資料。

          ?

          ?

          參考文獻:

          http://www.happyit.net

          ORACLE 聯(lián)機文檔

          Expert One-on-one Oracle? [ ] Thomas Kyte 清華大學(xué)出版社

          Oracle 8i Web 開發(fā)指南 [ ] Dan Hotka,et al. 清華大學(xué)出版社

          Oracle 8i DBA Architecture & Administration and backup & Recovery Study Guide

          ?[ ] Dong Stuns Biju Thomas 電子工業(yè)出版社

          Oracle 數(shù)據(jù)庫管理員技術(shù)指南 [ ] Sumit Sarin 機械工業(yè)出版社

          ?

          posted on 2006-12-06 19:10 Vista 閱讀(422) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 桦川县| 平远县| 嵩明县| 平湖市| 西乌珠穆沁旗| 襄樊市| 维西| 海阳市| 竹山县| 托里县| 西乌珠穆沁旗| 兴仁县| 承德县| 汾阳市| 黑河市| 密云县| 浪卡子县| 高碑店市| 泗阳县| 旅游| 华亭县| 冕宁县| 公安县| 南皮县| 荥经县| 安泽县| 腾冲县| 晋中市| 汝城县| 南开区| 屏南县| 岚皋县| 临西县| 双牌县| 江城| 宁海县| 利津县| 高州市| 盐边县| 建水县| 涪陵区|