数据库恢复原理探讨

数据库恢复原理的简单学习

数据库恢复太有意思,理解了原理,很多东西都变得容易多了,火候快到了

搞清楚数据库怎样用日志来做数据库恢复(这样才不会滥用命令,导致数据库根本没有办法恢复)

--数据库冷自动备份脚本

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;

文件已创建。

创建参数文件

[@more@]

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/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值