12
返回列表 发新帖
楼主: gonghua

[精华] oracle 一个表中有block错误后如何恢复呢

[复制链接]
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
11#
发表于 2002-6-20 15:46 | 只看该作者
呢发现丢失什么数据了吗?

错误block 中的数据应该全部丢失的

使用道具 举报

回复
论坛徽章:
0
12#
发表于 2003-3-29 14:35 | 只看该作者
数据块及其中数据的挽救
现象:执行ORACLE操作时出现ORA-01578错误
分析:ORA-1578错误是当ORACLE认为一个数据块可能被破坏而发生的,通常引起该错误的原因有以下几种:
I/O的硬件或firmware损坏
操作系统I/O或cache故障
内存或页交换出错
部分数据文件被覆盖
试图访问未格式化块
磁盘修复
其他原因
解决步骤:
查看log以及trace文件,检查是否有其他错误发生
定位错误:
sql>select * from v$datafile where file#=<F>;
sql>select owner,segment_name,segment_type from dba_extents where file_id=<F> and <B> between block_id and block_id+blocks-1;
基于返回的segment_type:
segment类型为temporary或cache或无返回值,检查SQL语句是否正确。
segment类型为rollback segment,则数据块需要恢复。
segment类型为index,检查其所在的表。重建索引即可。
sql> select owner,table_name from dba_tables where cluster_name = name_of_segment
仍然出现1578错误,数据库需要恢复。
segment类型为表,拯救表中的数据。
分析一个实体是否有永久性数据破坏
sql> analyze table table.name validate structure cascade;
sql> analyze table clustername validate structure cascade;
硬件错误的恢复
数据库运行在ARCHIVE模式下
OFFLINE相应的数据文件
拷贝备份的数据文件
rename the datafile to new location
recover the datafile using archive log
online数据文件
数据库运行在非ARCHIVE模式下
OFFLINE相应数据文件
拷贝备份的数据文件,rename the datafile and online it
拯救表中数据
例如:sql>select * from bigemp;
ERROR:ORA-01578: ORACLE DATA block corrupted (file#8,block#8147) ORA-00110: data file 8: ‘/oracle/usr714.dbf’ … … corrupt file id : 8=8(hex) corrupt block id : 8147=1fd3(hex) first rowid in the corrupt block: 0000.1fd3.0000.0008 last rowid in the corrupt block: 0000.1fd2.7fff.0008 first rowid affer this block: 0000.1fd4.0000.0008
sql > create table temp as select * from bigemp where 1=2;
sql > insert into temp select * from bigemp /*+rowid(bigemp) */ where rowid >=’0000.1fd4.0000.0008’;
sql > insert into temp select * from bigemp where rowid <=’0000.1fd2.7fff.0008’;
在ORACLE 7.1以前版本,rowid range scan不存在时,可以通过索引达到以上相同的目的。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表