ORACLE表空間碎片整理

2021-08-30 13:22:04 字數 3303 閱讀 6644

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

---- 這種方法可用於整個資料庫。 

MySQL表空間碎片整理

mysql表空間碎片整理,mysql可以使用alter table tn engine innodb語句進行表空間碎片整理。而頁內記錄並不是物理有序的,並且刪除記錄後,被刪除的記錄放到頁內free鍊錶,可能會產生很多空洞。alter table命令會重建表,這樣的話,猜測可能掃瞄老表頁內說有資料,乙...

Oracle 碎片整理

我們知道,oracle作為一種大型資料庫,廣泛應用於金融 郵電 電力 民航等資料吞吐量巨大,計算機網路廣泛普及的重要部門。對於系統管理員來講,如何保證網路穩定執行,如何提高資料庫效能,使其更加安全高效,就顯得尤為重要。作為影響資料庫效能的一大因素 資料庫碎片,應當引起dba的足夠重視,及時發現並整理...

關於system表空間碎片整理問題

開發人員在測試環境建了個資料庫,然後將業務表全建在了system表空間下面,導致system表空間被撐到30g,檔案系統空間不足。後來將表都move到其他表空間了,但是對system表空間的datafile進行resize,仍然無法操作。使用了alter tablespace system coal...