Oracle 10g Release 2 引入重量級新特性:**ALTER TABLESPACE ... DROP DATAFILE**,允許徹底移除表空間中的空資料檔,並同步清理資料字典,不再遺留「幽靈檔案」。本文詳細說明適用條件、操作步驟、驗證方法與關鍵限制 (特別是 SYSTEM 表空間禁忌)。
| 版本 | 刪除資料檔行為 | 殘留問題 |
|---|---|---|
| 10gR1 及以前 | 僅支援 DROP TABLESPACE ... INCLUDING CONTENTS AND DATAFILES (整表空間) | 單一檔案刪除後,字典 (DBA_DATA_FILES, V$DATAFILE) 仍保留記錄,OS 檔案需手動刪除,易造成混淆 |
| 10gR2+ | 支援單一空檔案 DROP DATAFILE | 字典同步清除,OS 檔案自動刪除 (OMF) 或手動刪除,零殘留 |
SQL> SELECT * FROM v$version;
-- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
SQL> ALTER TABLESPACE users ADD DATAFILE '/opt/oracle/oradata/eygle/users02.dbf' SIZE 10M;
Tablespace altered.
-- 3a. 字典層面確認檔案編號
SQL> SELECT file#, name FROM v$datafile;
FILE# NAME
----- --------------------------------------------------
5 /opt/oracle/oradata/eygle/users02.dbf
-- 3b. 表空間層面確認
SQL> SELECT file_name, file_id FROM dba_data_files WHERE tablespace_name = 'USERS';
FILE_NAME FILE_ID
-------------------------------------------- -------
/opt/oracle/oradata/eygle/users02.dbf 5
/opt/oracle/oradata/eygle/users01.dbf 4
-- 3c. 關鍵:確認檔案無任何區間分配 (DBA_EXTENTS)
SQL> SELECT segment_name, file_id, blocks FROM dba_extents WHERE file_id = 5;
no rows selected -- ✅ 確認為空檔案,可安全刪除
SQL> ALTER TABLESPACE users DROP DATAFILE '/opt/oracle/oradata/eygle/users02.dbf';
Tablespace altered.
SQL> SELECT file_name, file_id FROM dba_data_files WHERE tablespace_name = 'USERS';
FILE_NAME FILE_ID
-------------------------------------------- -------
/opt/oracle/oradata/eygle/users01.dbf 4 -- ✅ 僅剩原檔案
SQL> SELECT file#, name FROM v$datafile WHERE name LIKE '%users02%';
no rows selected -- ✅ V$DATAFILE 已無記錄
ORA-03262: the file is non-empty。需先移動物件 (ALTER TABLE ... MOVE TABLESPACE、ALTER INDEX ... REBUILD TABLESPACE) 或縮減表空間。DROP TEMPFILE (10gR2+ 支援)。o1_mf_users_%),執行 DROP DATAFILE 會自動刪除 OS 層檔案。非 OMF 檔案需手動 rm。ALTER TABLESPACE users ADD DATAFILE '+DATA/users03.dbf' SIZE 10G;DBA_EXTENTS 無記錄。DROP DATAFILE 移除舊檔案。DROP DATAFILE 是 10gR2 解決「誤加檔案無法乾淨移除」歷史遺留問題的關鍵特性。核心前提:**檔案必須為空 (無區間)**。**SYSTEM 表空間絕對禁區**。操作前後查詢 DBA_EXTENTS、DBA_DATA_FILES、V$DATAFILE 三重驗證,確保字典與存儲層面雙重乾淨。