归档模式下如何从备份中恢复受损的undo数据文件?
0.前提是提前做过数据文件备份
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#;
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
相关知识点:
在数据库处于mount 或 open 状态,需要进行recover datafile来完成一般数据文件恢复。
由于undo数据文件属于数据库关键文件,只能在 mount 状态下,通过进行recover datafile来完成 UNDO 数据文件恢复。
1) 模拟环境:
SQL> insert into test.test_tab values (1);
SQL> commit;
SQL> select * from test.test_tab;
ID
----------
1
SQL> delete from test.test_tab
删除但没有提交,系统保存老值在 UNDO 表空间里,其它会话的用户可以继续查到上述结果。
2)在 open 状态下删除 datafile
[oracle@timran ~]$ rm /u01/app/oracle/oradata/orcl/undotbs01.dbf
3)关闭数据库
SQL> shtudown abort
断电式的关闭后,数据库完全恢复时会做 UNDO 回滚。
4) 启动数据库 mount
SQL> startup
ORACLE instance started.
Total System Global Area 780824576 bytes
Fixed Size 2217424 bytes
Variable Size 536873520 bytes
Database Buffers 234881024 bytes
Redo Buffers 6852608 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/u01/app/oracle/oradata/orcl/undotbs01.dbf'
5)还原并恢复 UNDO 数据文件
[oracle@oracle orcl]$ cp osbak2/undotbs01.dbf ./
SQL> recover datafile 3;
完成介质恢复。
6)打开数据库(会完成 UNDO 表空间数据的回滚)
SQL> alter database open;
数据库已更改
7) 验证
SQL> select * from test.test_tab;
ID
----------
1