场景:归档模式下的数据库恢复
完全恢复(complete)(data file 丢失、损坏)
需要恢复的datafile 离线
仅需要restore丢失或损坏的datafile
不需要恢复control file,redo log,parameter file;
Recover datafile
有点:只需要恢复丢失的文件,可恢复到出错前的时刻
限制:必须有所有的归档日志
实验:1、查看数据库是否处于归档模式(如果没有,需要在mount状态下alter database archivelog)
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /opt/app/oracle/db/dbs/arch
Oldest online log sequence 6
Next log sequence to archive 8
Current log sequence 8
注意:如果设置归档日志的路径,但是OS路径没有创建,那么归档日志会保存在最后能找到的路径,并且不存在的路径名会变成文件名加在文件名开始。
2、查看相关views 获取相关信息
v$recover_file |
哪些datafile需要recovery,信息来自控制文件,如果控制文件不是最新的可能该信息不准确 |
v$archived_log |
列出哪些归档了哪些日志 |
v$recovery_log |
列出哪些需要recovery 的redo logfile |
3、命令
mount状态下:
Sql>recover database
或者:Sql>recover datafile ‘/opt/app/oracle/oradata/users.dbf’
open状态下:
Sql>recover tablespace users
或者:Sql>recover datafile ‘/opt/app/oracle/oradata/users.dbf’
实验设计
1、添加实验的tablespace 和datafile
SQL> create tablespace reclab datafile ‘/opt/app/oracle/oradata/sqllab/reclab01.dbf’ size 100M extent management local uniform segment space management auto;
2、创建实验tablaspace、用户、表和数据
SQL> create tablespace reclab datafile ‘/opt/app/oracle/oradata/sqllab/reclab01.dbf’ size 100M extent management local uniform segment space management auto;
SQL> create user tangkai identified by oracle default tablespace reclab;
SQL> grant connect,resource to tangkai;
SQL> conn tangkai/oracle
SQL> create table test(id int, name varchar2(10));
SQL> commit;
SQL> insert into test values(0,’test001′);
SQL> select * from test;
ID NAME
———- ———————————————-
0 test001
3、备份
冷备:数据库shutdown 后将数据库的文件拷贝到其他目录
[oracle@lab01 sqllab]$ cp -r * ../cold
热备(datafile):(备份前在test表中插入一条数据,区别冷备)
SQL> alter tablespace reclab begin backup;
[oracle@lab01 sqllab]$ cp reclab01.dbf ../hot/
SQL> alter tablespace reclab end backup;
做完热备后,再次在test表中插入一条数据,并且执行日志切换;
4、模拟损坏情况及恢复
4.1、丢失datafile,其他文件正常,数据库shutdown 后利用冷备的datafile恢复
[oracle@lab01 sqllab]$ rm -f *.dbf
SQL> shutdown abort
oracle@lab01 cold]$ cp *.dbf ../sqllab/
SQL> set autorecovery off;
SQL> select * from v$recover_file;
SQL> recover database;
SQL> select * from tangkai.test;
数据全部恢复出来,说明恢复有效。
此方式需要关闭数据库,而且需要系统表空间没有损坏,redo信息和archive信息完整。
4.2、数据库处于open状态下,需要做恢复
(只能是普通表空间出错),删除文件前test插入数据,commit
[oracle@lab01 sqllab]$ rm reclab01.dbf
删除文件后,在test表中插入数据并commit,此时数据库还没有检测到数据文件丢失,commit信息还保存在内存中,需要日志切换checkpoint时写入磁盘文件才会报错(可能导致数据库意外关闭,数据库如果重新启动按照4.1方式)
[oracle@lab01 sqllab]$ scp ../hot/reclab01.dbf .
SQL> alter database datafile 6 offline;
SQL> recover datafile 6;
SQL> alter database datafile 6 online;
4.3、没有备份的情况下
没有备份的归档模式下,如果一个tablespace建立以后所有的归档日志都存在的情况下可通过新建datafile恢复数据
SQL> alter database create datafile ‘/opt/app/oracle/oradata/sqllab/test001.dbf’;
SQL> recover datafile 7;
SQL> alter database open;
未经允许不得转载:SRE空间 » User managed recovery
评论前必须登录!
注册