Oracle 數據庫碎片(piàn)整理
我們知道,oracle作為一種大型(xíng)數據庫,廣泛應用於金融、郵電、電力、民航等數據吞吐量巨大,計算機網絡廣泛普及的重要部門。對於係統管理員來(lái)講,如何保證網絡穩定運行,如何提(tí)高數據庫性能,使其更加安全高效,就顯得尤為(wéi)重要。作為影響數據庫性能的一大因素--數據庫碎片,應當引(yǐn)起dba的足夠重(chóng)視,及(jí)時 發現並整理碎片乃是dba一項基本維(wéi)護內容。
---- 1、碎片(piàn)是如何產生的
---- 當生成一(yī)個數據庫時,它會分成稱為表空間(tablespace)的(de)多個邏輯段(segment),如係統(system)表空間,臨時(temporary)表空間等。一個(gè)表空間可以包含多(duō)個數(shù)據範圍(extent)和一個(gè)或多個自由範圍塊,即自由空間(free space)。
---- 表空間、段、範圍、自由空間的邏輯(jí)關係如(rú)下:
---- 當表空間中生成一個段時,將從(cóng)表空間有效自由空間(jiān)中為這個段的初始範圍分配(pèi)空間。在這些初始(shǐ)範圍充滿數據(jù)時,段會請求增加另一個範圍。這(zhè)樣(yàng)的擴展過程會一直繼續(xù)下去,直(zhí)到達到最大的範圍值,或者在表空間中已經沒有自由(yóu)空間(jiān)用於下一個範圍。最理想的狀態就是一個(gè)段的數據可(kě)被(bèi)存在單(dān)一的一個(gè)範圍(wéi)中 。這樣,所有(yǒu)的數據存儲時靠近段內其它數據(jù),並且尋(xún)找數據可少用一些指針。但是一個(gè)段包含多個(gè)範圍的情況是大量存在的,沒有任何措施可以保證這些範圍(wéi)是相鄰存儲(chǔ)的,如圖〈1〉。當要滿足一個(gè)空間要求時,數(shù)據庫(kù)不再合並相鄰的自由範圍(除非別無選擇), 而是尋找(zhǎo)表空間中最大的自由範圍來使用。這樣(yàng)將(jiāng)逐漸形成越來越多的離散(sàn)的、分隔的、較小(xiǎo)的自由空間,即碎片。例如:
---- 2、碎(suì)片(piàn)對係統的影響
---- 隨著時間推移(yí),基於數據庫的應用係統的廣泛使用,產生的碎片會越來越多,將對數據(jù)庫有(yǒu)以下兩點(diǎn)主要影響:
---- (1)導致係統(tǒng)性能減弱
---- 如上所述,當要(yào)滿足一個空間要求時,數據庫將首先查找當前最大的自(zì)由範圍,而"最大"自由範圍逐漸變(biàn)小,要找到一個足(zú)夠大的自由範圍已(yǐ)變得越來越困(kùn)難,從而導致表空間(jiān)中(zhōng)的速度障礙,使數據庫的(de)空(kōng)間分配愈發遠離理想狀態;
---- (2)浪費大(dà)量的表(biǎo)空間
---- 盡管有一(yī)部分自由範圍(如表空間的pctincrease為非0)將會被smon(係統監控)後台進程周(zhōu)期性地合並,但始終有一部分自由範圍無法得以(yǐ)自動合並,浪費了大(dà)量的表空間。
---- 3、自由範圍的碎片計算
---- 由於自由空間碎片是由幾部分組成,如範圍數量、最大範圍尺寸等,我們可用fsfi--free space fragmentation index(自由空間碎片索引)值來直觀體現(xiàn):
fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))
---- 可以看出(chū),fsfi的最大可能值為100(一個(gè)理(lǐ)想(xiǎng)的單文件表空間)。隨(suí)著範圍的增加,fsfi值緩慢下降,而隨著最(zuì)大範圍尺寸(cùn)的減少(shǎo),fsfi值(zhí)會迅(xùn)速下降。
---- 下麵的腳本可以用來計算(suàn)fsfi值:
rem fsfi value compute
rem fsfi.sql
column fsfi format 999,99
select tablespace_name,sqrt(max(blocks)/sum(blocks))*
(100/sqrt(sqrt(count(blocks)))) fsfi
from dba_free_space
group by tablespace_name order by 1;
spool fsfi.rep;
/
spool off;
---- 比如,在某數據庫運行腳本fsfi.sql,得到以下fsfi值:
tablespace_name fsfi
------------------------------ -------
rbs 74.06
system 100.00
temp 22.82
tools 75.79
users 100.00
user_tools 100.00
ydcx_data 47.34
ydcx_idx 57.19
ydjf_data 33.80
ydjf_idx 75.55
---- 統計出了數據庫的fsfi值(zhí),就可以把它(tā)作(zuò)為一個可比參數。在一個有著足夠(gòu)有效自由(yóu)空間,且fsfi值超過30的表空間中,很少會遇見有(yǒu)效自由空間的問題。當一個(gè)空間將要接近可比參數時,就需要做碎片整理了。
---- 4、自由範圍的碎片整理
---- (1)表空間的pctincrease值為非0
---- 可以將表空間的缺省存儲參數pctincrease改為非0。一般將其設(shè)為1,如:
alter tablespace temp
default storage(pctincrease 1);
---- 這樣smon便會(huì)將自由範圍(wéi)自動合並。也可以手(shǒu)工合並自由範圍:
alter tablespace temp coalesce;
---- 5、段的碎片整理
---- 我們知道,段由範圍組成。在有些情況下,有必要對段(duàn)的碎片進行整理(lǐ)。要查看段的有關信息,可查看數據字典dba_segments,範圍的信息可(kě)查看數據字典(diǎn)dba_extents。如果段的碎片過多, 將其數(shù)據壓縮(suō)到一個範圍的最簡單方法便是(shì)用正確的存儲參數將這個段重建,然後將舊表中的數據插入(rù)到新表,同時(shí)刪除舊表。這(zhè)個過程可以用import/export(輸入/輸出)工(gōng)具(jù)來完成。
---- export()命令有一個(壓縮)標誌,這個標誌在讀表時會引發export確定該表所分配的(de)物理空間量,它會向輸出轉儲文件寫入一個新的初始化存儲參數-- 等(děng)於全部所分配空間。若這個表關閉, 則使用import()工具(jù)重新生成。這樣,它(tā)的數據會放入一個新的(de)、較大的初始段中。例如:
exp user/password file=exp.dmp compress=y grants=y indexes=y
tables=(table1,table2);
---- 若輸出成(chéng)功,則從庫中刪(shān)除已輸出的表,然後從輸出轉儲文件(jiàn)中輸入表:
imp user/password file=exp.dmp commit=y buffer=64000 full=y
---- 這種方法可用於整個數據庫。
---- 以上(shàng)簡(jiǎn)單分
關鍵詞:Oracle,數據庫,碎片整理
閱讀本文後您有什麽(me)感想? 已有 人給出評價!
- 0
- 0
- 0
- 0
- 0
- 0