Oracle磁碟碎片處理

2021-08-26 01:48:30 字數 4120 閱讀 8233

在資料庫建立之後,磁碟的空間是連續的,但是隨著對資料的dml操作,在資料庫的資料塊中就會出現一些磁碟碎片。磁碟碎片會影響磁碟i/o操作,浪費磁碟空間,就拿鏈化現象來說吧,通常鏈化行都會跨越不止乙個資料塊,所以當讀取鏈化行時,所需要的磁碟i/o就需要讀取不止乙個資料塊,從而增大了磁碟i/o操作,影響資料庫效能。

對於資料庫的磁碟碎片處理,可以總結為三個處理階段:預防、監控、清理。

第一階段:預防

對於磁碟碎片的預防階段,主要是在對資料庫、表空間或表的設計是所作的一些操作。對於表空間的設計,在設計時,如果可以**表空間的段將會增大到多大的尺寸,那麼最好使用同一的盤區分配,而不是使用自動的盤區分配。並且在確定資料庫塊大小的時候,將資料庫塊大小指定為作業系統塊大小的倍數,這有利於磁碟的i/o操作,同時指定表空間的盤區大小為資料庫塊大小的倍數,這樣在盤區中就可以存放剛好的整數個資料庫塊,而不會因為盤區剩餘空間的大小不能放下乙個資料庫塊而糾結。最好是使用assm來管理表空間,因為這可以減少管理員的工作,而且這也可以減少空閒列表的使用而帶來的效能影響,比如空閒列表的爭用。

而且,在指定表空間盤區大小的時候,如果可以的話,先**一下段的大小,對於盤區過多的段,可以將盤區尺寸設計的大一點以適合於段,乙個太多盤區的段的效能要比乙個有適當盤區大小和盤區數量的段的效能要低。

除此之外,鏈化現象也會導致磁碟碎片,鏈化現象的出現是因為磁碟的資料塊中沒有足夠的空間用以儲存dml操作對錶中行的更改,當在磁碟資料塊中的空閒空間不足時,被更改的行就會鏈結到另外的資料塊以儲存資訊,就這樣,鏈化行就產生了。鏈化行會極大的降低資料庫的效能,降低磁碟i/o效能,從未降低了對資料的查詢效能,而且帶了了磁碟碎片。要預防鏈化帶來的磁碟碎片,那麼,在設計表的時候,就應該正確的**資料塊的空閒空間,以適應資料塊中的行的更改或增長,在預設情況下空閒空間是資料塊的10%,但是,如果表的dml操作非常頻繁,那麼或許就需要更大的空閒空間了,但是如果是唯讀塊,則需要更少的空閒空間。

第二階段:監控

就算在磁碟碎片的預防階段做的多麼的好,我想誰也不能絕對的保證你的磁碟就不會出現或極少出現磁碟碎片吧,就像有些dba所擔憂的一樣,誰也不想在夢中做著白馬王子的時候,現實中的災難卻悄悄降臨。

所以定時的監控是很有必要的,雖然我沒有嘗試過半夜接到客戶投訴的**,但是聽起來那是一件糟糕的事情。

對錶空間的碎片的監控可以用自由空間碎片索引值來顯示,也就是通常所說的fsfi值:

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

通過查詢就算fsfi值就可以知道碎片的產生。而且對於鏈化現象,可以通過檢視statspack報表或awr報表的fetch by continued row的值,或者是通過檢視v$sysstat的table fetch continued row的值,如果有鏈化行就會有值。

sql: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;

--value值越小越好

select * from v$sysstat where name = 'table fetch continued row';

統計出了資料庫的fsfi值,就可以把它作為乙個可比引數。在乙個有著足夠有效自由空間,且fsfi值超過30的表空間中,很少會遇見有效自由空間的問題。當乙個空間將要接近可比引數時,就需要做碎片整理了。

第三階段:清理

如果在磁碟中出現了嚴重的磁碟碎片化現象,那麼接下來的工作應該是處理磁碟碎片,從而挺高磁碟i/o效能和節省空間。

