vista

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

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

          主  題:

          ?

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

          作  者:

          ?

          penitent (只取一瓢)

          等  級(jí):

          ?

          譽(yù) 值:

          ?

          100

          所屬論壇:

          ?

          Oracle 高級(jí)技術(shù)

          問題點(diǎn)數(shù):

          ?

          0

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

          ?

          12

          發(fā)表時(shí)間:

          ?

          2003-03-31 21:32:

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

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

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

          > #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ù)庫(kù)管理的可能很少,也就導(dǎo)致了這里很多人的問題都是在開發(fā)上面,當(dāng)然,我不是要求大家學(xué)管理,就是開發(fā),也需要對(duì)數(shù)據(jù)庫(kù)理解,半懂不懂的搞開發(fā),最可能的后果,可能就是項(xiàng)目的失敗,而這是一個(gè)程序員的恥辱。

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

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

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

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

          ?

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

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

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

          ?

          ?


          一、 ORACLE 事例

          1 、 ORACLE 實(shí)例

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

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

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

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

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

          SQL> select * from v$sga;

          NAME VALUE

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

          Fixed Size 39816

          Variable Size 259812784

          Database Buffers 1.049E+09

          Redo Buffers 327680

          更詳細(xì)的信息可以參考 V$sgastat 、 V$buffer_pool

          主要包括以下幾個(gè)部分:

          a 共享池 (Shared pool)

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

          · SQL 語句緩沖 (Library Cache)

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

          下面舉例說明 parse 的時(shí)間

          SQL> select count(*) fromscpass ;

          COUNT(*)

          ----------

          243

          Elapsed: 00:00:00.08

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

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

          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 的時(shí)間差上可以看出該 SQL Parse 時(shí)間約為 00:00:00.02

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

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

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

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

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

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

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

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

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

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

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

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

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

          e 大池 (Large Pool)

          大池的得名不是因?yàn)榇?,而是因?yàn)樗脕矸峙浯髩K的內(nèi)存,處理比共享池更大的內(nèi)存,在 8.0 開始引入。

          下面對(duì)象使用大池:

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

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

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

          4 、后臺(tái)進(jìn)程 (Background process)

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

          Unix 上可以通過如下方法查看后臺(tái)進(jìn)程:

          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 個(gè)基本進(jìn)程他們是

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

          b 、 DBWR

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

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

          這里指出幾個(gè)容易錯(cuò)誤的概念 :

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

          · DBWR 會(huì)觸發(fā) CKPT 后臺(tái)進(jìn)程

          · DBWR 不會(huì)觸發(fā) LGWR 進(jìn)程

          上面的概念都是錯(cuò)誤的 .

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

          DBWR 工作的主要條件如下

          · DBWR 超時(shí)

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

          · CKPT 進(jìn)程觸發(fā) DBWR

          c 、 LGWR

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

          SCN=000000001000

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

          對(duì)象 ID=0801

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

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

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

          LGWR 工作的主要條件如下

          ·用戶提交

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

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

          ·超時(shí)

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

          d SMON

          工作主要包含

          ?? ·清除臨時(shí)空間

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

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

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

          ?? · OPS 中失敗節(jié)點(diǎn)的實(shí)例恢復(fù)

          ?? ·清除 OBJ$

          ?? ·縮減回滾段

          ?? ·使回滾段脫機(jī)

          e 、 PMON

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

          f 、 CKPT

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

          CKPT 工作的主要條件如下

          ·在日志切換的時(shí)候

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

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

          ·用戶觸發(fā)

          以下進(jìn)程的啟動(dòng)需要手工配置

          g 、 ARCH

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

          h RECO

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

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

          服務(wù)進(jìn)程的分類

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

          一個(gè)服務(wù)進(jìn)程對(duì)應(yīng)一個(gè)用戶進(jìn)程

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

          一個(gè)服務(wù)進(jìn)程對(duì)應(yīng)多個(gè)用戶進(jìn)程,輪流為用戶進(jìn)程服務(wù)。

          PGA & UGA

          PGA = Process Global Area

          UGA = User Global Area

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

          j 、用戶進(jìn)程 User Process

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

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

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

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

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

          實(shí)例分析 :

          一個(gè)查詢返回以下 5

          ID Name

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

          1 ShangHai

          2 Beijing

          3 Gugangzhou

          4 ShenZhen

          5 HanZhou

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


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

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

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

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

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

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

          ·備份信息等

          有了這些信息, Oracle 就知道那些文件是數(shù)據(jù)文件,現(xiàn)在的重做日志文件是哪些,這些都是系統(tǒng)啟動(dòng)和運(yùn)行的基本條件,所以他是 Oracle 運(yùn)行的根本。如果沒有控制文件系統(tǒng)是不可能啟動(dòng)的??刂莆募欠浅V匾模话悴捎枚鄠€(gè)鏡相復(fù)制來保護(hù)控制文件,或采用 RAID 來保護(hù)控制文件。控制文件的丟失,將使數(shù)據(jù)庫(kù)的恢復(fù)變的很復(fù)雜。

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

          ?

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

          可以通過如下方式查看數(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ù)庫(kù)版本,數(shù)據(jù)文件信息,表與索引等段信息,系統(tǒng)的運(yùn)行狀態(tài)等各種和系統(tǒng)有關(guān)的信息和用戶腳本信息。數(shù)據(jù)庫(kù)管理員可以通過對(duì)數(shù)據(jù)字典的查詢,就可以了解到 Oracle 的運(yùn)行狀態(tài)。

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

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

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

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

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

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

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

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

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

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

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

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

          i. 增加日志組

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

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

          4 、歸檔日志文件

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

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

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

          initSID.ora init.ora 文件,因?yàn)榘姹镜牟灰粯?,其位置也可能?huì)不一樣。在 8i 中,通常位于 $ORACLE_HOME/admin/<SID>/Pfile

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

          6 、其他文件

          i . 密碼文件

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

          ii. 日志文件

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

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

          ·后臺(tái)或用戶跟蹤文件

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

          ?

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

          1 、 表空間 (tablespace)

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

          2 (Segment)

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

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

          段基本可以分為以下四種

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

          ·索引段 (Index Segment)

          ·回滾段 (Rollback Segment)

          ·臨時(shí)段 (Temporary Segment)

          3 、區(qū)間 (Extent)

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

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

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

          ORACLE 最基本的存儲(chǔ)單位,他是 OS 數(shù)據(jù)塊的整數(shù)倍。 ORACLE 的操作都是以塊為基本單位,一個(gè)區(qū)間可以包含多個(gè)塊(如果區(qū)間大小不是塊大小的整數(shù)倍, ORACLE 實(shí)際也擴(kuò)展到塊的整數(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 對(duì)系統(tǒng)的系統(tǒng)表中的數(shù)據(jù)字典必須有一個(gè)很深刻的了解,他們必須準(zhǔn)備一些基礎(chǔ)的 SQL 語句,通過這些 SQL 可以立即了解系統(tǒng)的狀況和數(shù)據(jù)庫(kù)的狀態(tài),這些基本的 SQL 包括

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

          系統(tǒng)的 SGA

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

          用戶的權(quán)限

          當(dāng)前的用戶鎖

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

          在成為 DBA 的道路上我們不建議你過分的依賴于 OEM/Quest 等優(yōu)秀的數(shù)據(jù)庫(kù)管理工具,因?yàn)樗麄儾焕谀銓?duì)數(shù)據(jù)數(shù)據(jù)字典的理解, SQL 語句可以完成幾乎全部的數(shù)據(jù)庫(kù)管理工作。

          大量的讀少量的寫是該表空間的一個(gè)顯著的特點(diǎn)。

          b. 臨時(shí)表空間 .

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

          c. 回滾段表空間

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

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

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

          ii. 回滾段的工作方式

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

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

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

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

          我們分析一個(gè) Update 語句的完成

          . 用戶提交一個(gè) Update 語句

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

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

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

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

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

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

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

          iii. 并在同時(shí)將修改記錄在 Redo log buffer

          . 用戶提交一個(gè) Commit 語句

          i. SCN 增加

          ii. Redo log buffer 寫入 Redo log file

          iii. 返回用戶 Commit 完成


          四、 ORACLE 核心初探

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

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

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

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

          2. 把該行記錄存儲(chǔ)在以函數(shù)返回值為下標(biāo)的數(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)我們需要一個(gè)行時(shí)候我們只需簡(jiǎn)單的計(jì)算該行的 hash 值,然后到下標(biāo)為 hash 值的 hash 數(shù)組里找就可以了。即使用最簡(jiǎn)單的方法也可以很快的找到

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

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

          Next

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

          ?

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

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

          ?

          ?

          五、常見問題

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

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

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

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

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

          這是可能存在的,因?yàn)橛脩魯?shù)據(jù)文件的數(shù)據(jù)是由 DBWR 寫入的, DBWR 是一個(gè)很底層的后臺(tái)進(jìn)程,不負(fù)責(zé)與用戶交互。用戶的交互是由 LGWR 完成的。

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

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

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

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

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

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

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

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

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

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

          六、小結(jié)

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

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

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

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

          ?

          ?

          參考文獻(xiàn):

          http://www.happyit.net

          ORACLE 聯(lián)機(jī)文檔

          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ù)庫(kù)管理員技術(shù)指南 [ ] Sumit Sarin 機(jī)械工業(yè)出版社

          ?

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新晃| 会理县| 揭阳市| 兴安盟| 武邑县| 泽普县| 冷水江市| 诸暨市| 兴隆县| 东阿县| 简阳市| 永寿县| 海宁市| 固镇县| 庆云县| 安义县| 漳浦县| 东乡县| 泰宁县| 枞阳县| 历史| 琼结县| 遂宁市| 诏安县| 石柱| 万源市| 平顺县| 都江堰市| 溧水县| 互助| 柳州市| 交城县| 项城市| 玉门市| 法库县| 北安市| 云浮市| 金川县| 武宣县| 三台县| 南充市|