先说一下常见的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管理的数据文件
1 2 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
|