场景:
- 你在os层面丢失了数据文件,并且没有相应的备份
- 数据库处于archivelog模式
- 从数据文件创建到目前所有的归档日志都完好
由于没有备份,数据库无法正常打开,除非将数据文件或表空间删除,这样就会造成数据的丢失
| 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
 
 | SYS@xb> archive log list;数据库日志模式       存档模式
 自动存档         启用
 存档终点        /u01/arch
 最早的联机日志序列     121
 下一个存档日志序列   123
 当前日志序列         123
 
 SYS@xb> create tablespace tbs_ts datafile '/u01/app/oracle/oradata/xb/tbs_ts01.dbf' size 20m;
 
 表空间已创建。
 
 SYS@xb> create table tb_test (id number) tablespace tbs_ts;
 
 表已创建。
 
 SYS@xb> insert into tb_test values (1);
 
 已创建 1 行。
 
 SYS@xb> commit;
 
 提交完成。
 
 SYS@xb> select file_id,file_name from dba_data_files where tablespace_name='TBS_TS';
 
 FILE_ID FILE_NAME
 ---------- ----------------------------------------------------------------------
 6 /u01/app/oracle/oradata/xb/tbs_ts01.dbf
 
 | 
删除物理文件,模拟文件丢失
| 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
 
 | [oracle@xb xb]$ mv tbs_ts01.dbf tbs_ts01.dbf.bak
 SYS@xb> shutdown immediate;
 ORA-01116: 打开数据库文件 6 时出错
 ORA-01110: 数据文件 6: '/u01/app/oracle/oradata/xb/tbs_ts01.dbf'
 ORA-27041: 无法打开文件
 Linux-x86_64 Error: 2: No such file or directory
 Additional information: 3
 SYS@xb> select status from v$instance;
 
 STATUS
 ------------
 OPEN
 
 SYS@xb> shutdown abort;
 ORACLE 例程已经关闭。
 SYS@xb> startup mount
 ORACLE 例程已经启动。
 
 Total System Global Area  943669248 bytes
 Fixed Size          2258880 bytes
 Variable Size         666896448 bytes
 Database Buffers      268435456 bytes
 Redo Buffers            6078464 bytes
 数据库装载完毕。
 
 SYS@xb> select * from v$recover_file;
 
 FILE# ONLINE  ONLINE_ ERROR                                CHANGE# TIME
 ---------- ------- ------- ----------------------------------------------------------------- ---------- --------------
 6 ONLINE  ONLINE  FILE NOT FOUND                                 0
 
 
 | 
使用alter database create datafile <> as ….的方式,重建这个丢失的数据文件:
| 12
 3
 
 | SYS@xb> alter database create datafile 6;
 数据库已更改。
 
 | 
使用归档日志和redo恢复datafile
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | SYS@xb> recover datafile 6;完成介质恢复。
 SYS@xb> alter database open;
 
 数据库已更改。
 
 SYS@xb> select * from tb_test;
 
 ID
 ----------
 1
 
 |