归档模式(ARCHIVELOG)下数据库打开(open)状态下如何手工恢复表空间?
oracle数据库在open状态,如果非关键表空间损坏了,基于表空间的完全恢复本质上还是表空间对应的datafile的恢复
模拟非关键表空间损坏,数据库会保持于open状态,不会造成 Oracle 的崩溃
处理方法:只需针对损坏的的 tablespace 进行在线恢复操作,也就是说恢复操作时 数据库整体是 online 的,而局部表空间是 offline 的,数据库不需要 shutdown。
恢复表空间实验(删除了 tablespace 下的所有的 datafile)
0)准备工作
SQL> shutdown immediate
[oracle@oracle ORCL]$ cd /u01/app/oracle/oradata/orcl/
[oracle@oracle orcl]$ mkdir osbak2
[oracle@oracle orcl]$ cp *.dbf osbak2/
[oracle@oracle orcl]$ cp *.ctl osbak2/
SQL> startup
1)了解一下当前状态,有个 test_ts 表空间,
SQL> select a.file#,
a.TABLESPACE_NAME,
a.name,
a.checkpoint_change# dfh_scn,
b.checkpoint_change# ctrf_scn
from v$datafile_header a, v$datafile b
where a.file# = b.file#;
FILE# TABLESPACE_NAME NAME DFH_SCN CTRF_SCN
1 1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf 4031815 4031815
2 2 SYSAUX /u01/app/oracle/oradata/orcl/sysaux01.dbf 4031815 4031815
3 3 UNDOTBS1 /u01/app/oracle/oradata/orcl/undotbs01.dbf 4031815 4031815
4 4 USERS /u01/app/oracle/oradata/orcl/users01.dbf 4031815 4031815
5 5 RMAN_TS /u01/app/oracle/oradata/orcl/rmants.dbf 4031815 4031815
6 6 EXAMPLE /u01/app/oracle/oradata/orcl/example.dbf 4031815 4031815
7 7 TEST_TS /u01/app/oracle/oradata/orcl/test_ts.dbf 4031815 4031815
SQL> select * from test.test_tab;
ID
----------
3
1
2
4
2)模拟表空间test_ts损坏,数据库处于 open 下,直接删除表空间下的数据文件
[oracle@oracle orcl]$ cd /u01/app/oracle/oradata/orcl/
[oracle@oracle orcl]$ rm test_ts.dbf
3)查证该表空间上的表不可访问了
SQL> alter system flush buffer_cache; //清除 data buffer
SQL> conn / as sysdba //换个 session 登陆,访问 test.test_tab; 表,因内存里已清除了buffer 块,只好去做物理读,所以报错!
Connected.
SQL> select * from test.test_tab;
select * from test.test_tab
*
ERROR at line 1:
ORA-01116: error in opening database file 7
ORA-01110: data file 7: '/u01/app/oracle/oradata/orcl/test_ts.dbf'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
4)看看 scn 的情况
SQL> select a.file#,
a.TABLESPACE_NAME,
a.name,
a.checkpoint_change# dfh_scn,
b.checkpoint_change# ctrf_scn
from v$datafile_header a, v$datafile b
where a.file# = b.file#;
FILE# TABLESPACE_NAME NAME DFH_SCN CTRF_SCN
1 1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf 4031815 4031815
2 2 SYSAUX /u01/app/oracle/oradata/orcl/sysaux01.dbf 4031815 4031815
3 3 UNDOTBS1 /u01/app/oracle/oradata/orcl/undotbs01.dbf 4031815 4031815
4 4 USERS /u01/app/oracle/oradata/orcl/users01.dbf 4031815 4031815
5 5 RMAN_TS /u01/app/oracle/oradata/orcl/rmants.dbf 4031815 4031815
6 6 EXAMPLE /u01/app/oracle/oradata/orcl/example.dbf 4031815 4031815
7 7 0 4031815
5)表空间 offline
SQL> alter tablespace TEST_TS offline immediate; //immediate 使表空间能立即脱机,不等 Oracle 对任何数据文件做检查
6)数据库 open 下,使用备份还原这个表空间下的所有数据文件
[oracle@oracle orcl]$ cd /u01/app/oracle/oradata/orcl/
[oracle@oracle orcl]$ cp osbak2/test_ts.dbf ./
7)恢复 tablespace
SQL> recover tablespace TEST_TS;
Media recovery complete.
完成介质恢复。
8)使表空间 online
SQL> alter tablespace TEST_TS online; //注意:此时数据库状态一直是 open 的。
9) 验证
SQL> select * from test.test_tab;
ID
----------
3
1
2
4
SQL> select a.file#,
a.TABLESPACE_NAME,
a.name,
a.checkpoint_change# dfh_scn,
b.checkpoint_change# ctrf_scn
from v$datafile_header a, v$datafile b
where a.file# = b.file#;
FILE# TABLESPACE_NAME NAME DFH_SCN CTRF_SCN
1 1 SYSTEM /u01/app/oracle/oradata/orcl/system01.dbf 4031815 4031815
2 2 SYSAUX /u01/app/oracle/oradata/orcl/sysaux01.dbf 4031815 4031815
3 3 UNDOTBS1 /u01/app/oracle/oradata/orcl/undotbs01.dbf 4031815 4031815
4 4 USERS /u01/app/oracle/oradata/orcl/users01.dbf 4031815 4031815
5 5 RMAN_TS /u01/app/oracle/oradata/orcl/rmants.dbf 4031815 4031815
6 6 EXAMPLE /u01/app/oracle/oradata/orcl/example.dbf 4031815 4031815
7 7 TEST_TS /u01/app/oracle/oradata/orcl/test_ts.dbf 4034085 4034085