先说一下常见的offline drop 和offline之间的区别
Alter database datafile  offline
一般如下场景下会选择这种方式
- 离线备份数据文件
- 重命名或更换文件路径,必须要offline datafile或者tablespace
- 数据文件写入出现问题时,会自动offline这个datafile,当解决问题后得手动online
- 数据文件丢失或出错时,你必须手动offline才能open database
Alter database datafile  offline drop
这里的关键字_DROP_并不是真正删除文件,只是标记为不用了,可能未来会删除,数据文件仍然存在于数据字典中,如果你非要删除可以通过第三种方式
ALTER TABLESPACE … DROP DATAFILE 或 DROP TABLESPACE … INCLUDING CONTENTS AND DATAFILES
前者删除datafile也有不少限制
- 数据库必须为打开状态
- 数据datafile非空,你不能直接删除这个文件,必须要先移除对象或者直接删除这个datafile所在的表空间
- 不能删除表空间里的第一个文件或者唯一的一个文件,意味着不能删除bigfile tablespace下的数据文件
- 不能删除read-only的数据文件
- 不能删除system表空间下的数据文件
- 不能删除offline状态的locally managed tablespace管理的数据文件
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 
 | SYS@xb> alter database datafile 6 offline drop;
 数据库已更改。
 
 SYS@xb> select file#,status from v$datafile where file#=6;
 
 FILE# STATUS
 ---------- -------
 6 RECOVER
 
 SYS@xb> c/datafile/datafile_header
 1* select file#,status from v$datafile_header where file#=6
 SYS@xb> /
 
 FILE# STATUS
 ---------- -------
 6 OFFLINE
 
 SYS@xb> alter system switch logfile;
 
 系统已更改。
 
 SYS@xb> recover datafile 6;                                >>>>====这里涉及到recover操作,如果恢复的够快,redo未被覆盖则不需要归档,否则必须要archivelog模式下
 完成介质恢复。
 SYS@xb> select * from v$log;
 
 GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME     NEXT_CHANGE# NEXT_TIME
 ---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------- ------------ --------------
 1      1        125 1073741824    512      1 YES ACTIVE             1276783 23-10月-18   1278142 23-10月-18
 2      1        124 1073741824    512      1 YES INACTIVE           1255472 23-10月-18   1276783 23-10月-18
 3      1        126 1073741824    512      1 NO  CURRENT            1278142 23-10月-18       2.8147E+14
 
 SYS@xb> select file#,status from v$datafile where file#=6;
 
 FILE# STATUS
 ---------- -------
 6 OFFLINE
 
 SYS@xb> select file#,status from v$datafile_header where file#=6;
 
 FILE# STATUS
 ---------- -------
 6 OFFLINE
 
 SYS@xb> alter database datafile 6 online;
 
 数据库已更改。
 
 SYS@xb> select file#,status from v$datafile_header where file#=6;
 
 FILE# STATUS
 ---------- -------
 6 ONLINE
 
 SYS@xb> select file#,status from v$datafile where file#=6;
 
 FILE# STATUS
 ---------- -------
 6 ONLINE
 
 |