共计 5205 个字符,预计需要花费 14 分钟才能阅读完成。
一、测试环境
数据库版本是 Oracle 11gR2,在做完一份完全备份之后,关机,做一份快照,每一次开机之后都执行数次 alter system switch logfile 以产生归档日志。
之后的测试都是基于这么一个完全备份来恢复。
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO ‘/backup/%F’;
backup incremental level 0 format ‘/backup/%T_%f’ database;
二、数据文件丢失的测试
2.1 丢失所有数据文件的测试
1. 启动数据库至 mount 状态
startup mount;
2. 启动 RMAN
[oracle@myCentOS orcl]$ rman target /
3. 还原数据库
RMAN>restore database;
4. 恢复数据库
RMAN>recover database;
恢复完成之后,查看各个文件的状态是否正常。
select file_name,file_id,status from dba_data_files;
– 查看临时表空间文件
select status,enabled, name, bytes/1024/1024 file_size
from v$tempfile;
select file_name from dba_temp_files;
2.2 丢失单个数据文件的测试
2.2.1 非关键数据文件丢失
以丢失数据文件’/u01/app/oracle/oradata/orcl/users01.dbf’为例,当数据库处于未崩溃状态时:
1)alter database datafile’/u01/app/oracle/oradata/orcl/users01.dbf’ offline;
2)RMAN 模式下 restore/recover 数据文件
restore datafile ‘/u01/app/oracle/oradata/orcl/users01.dbf’;
recover datafile ‘/u01/app/oracle/oradata/orcl/users01.dbf’
3)数据文件上线
alter database datafile’/u01/app/oracle/oradata/orcl/users01.dbf’ online;
当数据库因意外而崩溃时:
[oracle@mycentos ~]$ sqlplus /nolog
SQL> conn /as sysdba
SQL> startup;
ORA-01157: cannot identify/lock data file 4 – see DBWR trace file
ORA-01110: data file 4: ‘/u01/app/oracle/oradata/orcl/users01.dbf’
– 可以直接先启动至 mount 状态
启动 RMAN:
restore datafile ‘/u01/app/oracle/oradata/orcl/users01.dbf’;
recover datafile ‘/u01/app/oracle/oradata/orcl/users01.dbf’
alter database datafile’/u01/app/oracle/oradata/orcl/users01.dbf’ online;
alter database open;
非关键数据文件丢失后,先使数据文件处于 offline 状态,在恢复数据文件之后,再将其转成 online 状态。
2.2.2 关键数据文件丢失
[oracle@mycentos orcl]$ rm system01.dbf;
关闭数据库后,过程与崩溃后恢复数据非关键数据文件的过程一样。
三、日志文件丢失的测试
当前的配置是所有的 group 都只有一个成员,在 group1 中新增一个成员,使其变成 2 个成员,其他 group 仍然只有一个成员。
3.1 丢失 inactive 日志文件的恢复测试
删除第二个日志组,并且模拟数据库崩溃
在未关机状态下,数据库能继续运行,但是日志文件中会有告警信息。
shutdown abort;
startup mount;
alter database clear unarchived logfile group 2; #此命令会重建第二组日志文件
alter database open;
删除第一组日志的一个成员:
rm redo01.log
shutdown abort;
startup;
数据库可以正常打开。redo01.log 的状态变成了 INVALID.
使用 alter database clear unarchived logfile group 1; 重建日志文件
3.2 丢失 CURRENT 日志文件的恢复测试
当第一组为 CURRENT 或 actives 时,删除第一组日志的一个成员,数据库可以正常打开。
第三组为 CURRENT,并且只有一个成员时,删除第三组的日志。
startup 命令报错,并且在执行 clear unarchived logfile 时会报
ORA-01624: log 3 needed for crash recovery of instance orcl (thread 1) 的错误。
alter database open;# 会报 ORA-00313 的错误
因此需要用其他方式来打开数据库:
方法一:使用不完全恢复:
RMAN>RESTORE DATABASE;
RMAN>RECOVER DATABASE UNTIL TIME ‘SYSDATE-5/1440’;# 具体的时间可以看归档日志的生成时间
SQL>alter database open resetlogs;
方法二:直接使用不完全恢复,不用 RMAN。
SQL>alter system set “_allow_resetlogs_corruption”=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database until cancel;
SQL> alter database open resetlogs;
3.3 丢失归档日志文件, 并且需要恢复数据库。
使用 RMAN 不完全恢复至某一个时间点。
3.4 丢失所有联机重做日志文件的测试
参照丢 3.2 失 CURRENT 日志文件的恢复测试
四、丢失控制文件的测试
4.1 当控制文件有多个副本时,删除其中一个控制文件,模拟数据库崩溃的情况。
在数据库关闭的情况下,将副本复制成已删除的控制文件的名字,能正常打开数据库。
4.2 控制文件所有成员丢失,模拟数据库崩溃
4.2.1 有备份控制文件的情况下,使用备份的控制文件恢复数据库。
SQL>startup nomount;
RMAN>set dbid 1443678834# 可以查看备份的控制文件获得 DBID
RMAN>restore controlfile from ‘/backup/c-1443678834-20160723-00’;
SQL>alter system set “_allow_resetlogs_corruption”=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
#输入 AUTO,应用归档日志后,再输入一遍 recover database ……., 输入 online redo 的路径 + 名称
SQL> alter database open resetlogs;# 数据不会丢失
#有需要的话要重建临时表空间
#ALTER TABLESPACE TEMP ADD TEMPFILE ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ SIZE 1G;
4.2.2 没有备份的控制文件,则需要重建控制文件。
在删除控制文件之前,获取控制文件的创建语句:
1)alter database backup controlfile to trace as ‘/home/oracle/crontol_trace.trc’;
2)从 /home/oracle/crontol_trace.trc 文件中获得如下语句:
CREATE CONTROLFILE REUSE DATABASE “ORCL” RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ‘/u01/app/oracle/oradata/orcl/redo01.log’ SIZE 50M BLOCKSIZE 512,
GROUP 2 ‘/u01/app/oracle/oradata/orcl/redo02.log’ SIZE 50M BLOCKSIZE 512,
GROUP 3 ‘/u01/app/oracle/oradata/orcl/redo03.log’ SIZE 50M BLOCKSIZE 512,
GROUP 4 ‘/u01/app/oracle/oradata/orcl/redo_04.log’ SIZE 50M BLOCKSIZE 512
DATAFILE
‘/u01/app/oracle/oradata/orcl/system01.dbf’,
‘/u01/app/oracle/oradata/orcl/sysaux01.dbf’,
‘/u01/app/oracle/oradata/orcl/undotbs01.dbf’,
‘/u01/app/oracle/oradata/orcl/users01.dbf’,
‘/u01/app/oracle/oradata/orcl/test_01.dbf’,
‘/u01/app/oracle/oradata/orcl/test_02.dbf’
CHARACTER SET ZHS16GBK;
如果没有使用 1)中的语句获取创建语句,也可以根据实际情况重建控制文件。
删除所有的控制文件,并且模拟数据库崩溃。
恢复的过程如下:
1)startup nomount;
2)执行创建控制文件的语句,直接复制语句或放在脚本里均可。
3)之后执行:
SQL>alter system set “_allow_resetlogs_corruption”=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
#输入 AUTO,应用归档日志后,再输入一遍 recover database ……., 输入 online redo 的路径 + 名称
SQL> alter database open resetlogs;# 数据不会丢失
重建临时表空间
ALTER TABLESPACE TEMP ADD TEMPFILE ‘/u01/app/oracle/oradata/orcl/temp01.dbf’ SIZE 1G;
五、在只有一份备份的情况下,其余文件均丢失后,打开数据库
在数据库崩溃之后:
1)启动数据库至 nomount, 开启 RMAN 并设置 dbid
SQL>startup nomount;
RMAN>set dbid 1443678834
2)还原控制文件
RMAN>restore controlfile from ‘/backup/c-1443678834-20160723-00’;
SQL>alter database mount;
3)还原数据文件
RMAN>restore database;
4)执行不完全恢复:
SQL>alter system set “_allow_resetlogs_corruption”=true scope=spfile;
SQL>shutdown abort;
SQL>startup mount;
SQL> recover database using backup controlfile until cancel;
因为日志文件、归档日志文件都已经被删除,所以选择 cancel 不执行恢复。
SQL> alter database open resetlogs;
之后检查各文件是否正常。
六、总结
从模拟在线日志文件、控制文件丢失的过程中可以发现,当这些文件有副本时,可以很快地打开数据库,从而降低恢复数据库的难度。
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-08/134074.htm