Oracle數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)主要講解Oracle這款DBMS是如何設(shè)計和實現(xiàn)的。整體上Oracle數(shù)據(jù)庫分為輔存中的Oracle(一般稱為數(shù)據(jù)庫稠屠,分為數(shù)據(jù)庫物理存儲結(jié)構(gòu)和邏輯存儲結(jié)構(gòu))和內(nèi)存中的Oracle(一般稱為實例勇边,分為內(nèi)存結(jié)構(gòu)和后臺進程)请唱。
-----------------------------------------存儲結(jié)構(gòu)--------------------------------------------
一 物理存儲結(jié)構(gòu)
1. 數(shù)據(jù)文件
① 數(shù)據(jù)文件是在物理上保存數(shù)據(jù)庫中數(shù)據(jù)的操作系統(tǒng)文件讯赏,是所有數(shù)據(jù)的實際存儲空間义黎。所有數(shù)據(jù)文件大小之和構(gòu)成了數(shù)據(jù)庫的大小。
② 數(shù)據(jù)文件的特點
(1) 一個數(shù)據(jù)文件僅與一個數(shù)據(jù)庫聯(lián)系
(2) 一個表空間由一個或多個數(shù)據(jù)文件組成
(3) 數(shù)據(jù)文件可以通過設(shè)置其自動擴展參數(shù)姐呐,實現(xiàn)其自動擴展的功能
③ 數(shù)據(jù)文件可以分為永久性數(shù)據(jù)文件和臨時性數(shù)據(jù)文件
④ 用戶表中的數(shù)據(jù)最終存儲在數(shù)據(jù)文件中殿怜,但無法指定存儲在哪一個數(shù)據(jù)文件中。(該特點與SQLSever不同曙砂,SQLServer可以指定存儲數(shù)據(jù)文件)
⑤ 雖然無法指定头谜,但我們可以通過數(shù)據(jù)字典dba_data_files或者v$datafile查看數(shù)據(jù)文件信息。
2. 控制文件
① 控制文件是一個記錄數(shù)據(jù)庫結(jié)構(gòu)信息的重要的二進制文件鸠澈,用于描述和維護數(shù)據(jù)庫的物理結(jié)構(gòu)柱告。由Oracle系統(tǒng)進行讀寫操作,DBA不能直接操作控制文件笑陈。
④ 一個數(shù)據(jù)庫至少需要一個控制文件窒所,如果控制文件損壞將導(dǎo)致數(shù)據(jù)庫無法啟動。(SQLsever中一個數(shù)據(jù)庫只需要日志文件和主數(shù)據(jù)文件帆锋,其中主數(shù)據(jù)文件包含了控制文件的內(nèi)容墩新。)
⑤ 查看控制文件中的信息
3. 重做日志文件
① 重做日志文件是以重做記錄的形式記錄窟坐、保存用戶對數(shù)據(jù)庫進行的變更操作海渊,是數(shù)據(jù)庫中最重要的物理文件。
② 對于"最重要的物理文件"的理解
重做日志文件可以進行事務(wù)的重做(Redo)或回退(Undo)哲鸳,是數(shù)據(jù)庫實例恢復(fù)的基礎(chǔ)臣疑。如果現(xiàn)在有數(shù)據(jù)修改,數(shù)據(jù)文件只能記錄修改之后的數(shù)據(jù)徙菠,而重做日志文件不僅記錄修改之前的數(shù)據(jù)讯沈,還記錄修改之后的新數(shù)據(jù),因此重做日志文件的內(nèi)容更多婿奔,若數(shù)據(jù)庫發(fā)生故障缺狠,重做日志文件就可以發(fā)揮其作用了。
4. 歸檔重做日志文件
5. 初始化參數(shù)文件
① 初始化參數(shù)文件是數(shù)據(jù)庫啟動過程所必需的文件萍摊,記錄了數(shù)據(jù)庫顯式參數(shù)的設(shè)置挤茄。
② 數(shù)據(jù)庫啟動的第一步就是根據(jù)初始化參數(shù)文件中的設(shè)置,創(chuàng)建并啟動實例冰木,即分配內(nèi)存空間穷劈、啟動后臺進程笼恰。
③ 參數(shù)文件主要包括了數(shù)據(jù)庫名和控制文件所在路徑。參數(shù)文件分為文本參數(shù)文件和服務(wù)器參數(shù)文件歇终。
6. 跟蹤文件
跟蹤文件是數(shù)據(jù)庫中重要的診斷文件社证。
跟蹤文件中包含數(shù)據(jù)庫系統(tǒng)運行過程中所發(fā)生的重大事件的有關(guān)信息,可以為數(shù)據(jù)庫運行故障的解決提供重要信息评凝。
7. 警告文件
警告文件是特殊的跟蹤文件追葡。
警告文件也是數(shù)據(jù)庫中重要的診斷文件,記錄數(shù)據(jù)庫在啟動奕短、關(guān)閉和運行期間后臺進程的活動情況辽俗。
在數(shù)據(jù)庫出現(xiàn)故障時,應(yīng)首先查看該文件篡诽,但文件中的信息與任何錯誤狀態(tài)沒有必然的聯(lián)系崖飘。
8. 口令文件
二 邏輯存儲結(jié)構(gòu)
1. 表空間
① 表空間是Oracle數(shù)據(jù)庫最大的邏輯存儲單元,一個表空間由多個段組成杈女。
② 表空間與數(shù)據(jù)庫文件直接關(guān)聯(lián)朱浴,一個表空間包含一個或多個數(shù)據(jù)文件,一個數(shù)據(jù)文件只能從屬于某一個表空間达椰,數(shù)據(jù)庫對象就是存儲在表空間對應(yīng)的一個或多個數(shù)據(jù)文件中翰蠢。
③ 一個數(shù)據(jù)對象(例如:表、視圖等)也要存儲在一個表空間中啰劲。數(shù)據(jù)庫的大小從邏輯上等于所有表空間大小之和梁沧。表空間的大小等于構(gòu)成表空間的所有數(shù)據(jù)文件之和。
④ 表空間的分類
-
系統(tǒng)表空間
1)System表空間
system表空間主要存儲:
a. 數(shù)據(jù)庫的數(shù)據(jù)字典蝇裤;
b. SQL程序源代碼和解釋代碼廷支,包括存儲過程、函數(shù)栓辜、包恋拍、觸發(fā)器等;
c. 數(shù)據(jù)庫對象的定義藕甩,如表施敢、視圖、序列狭莱、同義詞等僵娃。
2)SysAUX表空間
SYSAUX表空間是輔助系統(tǒng)表空間,主要用于存儲數(shù)據(jù)庫組件等信息腋妙,以減小SYSTEM表空間的負(fù)荷默怨。
-
非系統(tǒng)表空間
1)撤銷表空間(undotbsl)
專門進行回滾信息的自動管理,由UNDO_TABLESPACE參數(shù)設(shè)置辉阶。2)臨時表空間(temp)
專門進行臨時數(shù)據(jù)管理的表空間先壕。
在數(shù)據(jù)庫實例運行過程中,執(zhí)行排序等SQL語句時會產(chǎn)生大量的臨時數(shù)據(jù)谆甜,這些臨時數(shù)據(jù)將保存在數(shù)據(jù)庫臨時表空間中垃僚。 臨時表空間專門用于排序的。3)用戶表空間(users)
保存用戶數(shù)據(jù)4)示例表空間(example)
-
大文件表空間與小文件表空間
⑤ 表空間的查詢
2. 段
① 段是由一個或多個連續(xù)或不連續(xù)的區(qū)組成的邏輯存儲單元规辱,是表空間的組成單位谆棺。使用段的目的是用來保存特定對象。
② 段的種類有四種
(1) 數(shù)據(jù)段(表段)
數(shù)據(jù)段用來存儲表或簇的數(shù)據(jù)罕袋,可以細分為表數(shù)據(jù)段改淑、索引表數(shù)據(jù)段、分區(qū)表數(shù)據(jù)段及簇數(shù)據(jù)段四種浴讯。
(2) 索引段
用來存放索引信息朵夏,主要包括存儲ROWID(行ID)和索引鍵。
索引段與其相應(yīng)的表段經(jīng)常會被同時訪問榆纽,為了減少硬盤訪問的沖突仰猖,索引段與數(shù)據(jù)段可以放到處于不同物理位置的表空間中。
(3) 臨時段
當(dāng)用戶進行排序查詢時奈籽,如果在指定的內(nèi)存無法完成排序饥侵,Oracle將自動從用戶默認(rèn)的臨時表空間中指派臨時段進行排序。會話結(jié)束衣屏,數(shù)據(jù)將從臨時段中自動刪除躏升。
(4) 回退段
回滾段用于保存數(shù)據(jù)庫的回滾信息,包含當(dāng)前未提交事務(wù)所修改的數(shù)據(jù)的原始版本狼忱。
一個事務(wù)只能使用一個回滾段存放它的回滾信息膨疏,但是一個回滾段可以存放多個事務(wù)的回滾信息。回滾段可以動態(tài)創(chuàng)建和撤銷钻弄。
回滾段的作用:
-
事務(wù)回滾(Transaction Rollback)
事務(wù)提交若出現(xiàn)故障成肘,可以通過回滾段將事務(wù)返回Undo(撤銷)隊列或者Redo(重做)隊列中。 -
讀一致性(Read Consistency)
出現(xiàn)"污讀"情況時斧蜕,發(fā)生"臟數(shù)據(jù)"双霍。Oracle數(shù)據(jù)庫通過回滾段來防止污讀情況的出現(xiàn),實現(xiàn)讀一致性批销。 - 事務(wù)恢復(fù)(Transaction Recovery)
-
閃回查詢(Flashback Query)
3. 區(qū)
① 區(qū)是由一系列連續(xù)的數(shù)據(jù)塊構(gòu)成的邏輯存儲單元洒闸,是存儲空間分配的最小單位。
② 當(dāng)創(chuàng)建一個數(shù)據(jù)庫對象時均芽,Oracle為對象分配若干個區(qū)丘逸,以構(gòu)成一個段來為對象提供初始的存儲空間。當(dāng)段中已分配的區(qū)都**寫滿后掀宋,Oracle會為段分配一個新區(qū)深纲,以容納更多的數(shù)據(jù)仲锄。
③ 一個數(shù)據(jù)塊只能屬于一個區(qū)。
④ 區(qū)的分配
可以通過使用UNIFORM選項湃鹊,指定所有段的初始區(qū)和后續(xù)區(qū)具有統(tǒng)一大小儒喊。
可以使用AUTOALLOCATE選項指定由Oracle自動決定后續(xù)區(qū)大小。
用戶不能通過其他參數(shù)來干預(yù)區(qū)的分配币呵。
⑤ 通常分配給對象的區(qū)將一直保留怀愧,不論區(qū)中的數(shù)據(jù)塊是否被使用。只有當(dāng)對象被刪除時余赢,區(qū)才會被回收芯义。
4. 數(shù)據(jù)塊
最小的I/O單元,每次讀取都是以數(shù)據(jù)塊為單位的妻柒,讀取時不足一個數(shù)據(jù)塊扛拨,則按一塊為單位。
包括一個或者多個OS BLOCK(操作系統(tǒng)塊)
在數(shù)據(jù)庫創(chuàng)建時設(shè)置举塔,不可更改鬼癣。數(shù)據(jù)塊的大小由DB_BLOCK_SIZE參數(shù)設(shè)置標(biāo)準(zhǔn)塊。
分為標(biāo)準(zhǔn)塊和非標(biāo)準(zhǔn)塊啤贩。具有標(biāo)準(zhǔn)大小的數(shù)據(jù)塊為標(biāo)準(zhǔn)塊待秃。
查看標(biāo)準(zhǔn)塊大小:
① 數(shù)據(jù)塊的結(jié)構(gòu)
(1) 塊頭部包括標(biāo)題痹屹、表目錄章郁、行目錄三部分。
標(biāo)題包含塊的一般屬性信息志衍,如塊的物理地址暖庄、塊所屬段的類型等;
表目錄包含數(shù)據(jù)塊中保存的表的信息楼肪;
行目錄包含數(shù)據(jù)塊中的行地址等信息培廓。
(2) 行空間
行數(shù)據(jù)區(qū)是已經(jīng)使用的空間,保存數(shù)據(jù)庫的對象數(shù)據(jù)春叫。是真正存放表數(shù)據(jù)和索引數(shù)據(jù)的地方肩钠。
(3) 空閑空間
空閑區(qū)是尚未使用的存儲空間,用于新行的插入或用來更新已存在的行暂殖。
② 數(shù)據(jù)塊的管理
(1) 行鏈接
當(dāng)向表格中插入數(shù)據(jù)時价匠,如果行的長度大于塊的大小,行的信息無法存放在一個塊中呛每,就需要使用多個塊存放行信息踩窖,將多余的行信息存放于另一個塊中,再用指針鏈接晨横,這稱為行鏈接洋腮。
(2) 行遷移
當(dāng)表格數(shù)據(jù)被更新時箫柳,如果更新后的數(shù)據(jù)長度大于塊長度,Oracle會將整行的數(shù)據(jù)從原數(shù)據(jù)塊遷移到新的數(shù)據(jù)塊中啥供,只在原數(shù)據(jù)塊中留下一個指針指向新數(shù)據(jù)塊悯恍,這稱為行遷移。
(3) 對塊的管理主要是對塊中可用存儲空間的管理滤灯,確定保留多少空閑空間坪稽,避免產(chǎn)生行鏈接曼玩、行遷移而影響數(shù)據(jù)的查詢效率鳞骤。
對塊的管理分為自動和手動兩種。
- 自動管理
如果建立表空間時使用本地管理方式黍判,并且將段的管理方式設(shè)置為AUTO豫尽,則采用自動方式管理塊。 - 手動管理
DBA可以采用手動管理方式顷帖,通過為段設(shè)置PCTFREE(percent free 空閑率)和PCTUSED(percent used使用率)兩個參數(shù)來控制數(shù)據(jù)塊中空閑空間的使用美旧。數(shù)據(jù)塊狀態(tài):空閑Free,使用Used贬墩。
1)PCTFREE
空閑率指定塊中必須保留的最小空閑空間比例榴嗅。
當(dāng)數(shù)據(jù)塊的自由空間百分率低于PCTFREE時,此數(shù)據(jù)塊被標(biāo)志為USED陶舞,此時在數(shù)據(jù)塊中只可以進行更新操作嗽测,而不可以進行插入操作。該參數(shù)默認(rèn)為10肿孵。
2)PCTUSED
使用率指定可以向塊中插入數(shù)據(jù)時唠粥,塊已使用的最大空間比列。
當(dāng)數(shù)據(jù)塊使用空間低于PCTUSED時停做,此塊標(biāo)志為FREE晤愧,可以對數(shù)據(jù)塊中數(shù)據(jù)進行插入操作;
反之蛉腌,如果使用空間高于PCTUSED官份,則不可以進行插入操作。
該參數(shù)默認(rèn)為10烙丛。
--------------------------------------------內(nèi)存體系-----------------------------------------
Oracle數(shù)據(jù)庫系統(tǒng)結(jié)構(gòu)(體系結(jié)構(gòu))的核心是內(nèi)存體系和存儲結(jié)構(gòu)蜀变。本次課主要學(xué)習(xí)Oracle的內(nèi)存體系悄谐,分為Oracle內(nèi)存結(jié)構(gòu)和Oracle進程結(jié)構(gòu)兩部分。
內(nèi)存結(jié)構(gòu)核心是共享的SGA(描述內(nèi)存中各種數(shù)據(jù)存儲結(jié)構(gòu))库北,還包括進程私有的PGA爬舰。
進程結(jié)構(gòu)則以Oracle后臺進程為核心们陆,還包括服務(wù)器進程和用戶進程。
三 內(nèi)存結(jié)構(gòu)
實例:由系統(tǒng)全局區(qū)SGA和后臺進程組成情屹,是內(nèi)存結(jié)構(gòu)的核心坪仇。
1. 系統(tǒng)全局結(jié)構(gòu)(System Global Area,SGA)
SGA是由Oracle分配的共享內(nèi)存結(jié)構(gòu)垃你,包含一個數(shù)據(jù)庫實例的數(shù)據(jù)和控制信息椅文。
SGA數(shù)據(jù)供所有的服務(wù)器進程和后臺進程共享,所以SGA又稱為共享全局區(qū)(Shared Global Area)
-
① 數(shù)據(jù)高速緩沖區(qū)
1)數(shù)據(jù)高速緩沖區(qū)的功能
a.存儲從數(shù)據(jù)文件中讀取出來的數(shù)據(jù)拷貝惜颇。應(yīng)用程序要訪問的數(shù)據(jù)必須從磁盤的數(shù)據(jù)文件讀到數(shù)據(jù)緩沖區(qū)中處理皆刺。(從數(shù)據(jù)文件讀取的數(shù)據(jù)要放在內(nèi)存中的數(shù)據(jù)高速緩沖區(qū))
b.在數(shù)據(jù)緩沖區(qū)中被修改后的數(shù)據(jù)由DBWR進程寫到硬盤的數(shù)據(jù)文件中永久保存。(緩沖區(qū)相當(dāng)于一個車間凌摄,在緩沖區(qū)中對數(shù)據(jù)進行處理羡蛾,然后才寫入倉庫即數(shù)據(jù)文件)
c.提高獲取和更新數(shù)據(jù)的性能。(減少了對磁盤的IO操作)
2)工作過程
3)類型
a.臟緩存塊(Dirty Buffers):臟緩存塊中保存的是已經(jīng)被修改過的數(shù)據(jù)锨亏。
b.空閑緩存塊(Free Buffers):空閑緩存塊中不包含任何數(shù)據(jù)痴怨,它們等待后臺進程或服務(wù)器進程向其中寫入數(shù)據(jù)。
c.命中緩存塊(Pinned Buffers):命中緩存塊是那些正被使用的數(shù)據(jù)塊器予,同時還有很多會話等待修改或訪問的數(shù)據(jù)塊浪藻。
d.干凈緩存塊(Clean Buffers):干凈緩存塊是指那些當(dāng)前沒有被使用,即將被換出內(nèi)存的緩存塊乾翔。
4)大小
數(shù)據(jù)高速緩沖區(qū)越大爱葵,用戶需要的數(shù)據(jù)在內(nèi)存中的可能性就越大,即緩存命中率越高末融,從而減少了Oracle訪問硬盤數(shù)據(jù)的次數(shù)钧惧,提高了數(shù)據(jù)庫系統(tǒng)執(zhí)行的效率。
然而勾习,如果數(shù)據(jù)高速緩沖區(qū)的值太大浓瞪,Oracle就不得不在內(nèi)存中尋找更多的塊來定位所需要的數(shù)據(jù),反而降低了系統(tǒng)性能巧婶。顯然需要確定一個**合理的數(shù)據(jù)高速緩沖區(qū)大小乾颁。 **
DB_CACHE_SIZE(標(biāo)準(zhǔn)塊的緩沖區(qū)大小8k)
-
② 重做日志緩沖區(qū)
2)工作過程
1)重做日志緩沖區(qū)的功能
a.用于緩存用戶對數(shù)據(jù)庫進行修改操作時生成的重做記錄。
b.為了提高工作效率艺栈,重做記錄并不是直接寫入重做日志文件中英岭,而是首先被服務(wù)器進程寫入重做日志緩沖區(qū)中,在一定條件下湿右,再由日志寫入進程(LGWR)把重做日志緩沖區(qū)的內(nèi)容寫入重做日志文件中做永久性保存诅妹。
在歸檔模式下,當(dāng)重做日志切換時,由歸檔進程(ARCH)將重做日志文件的內(nèi)容寫入歸檔文件中吭狡,即當(dāng)前日志文件寫滿了尖殃,LGWR將會切換一個文件寫入,即日志切換划煮,然后原來已經(jīng)寫滿的文件就由Oracle保存到指定路徑送丰,即歸檔。
非歸檔模式下弛秋,假設(shè)有3個日志文件器躏,LGWR寫滿第1個就切換到第2個,寫滿第2個切換到第3個蟹略,當(dāng)?shù)?個寫滿了之后登失,又重新切換到第1個日志文件進行寫入,將覆蓋掉原來第1個文件的內(nèi)容科乎。3)大小
LOG_BUFFER參數(shù)
較大的重做日志緩沖區(qū)壁畸,可以減少對重做日志文件寫的次數(shù)贼急,適合長時間運行的茅茂、產(chǎn)生大量重做記錄的事務(wù)。 -
③ 共享池
1)共享池的功能
共享池用于緩存最近執(zhí)行過的SQL語句太抓、PL/SQL程序和數(shù)據(jù)字典信息空闲,是對SQL語句、PL/SQL程序進行語法分析走敌、編譯碴倾、執(zhí)行的區(qū)域。2)組成
a.庫緩存
庫緩存用于緩存已經(jīng)解釋并執(zhí)行過的SQL語句和PL/SQL程序代碼掉丽,以提高SQL或PL/SQL程序的執(zhí)行效率跌榔。
包括SQL工作區(qū)和PL/SQL工作區(qū)
舉例:實際上不是保存整條SQL語句,而是保存相似的語句結(jié)構(gòu)捶障。查詢成績select * from 成績表 where 學(xué)號=…;
其中select * from 成績表
是每個學(xué)生操作的相似結(jié)構(gòu)僧须,這時將語句結(jié)構(gòu)保存,而學(xué)號
則作為一個變量來處理项炼。
b.數(shù)據(jù)字典緩存區(qū)
數(shù)據(jù)字典緩存區(qū)保存最常用的數(shù)據(jù)字典信息(如表担平、字段)
舉例:select empno from emp。首先會在數(shù)據(jù)字典上查詢emp表锭部,查詢到就保存在該數(shù)據(jù)字典緩存區(qū)中暂论,之后查詢都首先在該緩存區(qū)查找。(字段也是)3)大小
SHARED_POOL_SIZE查看共享池大小拌禾。
合適的共享池大小取胎,可使編譯過的程序代碼長駐內(nèi)存,大大降低重復(fù)執(zhí)行相同的SQL語句(相同結(jié)構(gòu))湃窍、PL/SQL程序的系統(tǒng)開銷闻蛀,從而提高數(shù)據(jù)庫的性能摄杂。 ④ 大型池
1)功能
大型池是一個可選的內(nèi)存配置項,主要為Oracle多線程服務(wù)器循榆、服務(wù)器I/O進程析恢、數(shù)據(jù)庫備份與恢復(fù)操作、執(zhí)行具有大量排序操作的SQL語句秧饮、執(zhí)行并行化的數(shù)據(jù)庫操作等需要大量緩存的操作提供內(nèi)存空間映挂。(即大量/臨時數(shù)據(jù)可以保存在大型池)
如果沒有大型池,上述操作所需要的緩存空間將在共享池或PGA中分配盗尸,因而影響共享池或PGA的使用效率柑船。
2)大小
LARGE_POOL_SIZE查看⑤ Java池
1)功能
Java提供對Java程序設(shè)計的支持,用于存儲Java代碼泼各、Java語句的語法分析表鞍时、Java語句的執(zhí)行方案和進行Java程序開發(fā)。
2)大小
JAVA_POOL_SIZE
通常不小于20M扣蜻,以便安裝Java虛擬機⑥ 流池
1)功能
流池是一個可選的內(nèi)存配置項逆巍,用于對流的支持。
2)大小
STREAMS_POOL_SIZE
2. 程序(私有)全局區(qū)(Program/Private Global Area莽使,PGA)
PGA是一個私有的內(nèi)存區(qū)锐极,不能共享,每個服務(wù)器進程只能訪問自己的PGA芳肌,因此PGA又稱為私有全局區(qū)(Private Global Area)灵再。PGA不在實例中潮针。
系統(tǒng)同時為每個后臺進程分配私有的PGA區(qū)弛车。(不是只有服務(wù)進程有PGA)
所有服務(wù)器進程PGA與所有后臺進程PGA大小的和,即為實例的PGA的大小蕴潦。
PGA隨著服務(wù)器進程與后臺進程的啟動而分配净薛,隨著服務(wù)器進程和后臺進程的終止而被釋放汪榔。
① 排序區(qū)
存放排序操作(如創(chuàng)建索引、分組罕拂、多表連接)所產(chǎn)生的臨時數(shù)據(jù)揍异。(優(yōu)先用大型池保存臨時數(shù)據(jù),沒有才用PGA和共享池)
② 游標(biāo)區(qū)
存放執(zhí)行游標(biāo)操作時所產(chǎn)生的數(shù)據(jù)爆班。
③ 會話區(qū)
保存用戶會話所具有的權(quán)限衷掷、角色、性能統(tǒng)計信息柿菩。
④ 堆棧區(qū)(重要)
用于保存會話過程中的綁定變量戚嗅、會話變量等私有信息。
如上面的select * from 成績表 where 學(xué)號=101
,這里的學(xué)號
就是所說的綁定變量或會話變量懦胞。
3. 查看內(nèi)存參數(shù)
查看SGA的基本信息
-
使用V$SGAINFO視圖查看SGA基本信息
-
使用show parameters 參數(shù)名 查看
比如
SQL>show parameters log_buffer
查看日志緩沖區(qū)大小
SQL>show parameters db_cache_size
查看數(shù)據(jù)高速緩沖區(qū)替久,結(jié)果為0表示本實例采用了內(nèi)存自動管理
SQL>show parameters size(如果不知道具體名稱可以用size)
查看所有帶size的參數(shù)
SQL>show parameters
查看所有參數(shù)
為什么用v$sgainfo
查詢的高速緩存區(qū)是1275068416,而size
里面的卻是0躏尉?
這是因為Oracle的默認(rèn)模式是內(nèi)存自動管理模式(自動分配管理)蚯根。show里面查詢的是我們原始設(shè)置的參數(shù)大小,v$sgainfo是當(dāng)前的內(nèi)存大小分配胀糜,由系統(tǒng)自動調(diào)整颅拦。
四 進程結(jié)構(gòu)
1. 進程結(jié)構(gòu)的介紹
進程是操作系統(tǒng)中一個獨立的可以調(diào)度的活動,用于完成指定的任務(wù)教藻。進程與程序的區(qū)別在于:
① 進程是動態(tài)的概念距帅,即動態(tài)創(chuàng)建,完成任務(wù)后立即消亡括堤;而程序是一個靜態(tài)實體碌秸。
② 進程強調(diào)執(zhí)行過程,而程序僅僅是指令的有序集合悄窃。
類型:
用戶進程
服務(wù)器進程
后臺進程
2. Oracle服務(wù)進程
① 專用服務(wù)器進程
只能為一個用戶進程提供服務(wù)讥电。
(2)位于數(shù)據(jù)庫服務(wù)器中的Oracle監(jiān)聽程序探測到用戶進程請求后广匙,首先驗證用戶進程提供的用戶名和口令允趟,驗證通過后建立一個專用的服務(wù)器進程為該用戶進程提供服務(wù)恼策。
(3)用戶提交一條SQL語句鸦致。
(4)專用服務(wù)器進程首先判斷在共享池中是否存在類似的SQL語句。如果不存在涣楷,將為這條SQL語句保存到共享池分唾,然后解析該語句。在解析過程中狮斗,服務(wù)器進程將檢查該語句的語法正確性绽乔。同時,該語句的私有數(shù)據(jù)和信息保存到服務(wù)器進程的PGA中碳褒。
(5)解析完成后折砸,服務(wù)器進程開始在數(shù)據(jù)高速緩沖區(qū)中尋找SQL語句所要求的數(shù)據(jù)。如果數(shù)據(jù)不在數(shù)據(jù)高速緩沖區(qū)中沙峻,還需要從數(shù)據(jù)文件中將所需要的數(shù)據(jù)讀取到數(shù)據(jù)高速緩沖區(qū)中睦授,同時返回給用戶。
(6)服務(wù)器進程執(zhí)行SQL語句摔寨。如果SQL語句要對數(shù)據(jù)進行更改去枷,僅在數(shù)據(jù)高速緩沖區(qū)中對緩存塊進行更改,并將更改所生成的重做記錄保存在重做日志緩存區(qū)中。將來删顶,由LGWR進程將重做記錄寫入重做日志文件竖螃,再由DBWR進程將臟緩存塊寫入數(shù)據(jù)文件。
(7)執(zhí)行完畢后逗余,服務(wù)器進程將結(jié)果返回給用戶進程特咆。
② 共享服務(wù)器進程
可以為多個用戶進程提供服務(wù)。
(2)位于服務(wù)器中的Oracle監(jiān)聽程序探測到用戶進程請求后,首先驗證用戶進程提供的用戶名和口令关摇,驗證通過后將該用戶進程分配給一個調(diào)度進程荒叶。
(3)用戶進程直接與調(diào)度進程(可能有多個)進行交互。
(4)用戶提交一條SQL語句输虱,調(diào)度進程對SQL語句進行處理些楣,然后將處理結(jié)果放入位于SGA中的一個“請求隊列”(只有一個)中,同時將調(diào)度程序ID也存入請求隊列宪睹。
(5)當(dāng)某個共享服務(wù)器(多個)進程空閑時愁茁,從“請求隊列”中取出一條處理后的SQL語句,并對該語句進行解析和執(zhí)行亭病,得到它所請求的數(shù)據(jù)鹅很。
(6)共享服務(wù)器進程將處理結(jié)果放入SGA中的一個“響應(yīng)隊列”(有多個)中。每個調(diào)度進程都有一個對應(yīng)的“響應(yīng)隊列”罪帖。
(7)調(diào)度進程定期檢查自己的“響應(yīng)隊列”促煮,如果發(fā)現(xiàn)有自己送出請求的處理結(jié)果,則將結(jié)果取出整袁。調(diào)度進程根據(jù)處理結(jié)果中保存的調(diào)度程序ID來標(biāo)識該結(jié)果是否是自己的菠齿。
(8)調(diào)度程序?qū)⑻幚斫Y(jié)果返回給用戶進程。
3. 后臺進程
① DBWR進程(數(shù)據(jù)庫寫入進程)
- 把數(shù)據(jù)高速緩沖區(qū)中已經(jīng)被修改過的數(shù)據(jù)(臟緩存塊)成批寫入數(shù)據(jù)文件中永久保存坐昙,同時使數(shù)據(jù)高速緩沖區(qū)有更多的空閑緩存塊绳匀,保證服務(wù)器進程將所需要的數(shù)據(jù)從數(shù)據(jù)文件中讀取到數(shù)據(jù)高速緩沖區(qū)中,提高緩存命中率炸客。
- 啟動DBWR進程
a.執(zhí)行INSERT疾棵、UPDATE等操作時 ,沒有足夠的空閑塊
b.當(dāng)檢查點發(fā)生時痹仙,將啟動DBWR進程
c.當(dāng)數(shù)據(jù)緩存的LRU列表的長度達到初始化 DB_BLOCK_WRITE_BATCH指定值的一半時是尔。
d.若發(fā)生超時(大約3秒未被啟動)
② LGWR進程(日志寫入進程)
- 日志寫入進程負(fù)責(zé)把重做日志緩沖區(qū)的重做記錄一次性寫入重做日志文件中永久保存。
- 啟動LGWR進程
a.用戶通過COMMIT語句提交當(dāng)前事務(wù):事物對應(yīng)兩種數(shù)據(jù)蝶溶,一種是日志數(shù)據(jù)信息嗜历、一種是臟緩存塊中的用戶數(shù)據(jù)宣渗。提交后,前者直接由LGWR寫入日志文件梨州,而后者則是還存在高速緩存區(qū)中痕囱,當(dāng)條件滿足后,由啟動DBWR進程確定暴匠。
b.重做日志緩存被寫滿三分之一(假如日志緩存區(qū)90MB鞍恢,第一個事物是29MB,則不會啟動每窖,仍可以寫入緩存區(qū)帮掉,但第二個事物是60MB,超過30MB窒典,馬上啟動全部寫入)
c.DBWR進程開始將臟緩存塊寫入數(shù)據(jù)文件時
d.每隔3秒蟆炊,即發(fā)生一次超時,將啟動LGWR
③ CPKT進程(檢查點進程)
-
檢查點概念
檢查點是一個事件瀑志,①當(dāng)該事件發(fā)生時(每隔一段時間發(fā)生)涩搓,DBWR進程要把數(shù)據(jù)高速緩沖區(qū)中臟緩存塊寫入數(shù)據(jù)文件中,這時劈猪,會使得LGWR進程啟動昧甘,則會先寫重做日志緩沖區(qū),再臟緩存塊寫入數(shù)據(jù)文件战得。②同時Oracle將對數(shù)據(jù)庫控制文件和數(shù)據(jù)文件的頭部的同步序號進行更新充边,以記錄下當(dāng)前的數(shù)據(jù)庫結(jié)構(gòu)和狀態(tài),保證數(shù)據(jù)的一致性常侦。 -
CKPT進程的作用
a.更新控制文件與數(shù)據(jù)文件的頭部浇冰,使其同步
b.觸發(fā)DBWR進程,將臟緩存塊寫入數(shù)據(jù)文件(會先調(diào)用LGWR進程)
④ SMON進程(系統(tǒng)監(jiān)控進程)
-
功能
a. 實例恢復(fù)- 執(zhí)行前滾(ROLL FORWARD)刮吧,將重做日志信息已經(jīng)寫入到重做日志文件中但還數(shù)據(jù)還沒有寫入到數(shù)據(jù)文件中的已提交的數(shù)據(jù)寫入到數(shù)據(jù)文件湖饱。
- 在前滾完成后立即打開數(shù)據(jù)庫。此時用戶可以連接數(shù)據(jù)庫杀捻,但此時數(shù)據(jù)文件中可能存在一些沒有提交的數(shù)據(jù)需要回滾。
- 回滾沒有提交的事務(wù)
b. 回收不再使用的臨時空間蚓庭。
c. 將各個表空間的空閑碎片(空閑塊)合并(表空間的存儲參數(shù)PCTINCREASE不為0時)
因為塊必須是連續(xù)的致讥,因此中間的塊若有數(shù)據(jù)刪除,則產(chǎn)生空閑器赞,這時就可以用SMON進程合并這些空閑塊垢袱。
⑤ PMON進程(進程監(jiān)控進程)
負(fù)責(zé)恢復(fù)失敗的用戶進程或服務(wù)器進程,并且釋放進程所占用的資源港柜。
清除非正常中斷的用戶進程留下的孤兒會話请契,回退未提交的事務(wù)咳榜,釋放會話所占用的鎖、SGA爽锥、PGA等資源涌韩。
監(jiān)控調(diào)度進程和服務(wù)器進程的狀態(tài),如果它們失敗氯夷,則嘗試重新啟動它們臣樱,并釋放它們所占用的各種資源。
⑥ ARCH進程(歸檔進程)
歸檔進程負(fù)責(zé)在日志切換后將已經(jīng)寫滿的重做日志文件復(fù)制到歸檔目標(biāo)(一個磁盤路徑)中腮考,防止寫滿的重做日志文件被覆蓋
⑦ RECO進程(恢復(fù)進程)
RECO進程負(fù)責(zé)在分布式數(shù)據(jù)庫環(huán)境中自動解決分布式事務(wù)的故障雇毫。一個節(jié)點的RECO自動解決所有的懸而未決的事務(wù)。當(dāng)一個數(shù)據(jù)庫服務(wù)器的RECO后臺進程試圖建立同一遠程服務(wù)器的通信踩蔚,如果該遠程服務(wù)器不可用或者網(wǎng)絡(luò)連接不能建立時棚放,RECO自動地在一個時間間隔之后再次連接。
⑧ LCKn進程(鎖進程)
LCKn進程用于Oracle并行服務(wù)器環(huán)境中馅闽。在數(shù)據(jù)庫中最多可以啟動10個LCKn進程席吴,主要用于實例間的封鎖(鎖的是實例)。
⑨ Dnnn(調(diào)度進程)
Dnnn進程是多線程服務(wù)器(Multithreaded Server捞蛋,MTS)的組成部分孝冒,以后臺進程的形式運行。調(diào)度進程接受用戶進程請求拟杉,將它們放入請求隊列中庄涡,然后為請求隊列中的用戶進程分配一個服務(wù)器進程。最后搬设,從響應(yīng)隊列返回數(shù)據(jù)給用戶進程
-----------------------------------學(xué)習(xí)Oracle的數(shù)據(jù)字典--------------------------------
前面課程已經(jīng)學(xué)習(xí)了Oracle數(shù)據(jù)庫系統(tǒng)的體系結(jié)構(gòu)穴店,但是針對一個具體的Oracle數(shù)據(jù)庫,我們應(yīng)該如何獲知該數(shù)據(jù)庫的結(jié)構(gòu)信息呢拿穴?一條記錄是如何在Oracle內(nèi)部被存儲管理的呢泣洞?本次課主要學(xué)習(xí)Oracle的數(shù)據(jù)字典,然后利用Oracle的數(shù)據(jù)字典來查看一條記錄是如何存儲的默色。
五 數(shù)據(jù)字典
數(shù)據(jù)字典是只讀的球凰,只能由Oracle系統(tǒng)才能對字典管理維護
數(shù)據(jù)字典表 和 視圖 都屬于sys用戶,存儲于system表空間腿宰。
(注意:系統(tǒng)表空間不止包括system表空間)
Oracle數(shù)據(jù)字典保存數(shù)據(jù)本身的系統(tǒng)信息以及所有數(shù)據(jù)庫對象信息呕诉。
有
1.保存數(shù)據(jù)庫對象的定義信息。表吃度、視圖甩挫、索引、同義詞椿每、序列伊者、存儲過程英遭、函數(shù)、包亦渗、觸發(fā)器及其他各種對象挖诸。
2.數(shù)據(jù)庫存儲空間分配信息。
記錄數(shù)據(jù)庫對象分配了多少個區(qū)央碟、使用了多少空間(區(qū))
3.數(shù)據(jù)庫安全信息税灌。用戶、權(quán)限亿虽、角色菱涤、完整性
4.數(shù)據(jù)庫運行時的性能(SGA分配合理?與PGA夠大洛勉?)和統(tǒng)計信息粘秆。
5.其他數(shù)據(jù)庫本身的基本信息。
數(shù)據(jù)字典用途
1.Oracle通過訪問數(shù)據(jù)字典判斷
用戶權(quán)限的合法性
模式對象的存在性: 表存在不存在
存儲空間的可用性 配額:給存儲空間分配的額度收毫。
在user表空間中(insert ... into emp ) 假設(shè)用戶HR有權(quán)限添加
僅僅有權(quán)之外攻走,還受制于用戶在user表空間的配額。假如分配的配額是1M此再,那么每次只能最大添加1M昔搂。
另一種含義:支持系統(tǒng)可以性,表空間如果脫機输拇、查詢不了數(shù)據(jù)摘符。
2.使用DDL語句修改數(shù)據(jù)庫對象后,Oracle將在數(shù)據(jù)字典中記錄所做的修改策吠。
3.任何用戶都可以從數(shù)據(jù)字典只讀視圖中獲取各種數(shù)據(jù)庫對象信息逛裤。
4.DBA可從數(shù)據(jù)字典動態(tài)性能視圖中獲取數(shù)據(jù)庫的運行狀態(tài),作為進行性能調(diào)整的依據(jù)猴抹。
數(shù)據(jù)字典的結(jié)構(gòu)
分為:
數(shù)據(jù)字典表 和 數(shù)據(jù)字典視圖
按數(shù)據(jù)字典對象的虛實性不同(數(shù)據(jù)字典的可變性)带族,分為
靜態(tài)數(shù)據(jù)字典(數(shù)據(jù)不變) 和 動態(tài)數(shù)據(jù)字典(實時記錄數(shù)據(jù)變化,數(shù)據(jù)可變)
2*2 = 4 一共得到四種數(shù)據(jù)字典
1.靜態(tài)數(shù)據(jù)字典表
在數(shù)據(jù)庫創(chuàng)建過程由sql.bsq自動創(chuàng)建蟀给。由sys所有蝙砌。
由$
結(jié)尾,如tab$
坤溃。只有Oracle才能讀寫拍霜,用戶不能讀,不直接使用薪介。
2.靜態(tài)數(shù)據(jù)字典視圖
該數(shù)據(jù)字典是用戶該使用的。
為了用戶可讀越驻,可使用靜態(tài)數(shù)據(jù)字典視圖汁政。
catalog.sql腳本創(chuàng)建的靜態(tài)數(shù)據(jù)字典視圖和其別名道偷。
如user_tables,由 _
組成记劈。
3.動態(tài)數(shù)據(jù)字典表
動態(tài)數(shù)據(jù)字典表是在數(shù)據(jù)庫實例運行過程中由Oracle動態(tài)創(chuàng)建和維護的一系列“虛表”勺鸦,在實例關(guān)閉時被釋放。
“虛表”目木,系統(tǒng)使用换途、用戶不使用,以X$開頭刽射,由sys用戶所有军拟。
4.動態(tài)數(shù)據(jù)字典視圖
以v$
開頭,用戶可以使用誓禁,主要是管理員使用懈息。動態(tài)性能視圖又稱為V$視圖
,如動態(tài)性能視圖V$DATAFILE
摹恰。
數(shù)據(jù)字典的使用
查詢數(shù)據(jù)字典信息
dictionary 獲取表或試圖的名稱和解釋
dict_columns 獲取的是表或視圖中 字段 的名稱和解釋 大寫
1.靜態(tài)數(shù)據(jù)字典表的使用
用戶不能對這些表直接操作辫继。
2.靜態(tài)數(shù)據(jù)字典視圖
通常,用戶通過對靜態(tài)數(shù)據(jù)字典視圖的查詢可以獲取所需要的所有數(shù)據(jù)庫信息俗慈。
user_ 當(dāng)前數(shù)據(jù)庫用戶 所擁有的 所有模式對象 的信息
all_ 當(dāng)前數(shù)據(jù)庫用戶 可以訪問 的所有模式對象的信息
user是all的子集
dba_ 包含了所有數(shù)據(jù)庫對象信息姑宽,只有具有DBA角色的用戶才能夠訪問這些視圖
3.動態(tài)性能表使用
都屬于sys用戶,用戶不能使用闺阱。
4.動態(tài)性能視圖的使用
動態(tài)性能視圖是SYS用戶所擁有的炮车,在默認(rèn)情況下,只有SYS用戶和擁有DBA角色的用戶可以訪問馏颂。
不同模式下示血,執(zhí)行同一數(shù)據(jù)庫的數(shù)據(jù)字典視圖,信息可能不同救拉。
不同狀態(tài)下难审,能使用的數(shù)據(jù)字典視圖不一樣。
nomount下亿絮,打開了初始化參數(shù)文件告喊,可以使用與參數(shù)相關(guān)的視圖。
mount下派昧,打開了控制文件黔姜,記錄了數(shù)據(jù)庫信息,可以訪問與數(shù)據(jù)庫相關(guān)的視圖
open下蒂萎,可以訪問表了秆吵。
-----------------------------------------------------------------------------------------------------------------------------
Oracle體系結(jié)構(gòu)總結(jié)
一個數(shù)據(jù)庫分兩大部分
實例和存儲結(jié)構(gòu)
存儲結(jié)構(gòu)主要是物理存儲結(jié)構(gòu)
數(shù)據(jù)文件 控制文件 重做日志文件 歸檔文件
實例
后臺進程:DBWR CKPT LGWR ARCH SMON PMON
實例內(nèi)存結(jié)構(gòu)SGA:數(shù)據(jù)高速緩沖區(qū) 日志緩沖區(qū) 共享池 大型池 Java池 流池 其他
用戶進程發(fā)出請求,讓服務(wù)器進程接收五慈,然后服務(wù)器使用實例纳寂。
查詢操作select
服務(wù)進程 到 數(shù)據(jù)高速緩沖區(qū) 查找 找到了返回給服務(wù)器進程主穗,再給用戶進程。
若找不到毙芜,服務(wù)進程則會通過 數(shù)據(jù)字典 打開數(shù)據(jù)文件忽媒,以塊為單位讀出數(shù)據(jù)塊,把這些塊放入數(shù)據(jù)高速緩沖區(qū)
然后服務(wù)進程同時返回信息給用戶進程腋粥。
修改操作updata
前提:數(shù)據(jù)高速緩沖區(qū)由DL(臟緩存塊列表晦雨,存放臟緩存塊的塊號) 和 LRU(最近最少列表) 管理。
服務(wù)進程先找到數(shù)據(jù)高速緩沖區(qū)隘冲,找到了,在數(shù)據(jù)緩沖區(qū)進行修改对嚼,寫入臟緩存塊,然后將臟緩存塊放入DL漠烧。
若要再修改下一個update已脓,發(fā)現(xiàn)數(shù)據(jù)緩沖區(qū)沒有空閑通殃,
會再修改之前先生成重做日志記錄信息寫入日志緩沖區(qū),
寫完再修改緩存塊画舌,再將緩存塊的地址放入DL堕担,
最后會啟動DBWR,將緩沖區(qū)數(shù)據(jù)寫入數(shù)據(jù)文件曲聂。
CKPT發(fā)生時霹购,會啟動DBWR,要求DBWR將全部臟緩存塊寫入數(shù)據(jù)文件朋腋,
但DBWR啟動之前齐疙,DBWR會要求LGWR啟動先將對應(yīng)的日志緩存信息寫入到重做日志文件,
若LGWR寫一半時旭咽,發(fā)現(xiàn)重做日志文件寫滿了贞奋,
則在歸檔模式下,ARCH進程會啟動穷绵,將寫滿的重做日志文件在另一個路徑下寫入歸檔文件轿塔,
然后LGWR會繼續(xù)寫入日志緩沖區(qū),寫完后,DBWR將全部臟緩存塊寫入數(shù)據(jù)文件催训,
DBWR寫完之后洽议,CKPT會在數(shù)據(jù)文件宗收、控制文件漫拭、重做日志文件(非必須)的頭部寫入同步序列號。
若發(fā)現(xiàn)序列號不同混稽,則用歸檔文件恢復(fù)采驻。
在多表查詢下礼旅,會生成大量臨時數(shù)據(jù)。
此時汰翠,若有大型池,先用大型池佛纫,
若無,則用服務(wù)進程的PGA的排序區(qū)甥啄,若不夠用
則共享池中存放,也可以使用臨時表空間迎变。
邏輯存儲結(jié)構(gòu) 與 物理存儲結(jié)構(gòu)
結(jié)合案例更明晰。