欢迎光临
我们一直在努力

User managed recovery

场景:归档模式下的数据库恢复

完全恢复(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

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

oracle