| 導購 | 订阅 | 在线投稿
分享
 
 
 

必須引起DBA重視的Oracle數據庫碎片

來源:互聯網  2008-06-01 03:25:03  評論

目前,Oracle已經廣泛的應用于各個行業。作爲一名DBA,及時發現並整理碎片已經成爲DBA日常工作中的一項重要維護內容。

1、碎片是如何産生的

當生成一個數據庫時,它會分成稱爲表空間(tablespace)的多個邏輯段(segment),如系統(system)表空間,臨時(temporary)表空間等。一個表空間可以包含多個數據範圍(extent)和一個或多個自由範圍塊,即自由空間(free space)。

表空間、段、範圍、自由空間的邏輯關系如下:

當表空間中生成一個段時,將從表空間有效自由空間中爲這個段的初始範圍分配空間。在這些初始範圍充滿數據時,段會請求增加另一個範圍。這樣的擴展過程會一直繼續下去,直到達到最大的範圍值,或者在表空間中已經沒有自由空間用于下一個範圍。最理想的狀態就是一個段的數據可被存在單一的一個範圍中。這樣,所有的數據存儲時靠近段內其它數據,並且尋找數據可少用一些指針。但是一個段包含多個範圍的情況是大量存在的,沒有任何措施可以保證這些範圍是相鄰存儲的,如圖〈1〉。當要滿足一個空間要求時,數據庫不再合並相鄰的自由範圍(除非別無選擇), 而是尋找表空間中最大的自由範圍來使用。這樣將逐漸形成越來越多的離散的、分隔的、較小的自由空間,即碎片。

2、碎片對系統的影響

隨著時間推移,基于數據庫的應用系統的廣泛使用,産生的碎片會越來越多,將對數據庫有以下兩點主要影響:

(1)導致系統性能減弱

如上所述,當要滿足一個空間要求時,數據庫將首先查找當前最大的自由範圍,而"最大"自由範圍逐漸變小,要找到一個足夠大的自由範圍已變得越來越困難,從而導致表空間中的速度障礙,使數據庫的空間分配愈發遠離理想狀態;

(2)浪費大量的表空間

盡管有一部分自由範圍(如表空間的pctincrease爲非0)將會被smon(系統監控)後台進程周期性地合並,但始終有一部分自由範圍無法得以自動合並,浪費了大量的表空間。

3、自由範圍的碎片計算

由于自由空間碎片是由幾部分組成,如範圍數量、最大範圍尺寸等,我們可用fsfi--free space fragmentation index(自由空間碎片索引)值來直觀體現:

fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents)))

可以看出,fsfi的最大可能值爲100(一個理想的單文件表空間)。隨著範圍的增加,fsfi值緩慢下降,而隨著最大範圍尺寸的減少,fsfi值會迅速下降。

下面的腳本可以用來計算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值,就可以把它作爲一個可比參數。在一個有著足夠有效自由空間,且fsfi值超過30的表空間中,很少會遇見有效自由空間的問題。當一個空間將要接近可比參數時,就需要做碎片整理了。

4、自由範圍的碎片整理

(1)表空間的pctincrease值爲非0

可以將表空間的缺省存儲參數pctincrease改爲非0。一般將其設爲1,如:

alter tablespace temp

default storage(pctincrease 1);

這樣smon便會將自由範圍自動合並。也可以手工合並自由範圍:

alter tablespace temp coalesce;

5、段的碎片整理

我們知道,段由範圍組成。在有些情況下,有必要對段的碎片進行整理。要查看段的有關信息,可查看數據字典dba_segments,範圍的信息可查看數據字典dba_extents。如果段的碎片過多, 將其數據壓縮到一個範圍的最簡單方法便是用正確的存儲參數將這個段重建,然後將舊表中的數據插入到新表,同時刪除舊表。這個過程可以用import/export(輸入/輸出)工具來完成。

export()命令有一個(壓縮)標志,這個標志在讀表時會引發export確定該表所分配的物理空間量,它會向輸出轉儲文件寫入一個新的初始化存儲參數--等于全部所分配空間。若這個表關閉, 則使用import()工具重新生成。這樣,它的數據會放入一個新的、較大的初始段中。例如:

exp user/password file=exp.dmp compress=y grants=y indexes=y

tables=(table1,table2);

若輸出成功,則從庫中刪除已輸出的表,然後從輸出轉儲文件中輸入表:

imp user/password file=exp.dmp commit=y buffer=64000 full=y

