归档模式下恢复offline drop的datafile

先说一下常见的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

归档模式下恢复offline drop的datafile
https://www.xbdba.com/2018/10/26/recover-offline-drop-datafile-in-archivelog/
作者
xbdba
发布于
2018年10月26日
许可协议