怎么刪除表空間對應的某一個數據文件


如果想要刪除表空間的數據文件,最好且最安全的辦法是,刪除表空間后重建

步驟如下:

  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 記錄了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM