如果想要刪除表空間的數據文件,最好且最安全的辦法是,刪除表空間后重建
步驟如下:
1,導出該表空間中的所有內容;
2,刪除表空間:DROP TABLESPACE <tablespace_name> INCLUDING CONTENTS;
3,重新創建新的表空間及其數據文件;
4,將導出的數據導入表空間;
但是在實際應用環境中,數據文件往往比較大,表空間重建顯得不太實際。
目標:刪除表空間的一個數據文件
測試環境:Oracle 11.2.0.4.0 64bit
注意:此方法僅用來刪除誤加的表空間數據文件,如果該數據文件中已有數據,刪除會導致表空間數據的不完整,建議使用上述方法刪除。
首先,ALTER DATABASE DATAFILE '***.DBF' OFFLINE DROP,這個命令用來將該數據文件從邏輯上刪除,此時該文件的online_status為recover狀態
SQL> SELECT file_id, file_name, status, online_status FROM Dba_Data_Files; FILE_ID FILE_NAME STATUS ONLINE_STATUS ---------- -------------------------------------------------------------------------------- --------- ------------- 4 D:\ORADATA\ORCL\USERS01.DBF AVAILABLE ONLINE 3 D:\ORADATA\ORCL\UNDOTBS01.DBF AVAILABLE ONLINE 2 D:\ORADATA\ORCL\SYSAUX01.DBF AVAILABLE ONLINE 1 D:\ORADATA\ORCL\SYSTEM01.DBF AVAILABLE SYSTEM 5 D:\ORADATA\USER_DATAFILES\TS_CG01.DBF AVAILABLE ONLINE 6 D:\ORADATA\USER_DATAFILES\TS_CG02.DBF AVAILABLE RECOVER 6 rows selected
然后直接從file$基表中把這個文件刪除(可能需要重建數據文件)
SQL> select file#,status$ from file$; FILE# STATUS$ ---------- ---------- 1 2 2 2 3 2 4 2 5 2 6 2 6 rows selected SQL> delete file$ where file# = 6; 1 row deleted SQL> commit; Commit complete SQL> select file#,status$ from file$; FILE# STATUS$ ---------- ---------- 1 2 2 2 3 2 4 2 5 2
重啟數據庫
SQL> shutdown immediate; 數據庫已經關閉。 已經卸載數據庫。 ORACLE 例程已經關閉。 SQL> startup ORACLE 例程已經啟動。 Total System Global Area 5060792320 bytes Fixed Size 2289960 bytes Variable Size 3355447000 bytes Database Buffers 1694498816 bytes Redo Buffers 8556544 bytes 數據庫裝載完畢。 數據庫已經打開。 SQL> select file#, status$ from file$; FILE# STATUS$ ---------- ---------- 1 2 2 2 3 2 4 2 5 2 SQL> SELECT file_id, file_name, status, online_status FROM Dba_Data_Files; FILE_ID FILE_NAME STATUS ONLINE_STATUS ---------- -------------------------------------------------------------------------------- --------- ------------- 4 D:\ORADATA\ORCL\USERS01.DBF AVAILABLE ONLINE 3 D:\ORADATA\ORCL\UNDOTBS01.DBF AVAILABLE ONLINE 2 D:\ORADATA\ORCL\SYSAUX01.DBF AVAILABLE ONLINE 1 D:\ORADATA\ORCL\SYSTEM01.DBF AVAILABLE SYSTEM 5 D:\ORADATA\USER_DATAFILES\TS_CG01.DBF AVAILABLE ONLINE
可以看到online_status為recover的數據文件6已經刪掉,這時候就可以去操作系統中刪除該數據文件了。
如果重啟數據庫失敗,並且報錯ORA-01207,需要重建控制文件(LZ並沒有遇到,沒法演示)
可以參考 https://www.cnblogs.com/jyzhao/p/9075427.html
補充:
樓主后面發現在v$datafile中還是有這個數據文件,雖然不影響,但是作為強迫症患者的樓主還是決定把它去掉;
SQL> select file#, name, status from v$datafile; FILE# NAME STATUS ---------- -------------------------------------------------------------------------------- ------- 1 D:\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 2 D:\ORADATA\ORCL\SYSAUX01.DBF ONLINE 3 D:\ORADATA\ORCL\UNDOTBS01.DBF ONLINE 4 D:\ORADATA\ORCL\USERS01.DBF ONLINE 5 D:\ORADATA\USER_DATAFILES\TS_CG01.DBF ONLINE 6 D:\ORADATA\USER_DATAFILES\TS_CG02.DBF RECOVER
解決的辦法是還是重建控制文件
-- 備份控制文件 SQL> alter database backup controlfile to trace as 'd:\oradata\ctl.sql'; SQL> shutdown immediate; -- nomount狀態 SQL> startup nomount; -- 重建控制文件 SQL> @D:\oradata\CTL.SQL SQL> ALTER DATABASE OPEN; SQL> select file#, name, status from v$datafile; FILE# NAME STATUS ---------- -------------------------------------------------------------------------------- ------- 1 D:\ORADATA\ORCL\SYSTEM01.DBF SYSTEM 2 D:\ORADATA\ORCL\SYSAUX01.DBF ONLINE 3 D:\ORADATA\ORCL\UNDOTBS01.DBF ONLINE 4 D:\ORADATA\ORCL\USERS01.DBF ONLINE 5 D:\ORADATA\USER_DATAFILES\TS_CG01.DBF ONLINE
此時v$datafile視圖中就沒有 file#=6 記錄了。