注:此方法可以用于整個數據庫。

目前,Oracle已經廣泛的應用于各個行業。作爲一名DBA,及時發現並整理碎片已經成爲DBA日常工作中的一項重要維護內容。 1、碎片是如何産生的 當生成一個數據庫時,它會分成稱爲表空間(tablespace)的多個邏輯段(segment),如系統(system)表空間,臨時(temporary)表空間等。一個表空間可以包含多個數據範圍(extent)和一個或多個自由範圍塊,即自由空間(free space)。 表空間、段、範圍、自由空間的邏輯關系如下: 當表空間中生成一個段時,將從表空間有效自由空間中爲這個段的初始範圍分配空間。在這些初始範圍充滿數據時,段會請求增加另一個範圍。這樣的擴展過程會一直繼續下去,直到達到最大的範圍值,或者在表空間中已經沒有自由空間用于下一個範圍。最理想的狀態就是一個段的數據可被存在單一的一個範圍中。這樣,所有的數據存儲時靠近段內其它數據,並且尋找數據可少用一些指針。但是一個段包含多個範圍的情況是大量存在的,沒有任何措施可以保證這些範圍是相鄰存儲的,如圖〈1〉。當要滿足一個空間要求時,數據庫不再合並相鄰的自由範圍(除非別無選擇), 而是尋找表空間中最大的自由範圍來使用。這樣將逐漸形成越來越多的離散的、分隔的、較小的自由空間,即碎片。 2、碎片對系統的影響 隨著時間推移,基于數據庫的應用系統的廣泛使用,産生的碎片會越來越多,將對數據庫有以下兩點主要影響: (1)導致系統性能減弱 如上所述,當要滿足一個空間要求時,數據庫將首先查找當前最大的自由範圍,而"最大"自由範圍逐漸變小,要找到一個足夠大的自由範圍已變得越來越困難,從而導致表空間中的速度障礙,使數據庫的空間分配愈發遠離理想狀態; (2)浪費大量的表空間 盡管有一部分自由範圍(如表空間的pctincrease爲非0)將會被smon(系統監控)後台進程周期性地合並,但始終有一部分自由範圍無法得以自動合並,浪費了大量的表空間。 3、自由範圍的碎片計算 由于自由空間碎片是由幾部分組成,如範圍數量、最大範圍尺寸等,我們可用fsfi--free space fragmentation index(自由空間碎片索引)值來直觀體現: fsfi=100*sqrt(max(extent)/sum(extents))*1/sqrt(sqrt(count(extents))) 可以看出,fsfi的最大可能值爲100(一個理想的單文件表空間)。隨著範圍的增加,fsfi值緩慢下降,而隨著最大範圍尺寸的減少,fsfi值會迅速下降。 下面的腳本可以用來計算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值,就可以把它作爲一個可比參數。在一個有著足夠有效自由空間,且fsfi值超過30的表空間中,很少會遇見有效自由空間的問題。當一個空間將要接近可比參數時,就需要做碎片整理了。 4、自由範圍的碎片整理 (1)表空間的pctincrease值爲非0 可以將表空間的缺省存儲參數pctincrease改爲非0。一般將其設爲1,如: alter tablespace temp default storage(pctincrease 1); 這樣smon便會將自由範圍自動合並。也可以手工合並自由範圍: alter tablespace temp coalesce; 5、段的碎片整理 我們知道,段由範圍組成。在有些情況下,有必要對段的碎片進行整理。要查看段的有關信息,可查看數據字典dba_segments,範圍的信息可查看數據字典dba_extents。如果段的碎片過多, 將其數據壓縮到一個範圍的最簡單方法便是用正確的存儲參數將這個段重建,然後將舊表中的數據插入到新表,同時刪除舊表。這個過程可以用import/export(輸入/輸出)工具來完成。 export()命令有一個(壓縮)標志,這個標志在讀表時會引發export確定該表所分配的物理空間量,它會向輸出轉儲文件寫入一個新的初始化存儲參數--等于全部所分配空間。若這個表關閉, 則使用import()工具重新生成。這樣,它的數據會放入一個新的、較大的初始段中。例如: exp user/password file=exp.dmp compress=y grants=y indexes=y tables=(table1,table2); 若輸出成功,則從庫中刪除已輸出的表,然後從輸出轉儲文件中輸入表: imp user/password file=exp.dmp commit=y buffer=64000 full=y 注:此方法可以用于整個數據庫。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有