最基本的,当然是用OS命令来做
备份:正常停数据库,拷贝datafile和controlfile+(online redo可以选),startup。
恢复:
分两个情况,一是备份后,redo log没被覆盖过,这时,进mount模式后,将损失了的datafile only拷贝回去,然后recover datafile file#后,alter database open,就可以了,可以做到完全恢复。
另外一个是绝大多数情况,redo已经被覆盖了,没法子,停数据库,将所有文件(datafile+controlfile)拷贝回去,启动数据库。如果先前备份了online redo,那么启动不会出错。
如果没备份online redo,拷贝回去的datafile+controlfile和redo是对不上号,启动会出错(ORA-00338: log 1 of thread 1 is more recent than control file)后进不了open,这个时候就比较麻烦了。
alter database clear logfile group 1 的语句可以清除掉非current的log,但是对current的log时清除不掉,直接报
ORA-01624: log 1 needed for crash recovery of thread 1。
由于没有任何其他备份,让current的redo log还原就很麻烦了。搞了好久,找到了一个未公开的参数_allow_resetlogs_corruption=TRUE。
操作方法如下
1. startup nomount
2.create pfile='/tmp/pfile.ora' from spfile;
3.再创建的pfile里面加上*._allow_resetlogs_corruption=TRUE;
4.再次startup mount pfile=' /tmp/pfile.ora'
5.今后show parameter _allow;看看是否设置上
6.recover database until cancel; 用cancel,这里会报错,无视。
7.alter database open resetlogs;这时就可以open了。
如果不设置_allow_resetlogs_corruption,7是open不了的。 这个方法针对current log丢失时又没备份时用。
看到这里,所以, NOARCHIVELOG下的手动备份还是建议将online redo也给备份一下。
另外,这里我也开始尝试重新create controlfile了,结果mount都不行了,直接
ORA-01079: ORACLE database was not properly created, operation aborted
没有评论:
发表评论