oracle碎片整理方法

shwenwen發表於2007-10-22

採用兩種方法:exp imp 和 SQL指令碼整理

[@more@]

---- 我們知道,段由範圍組成。在有些情況下,有必要對段的碎片進行整理。要檢視段的有關資訊,可檢視資料字典 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

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

---- 我們知道,段由範圍組成。在有些情況下,有必要對段的碎片進行整理。要檢視段的有關資訊,可檢視資料字典 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

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


tmp_val VARCHAR2 (500);

BEGIN

--1.整理空間碎片;

FOR REC IN (SELECT TABLE_NAME FROM USER_TABLES )
LOOP
tmp_val:='ALTER TABLE '||REC.TABLE_NAME ||' MOVE';
BEGIN
EXECUTE IMMEDIATE tmp_val;
DBMS_OUTPUT.put_line (tmp_val);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');
END;

END LOOP;

--2.把索引重建(碎片整理後,很多索引會變成UNUSABLE狀態,必須重建後,讓它變成void狀態)
FOR REC IN (SELECT INDEX_NAME FROM USER_INDEXES ) --WHERE STATUS='UNUSABLE'
LOOP
tmp_val:='ALTER INDEX '||REC.INDEX_NAME ||' REBUILD';
BEGIN
EXECUTE IMMEDIATE tmp_val;
DBMS_OUTPUT.put_line (tmp_val);
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line ('Error: ' || tmp_val || '!');
END;

END LOOP;


END;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-978045/,如需轉載,請註明出處,否則將追究法律責任。

相關文章