如果使用操作系统命令复制过参数文件,还原只要复制回去就行。
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;
先从自动备份中获取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命令,使数据库产生更多有价值的信息。
控制文件存在多个副本,存在没有损坏的副本。首先对所有的文件通过操作系统文件复制保持。
将损坏的文件替换成完好的文件,启动数据库。
数据库到nomount状态
RMAN> resotre controlfile from autobackup;
RMNA> mount database;
RMAN> recover database;
RMAN> alter database open resetlogs;
(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;
确认问题只和控制文件相关,如果数据文件损坏就需要不完全恢复。
恢复控制文件,加载到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;
如果实例没有崩溃使,则先关闭
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;
}
除了system表空间、undo_tablespace表空间、临时表空间和只读表空间,属于普通数据文件,损坏后最多导致用户数据不可访问,不会导致数据库异常。
启动时候发现普通数据文件不存在或者头部损坏,可以先让该文件下线,数据库能正常启动。
SQL> alter database datafile 5 offline;
SQL> alter database open;
如果数据库运行的时数据库文件头损坏,发生检查点的时候会强制将这个文件下线,此时重启能正常重启。
可以关闭实例进行恢复
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';
}
数据文件的头部损坏后,检查点要强制将文件下线,恢复这个文件的时候会报错。
采用启动实例到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';
}
只读文件损坏后,检查点不会对只读文件进行操作,实例不会崩溃,也不会强制下线。
和普通文件恢复的区别:只读状态不变的情况下,不需要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";