数据库恢复原理的简单学习
数据库恢复太有意思,理解了原理,很多东西都变得容易多了,火候快到了
搞清楚数据库怎样用日志来做数据库恢复(这样才不会滥用命令,导致数据库根本没有办法恢复)
--数据库冷自动备份脚本
select 'host copy ' || name || ' ' || name || '.bak;' backcmd
from (select name name
from v$datafile
union
select member name
from v$logfile
union
select name name from v$controlfile);
--数据库冷备份恢复脚本
select 'host copy ' || name || '.bak ' || name || ';' revrcmd
from (select name name
from v$datafile
union
select member name
from v$logfile
union
select name name from v$controlfile);
下面是恢复的时候遇到的问题,在恢复前我已经清空日志信息(alter database clear logfile group n;)
那为什么我在启动的时候还要用控制文件恢复呢并且基于取消恢复!
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 281018368 bytes
Fixed Size 1248552 bytes
Variable Size 142607064 bytes
Database Buffers 134217728 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-00338: 日志 1 (用于线程 1) 比控制文件更新
ORA-00312: 联机日志 1 线程 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG'
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01139: RESETLOGS 选项仅在不完全数据库恢复后有效
不可以直接启动要先做恢复
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 583012 (在 04/25/2009 23:52:50 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_1_%U_.ARC
ORA-00280: 更改 583012 (用于线程 1) 在序列 #1 中
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
数据库已更改。
SQL>
用控制文件的基于取消的恢复并没有恢复数据
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 281018368 bytes
Fixed Size 1248552 bytes
Variable Size 150995672 bytes
Database Buffers 125829120 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-00338: 日志 2 (用于线程 1) 比控制文件更新
ORA-00312: 联机日志 2 线程 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO02.LOG'
SQL> recover database using backup controlfile
ORA-00279: 更改 583578 (在 04/26/2009 00:09:38 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_2_%U_.ARC
ORA-00280: 更改 583578 (用于线程 1) 在序列 #2 中
指定日志: {=suggested | filename | AUTO | CANCEL}
D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG
ORA-00310: 归档日志包含序列 3; 要求序列 2
ORA-00334: 归档日志: 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG'
SQL> recover database using backup controlfile
ORA-00279: 更改 583578 (在 04/26/2009 00:09:38 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_2_%U_.ARC
ORA-00280: 更改 583578 (用于线程 1) 在序列 #2 中
指定日志: {=suggested | filename | AUTO | CANCEL}
D:ORACLEPRODUCT10.2.0ORADATAORCLREDO02.LOG
ORA-00279: 更改 583820 (在 04/26/2009 00:14:30 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_3_%U_.ARC
ORA-00280: 更改 583820 (用于线程 1) 在序列 #3 中
ORA-00278: 此恢复不再需要日志文件 'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO02.
LOG'
指定日志: {=suggested | filename | AUTO | CANCEL}
D:ORACLEPRODUCT10.2.0ORADATAORCLREDO03.LOG
已应用的日志。
完成介质恢复。
SQL> alter database open noresetlogs;
alter database open noresetlogs
*
第 1 行出现错误:
ORA-01588: 要打开数据库则必须使用 RESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
SQL>
上边总共讲两种恢复办法:一借助与日志文件恢复数据
要基于备份控制文件来恢复数据(时间点或者其他信息)
二不借助日志文件恢复数据
清空日志或者基于 恢复数据
上边的数据虽然恢复成功,但是在数据查询的时候,有ora01578的错误(应该怎么解决)
在恢复需要日志文件的时候要根据提示或者从最旧的开始恢复,直到恢复成功!
问题与总结:
==========================================
--问题?日志里有新的东西!恢复的时候可以恢复不!?
可以通过在线日志恢复,但是 ora-01578数据库块有问题的错误,数据恢复的时候出现逻辑错误
这个问题的答案是:数据库操作没有记录日志,所以数据无法恢复,数据库操作要注意没有日志的操作,
一定要发生在全备前!
--日志? 当用resetlogs打开数据库的时候,日志里的信息也会被更新,在没有打开数据库前,信息应该没变化
所以用resetlogs打开数据库后要做数据库的全备份,这个也是很多资料上怎样强调的(嘿嘿)
以上的分析都是要使用全冷备份来恢复数据
下面是一步一步缺少文件来做数据的恢复操作!
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 281018368 bytes
Fixed Size 1248552 bytes
Variable Size 180355800 bytes
Database Buffers 96468992 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
ORA-01122: 数据库文件 2 验证失败
ORA-01110: 数据文件 2: 'D:ORACLEPRODUCT10.2.0ORADATAORCLUNDOTBS01.DBF'
ORA-01207: 文件比控制文件更新 - 旧的控制文件
SQL> recover database using backup controlfile ;
ORA-00279: 更改 587150 (在 04/26/2009 01:30:41 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_1_%U_.ARC
ORA-00280: 更改 587150 (用于线程 1) 在序列 #1 中
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'
SQL> recover database using backup controlfile ;
ORA-00279: 更改 587150 (在 04/26/2009 01:30:41 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_1_%U_.ARC
ORA-00280: 更改 587150 (用于线程 1) 在序列 #1 中
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> recover database using backup controlfile ;
ORA-00279: 更改 587150 (在 04/26/2009 01:30:41 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG20
09_04_26O1_MF_1_1_%U_.ARC
ORA-00280: 更改 587150 (用于线程 1) 在序列 #1 中
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
介质恢复已取消。
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'
SQL>
问题的原因:数据库没有足够的日志用来做数据恢复!
恢复的流程:1,检查数据文件和控制文件的scn时候一样,如果控制文件的比较高,那么数据文件要恢复,反 之,要用基于备份的
控制文件恢复!
2,如果有日志的时候可以恢复,没有日志的时候需要前滚数据库
特殊关于日志的数据库恢复!
1,损坏的是非当前联机日志
alter database clear logfile group n;
alter database clear unarchived log group n;
alter database open;
利用重新创建日志的办法可以恢复数据库!
2,损坏当前有活动的联机日志
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-00313: 无法打开日志组 1 (用于线程 1) 的成员
ORA-00312: 联机日志 1 线程 1:
'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG'
ORA-27046: 文件大小不是逻辑块大小的倍数
OSD-04012: 文件大小不匹配 (OS 50630038)
在线活动日志损坏
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
第 1 行出现错误:
ORA-01624: 日志 1 是紧急恢复实例 orcl (线程 1) 所必需的
ORA-00312: 联机日志 1 线程 1:
'D:ORACLEPRODUCT10.2.0ORADATAORCLREDO01.LOG'
不允许重新创建日志文件
SQL> create pfile='d:lihj.ora' from spfile;
文件已创建。
创建参数文件
SQL> shutdown immediate
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount pfile='d:lihj.ora'
ORACLE 例程已经启动。
Total System Global Area 205520896 bytes
Fixed Size 1248116 bytes
Variable Size 71304332 bytes
Database Buffers 130023424 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> recover database until cancel;
ORA-00279: 更改 573358 (在 04/26/2009 09:02:32 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:ORACLEPRODUCT10.2.0FLASH_RECOVERY_AREAORCLARCHIVELOG2009_04_26O1_MF_1_
2_%U_.ARC
ORA-00280: 更改 573358 (用于线程 1) 在序列 #2 中
指定日志: {=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: 'D:ORACLEPRODUCT10.2.0ORADATAORCLSYSTEM01.DBF'
ORA-01112: 未启动介质恢复
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9879835/viewspace-1021300/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9879835/viewspace-1021300/