Oracle11g:数据库恢复总结

一、参数文件

1、操作系统文件复制

如果使用操作系统命令复制过参数文件,还原只要复制回去就行。

2、备份集恢复

rman恢复需要启动实例,SQL*PLUS在没有参数文件的情况下不能打开,但是rman可以在没有参数文件的情况下,通过内置的参数打开。

RMAN> startup nomount;

手动备份恢复

RMAN> restore spfile from '/xxx/xxx/xxxx/xxxx';

如果使用了快速恢复区,自动备份,可以使用以下命令

RMAN> restore spfile from autobackup db_name=orcl  db_recovery_file_dest='/xxx/xxxx/';

如果没有使用快速恢复区,控制文件保存在dbs目录下。可以通过指定DBID

RMAN> set dbid 1112231231231;

RMAN> restore spfile from autobackup;

启动实例

SQL> startup force;

3、实例没有关闭的情况下恢复

先从自动备份中获取spfile到临时目录,然后通过操作系统命令进行替换。

RMAN> restore spfile to '/home/oracle/spfileorcl.ora' from autobackup;

$ cp /home/oracle/spfileorcl.ora $ORACLE_HOME/dbs

 

二、控制文件

数据库访问控制文件,读取参数文件中配置的第一个控制文件,写所有的控制文件。所以,第一个控制文件出问题,读写操作都会出问题。其他控制文件出问题,只有写操作才会出错。

数据库启动时候,控制文件损坏,会报ORA-00205(识别控制文件有误)或者ORA-00227(控制文件存在坏块)。

实例open,控制文件损坏,但是不能保证所有功能正常。直到CKPT发起检查点的时候,实例最终被强制关闭。遇到这种情况,立刻提交所有操作commit,然后等实例自动关闭或者shutdown abort。

建议开启自动备份,在数据库物理结构发生变化的时候都会自动备份。

RMAN> configure controlfile autobackup on;

控制文件恢复的时候,虽然可以通过start nomount命令启动,但是建议以startup命令,使数据库产生更多有价值的信息。

1、在线副本

控制文件存在多个副本,存在没有损坏的副本。首先对所有的文件通过操作系统文件复制保持。

将损坏的文件替换成完好的文件,启动数据库。

2、结构备份,数据库结构相同,但是检查点和SCN等信息比较旧,这里就是开启了控制文件自动备份。

数据库到nomount状态

RMAN> resotre controlfile from autobackup;

RMNA> mount database;

RMAN> recover database;

RMAN> alter database open resetlogs;

3、历史备份,所有的信息都不一致

(1)备份了控制文件后,创建了添加了表空间,添加日志组,删除日志组。

这种recover可以自动修复。

RMAN> resotre controlfile from '/xxx/xxx';

RMAN> mount database;

RMAN> recover database;

RMAN> alter database open resetlogs;

(2)备份控制文件后,删除表空间

RMAN> resotre controlfile from '/xxx/xxx';

RMAN> mount database;

SQL> alter database datafile 6 offline;                     #将删除表空间的文件都下线

SQL> recover database using backup controlfile;    #输入AUTO

可能再次报错,提示没有归档日志,其实是某个还没来得及归档的在线日志,通过查询可以得知是某个在线日志。再次执行命令

SQL> recover database using backup controlfile;    #输入查询出来的在线日志路径

或者使用跳过表空间的方式

RMAN> recover database skip tablespace examples;

RMAN> alter database open resetlogs;

4、缺失归档日志

确认问题只和控制文件相关,如果数据文件损坏就需要不完全恢复。

恢复控制文件,加载到mount状态后

RMAN> recover database;

报错,显示找不到归档。

SQL> alter database backup controlfile to trace;

SQL> select value from v$diag_info where name='Default Trace File';

SQL> startup force nomount;

在追踪文件中找到NORESETLOGS的创建语句,并执行后,数据库已经到mount状态。

RMAN> recover database;

再次报错,提示找不到归档日志,但是此时的归档日志和上面不一样,这是因为恢复只查找归档日志,无视了在线日志。

SQL> recover database using backup contrilfile;    #输入在线日志路径

SQL> alter database open resetlogs;

SQL> alter tablespace temp add tempfile '/xxx/xxx/xxx/xx.dbf' reuse;

 

三、数据文件

1、关键数据文件损坏(system表空间和撤销表空间),一定是在mount状态下恢复。

如果实例没有崩溃使,则先关闭

SQL> shutdown abort;

关键数据文件损坏可能登陆不了数据库,需要手动关闭进程。

kill -9 `ps aux |grep ora_smon_orcl |grep -v grep | wak '{pring $2}'`

恢复system数据文件

run{

startup mount;

restore datafile 1;

recover database;

alter database open;

}

2、普通数据文件损坏,可以在open状态下恢复

除了system表空间、undo_tablespace表空间、临时表空间和只读表空间,属于普通数据文件,损坏后最多导致用户数据不可访问,不会导致数据库异常。

启动时候发现普通数据文件不存在或者头部损坏,可以先让该文件下线,数据库能正常启动。

SQL> alter database datafile 5 offline;

SQL> alter database open;

如果数据库运行的时数据库文件头损坏,发生检查点的时候会强制将这个文件下线,此时重启能正常重启。

(1)如果数据文件没有强制下线

可以关闭实例进行恢复

run{

shutdown abort;

startup mount;

restore datafile ''/xxx/xxxx/dd.dbf;

recover database;

alter database open;

}

也可以在实例启动的时候进行恢复

run{

sql 'alter database datafile 5 offline';

restore datafile 5;

recover datafile 5;

sql 'alter database datafile 5 online'

}

如果实例已经关闭,提高数据库可用性的情况下,先启动数据库实例

run{

startup mount;

sql 'alter database datafile 5 offline';

alter database open;

restore datafile 5;

recover datafile 5;

sql 'alter database datafile 5 online';

}

(2)数据文件被强制下线

数据文件的头部损坏后,检查点要强制将文件下线,恢复这个文件的时候会报错。

采用启动实例到mount,然后使数据文件在线,然后恢复的方式。

run{

shutdown abort;

startup mount;

sql 'alter database datafile 5 online';

resotre datafile 5;

recover database;

alter database open;

}

(推荐)删除数据文件,在数据库open的状态下恢复。

rm -rf /eee/ddd/xxx.dbf

run{

sql 'alter database datafile 5 offline';

restore datafile 5;

recover datafile 5;

sql 'alter database datafile 5 online';

}

3、只读数据文件

只读文件损坏后,检查点不会对只读文件进行操作,实例不会崩溃,也不会强制下线。

和普通文件恢复的区别:只读状态不变的情况下,不需要recover,在修改只读状态的情况下,可能需要两次recover。

在只读表空间备份了控制和数据文件,后来改为读写,数据文件和控制文件损坏了,没有最新的备份。重启数据库到nomount状态

从备份中还原控制文件,这时候控制文件记录的表空间为只读。

启动到mount,还原数据文件。

第一次recover database恢复了控制文件,但是此时表空间记录为只读,所以忽略了。

第二次recover database通过最新的控制文件恢复表空间。

 

四、不完全数据库恢复

归档或者active的在线日志、current的在线日志丢失或者损坏。

认为操作错误想要回退到某个时间点。

恢复到指定的日志

run{

startu force mount;

set until sequence 100;

restore database;

recover database;

alter database open resetlogs;

}

到指定时间

set until time "sysdate-interval '10' minute";

你可能感兴趣的:(Oracle,DBA)