在有一天我發現我的磁碟出現了大量的磁碟碎片,但是當進一步檢視是發現出現磁碟碎片的是其中的一張表。這時我就可以針對這一張表來處理磁碟碎片,首先我選擇的方法是使用ctas方法來建立一張表,原來的表是book,所以可以使

用ctas先建立一張表book1:

create table book1

asselect * from book

nologging;

使用nologging子句可以在建立book1是不產生日誌資訊,從而可以加快建立速度。建立好book1後接下來就是刪除book表,刪除之後再重名民book1為book:

alter table rename book1 to book;

除了使用ctas方法,可以用另外一種方法,就是使用expdp、impdp匯入/匯出表的方法,而且這樣好像比使用ctas方法要更快一點,但是必須保證在匯出完表然後刪除資料庫中的表之後、匯入表之前,匯出檔案是健康的。

但是在我的另外一次發現中,我發現磁碟碎片並不是在某個表的資料塊上,而是在表空間中的很多資料檔案的磁碟中都有挺多的磁碟碎片,所以這時就需要對整個表空間進行碎片處理,我使用的方法是使用expdp、impdp資料幫浦進行表空間的匯出/匯入。

此方法為四步驟:匯出表空間、刪除表空間、建立表空間、匯入表空間

第一步:使用expdp將表空間匯出:

expdp bookinfo/password

datafile=dir1:tbs_book_01.dmp

logfile=dir2:tbs_book_exp_logfile_01.log

tablespaces=tbs_book

第二步:刪除被匯出的表空間

(如果表空間中儲存了其他表空間的表分割槽,需

先將分割槽移動打其他表空間。而且不能刪除默

認的表空間)

drop tablespace tbs_book including

contentsand datafiles;

第三步:建立乙個同名的表空間

create tablespace tbs_book

datafile 『/u01/oradata/db1/tbs_book_01.

dbf』 size 45m autoextend on

next 5m maxsize 200m

extent management local

segment space management auto

blocksize 8k;

第四步:匯入表空間

impdp bookinfo/password

datafile=dir1:tbs_book_01.dmp

logfile=dir2:tbs_book_imp_logfile_01.log

tablespaces=tbs_book

如果這一切對你來說都還不夠,其實重建資料庫也是一種方法,不過這將耗費大量的時間和系統效能,而且不會帶來太多的效能改善,據說很有風險,但至少我沒有試過,儘管是在實驗環境上。

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

`這種方法可用於整個資料

磁碟碎片整理方案

xfs檔案系統用延遲寫入等技術可以減少碎片的出現,但是隨著時間推移,檔案操作比較頻繁,還是會出現碎片的。當磁碟碎片到達一定的限度,會導致機器執行緩慢且無法對目標目錄進行讀寫操作。磁碟碎片整理的步驟如下 一 檢查出需要磁碟碎片清理的機器 ssh連線各compute節點,通過命令xfs db r c f...

系統磁碟碎片解決終極技巧

只要有讀寫,就有碎片產生。那怎樣在使用系統盤 c盤 時碎片少些,提高系統效能呢?其實很簡單的,在系統盤中,系統自動讀寫的,產生碎片最多 於三個方面,我們只要將這三個程式轉移到非系統盤,如d盤進行讀取,就可以減少系統盤中的碎片了。操作方法如下。1 將臨時交換檔案 win386 swp 移到d盤 選擇 ...

有空整理一下磁碟碎片吧

因為ntfs碎片比fat少得多,所以長久以來,幾乎忽略了磁碟碎片.本人的筆記本用得很小心,1年來幾乎沒出什麼問題,但是速度越來越不行,遊戲總是一頓一頓.前幾天對系統進行了大規模的閹割,發現沒有多少改善,甚是奇怪.昨日,發現硬碟聲音總是不斷,突然想到,會不會是因為磁碟碎片的問題.於是,對其進行了整理....