场景:
- 你在os层面丢失了数据文件,并且没有相应的备份
- 数据库处于archivelog模式
- 从数据文件创建到目前所有的归档日志都完好
由于没有备份,数据库无法正常打开,除非将数据文件或表空间删除,这样就会造成数据的丢失
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
| 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
|
删除物理文件,模拟文件丢失
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
| [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 ….的方式,重建这个丢失的数据文件:
1 2 3
| SYS@xb> alter database create datafile 6;
数据库已更改。
|
使用归档日志和redo恢复datafile
1 2 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
|