Chinaunix

标题: 如何查找损坏块,急!谢谢 [打印本页]

作者: liaolwj    时间: 2003-09-10 10:49
标题: 如何查找损坏块,急!谢谢
查找数据文件中已经损坏的block的utility是哪个?就是可以直接在c:>;下运行的exe
作者: liaolwj    时间: 2003-09-10 11:09
标题: 如何查找损坏块,急!谢谢
各位帮帮忙,谢谢
作者: debuger    时间: 2003-09-10 11:18
标题: 如何查找损坏块,急!谢谢
dbv
作者: liaolwj    时间: 2003-09-10 11:26
标题: 如何查找损坏块,急!谢谢
谢谢!
作者: liaolwj    时间: 2003-09-10 11:32
标题: 如何查找损坏块,急!谢谢
现在情况是SYSTEM01.DBF中有损坏的BLOCK,现在库打不开,OPEN时报1578错,该怎么办!
作者: binary    时间: 2003-09-10 12:36
标题: 如何查找损坏块,急!谢谢
这是从别的地方看到的一个方法,由于没有接触到这种情况,无法验证,你试试看

当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息:
ORA-01578: ORACLE data block corrupted (file # 7, block # <BLOCK>
ORA-01110: data file <AFN>;: '/oracle1/oradata/V920/oradata/V816/users01.dbf'

其中,<AFN>代表坏块所在数据文件的绝对文件号,<BLOCK>;代表坏块是数据文件上的第几个数据块
出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。
1.确定发生坏块的数据库对象
SELECT tablespace_name,
segment_type,
owner,
segment_name
FROM  dba_extents
WHERE  file_id = <AFN>;
AND <BLOCK>; between block_id AND block_id+blocks-1;
2.决定修复方法
如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建;
如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建;
如果有数据库的备份,则恢复数据库的方法来进行修复;
如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据坏上的记录取出来,然后对这个表进行重建。
3.用Oracle提供的DBMS_REPAIR包标记出坏块
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('<schema>;','<tablename>;');
4.使用Create table as select命令将表中其它块上的记录保存到另一张表上
create table corrupt_table_bak
as
select * from corrupt_table;
5.用DROP TABLE命令删除有坏块的表
drop table corrupt_table;
6.用alter table rename命令恢复原来的表
alter table corrupt_table_bak
rename to corrupt_table;
7.如果表上存在索引,则要重建表上的索引
作者: digitalunix    时间: 2003-09-10 12:50
标题: 如何查找损坏块,急!谢谢
system表空间坏,数据库都无法启动了,还是从备份中恢复吧。
作者: liaolwj    时间: 2003-09-10 13:20
标题: 如何查找损坏块,急!谢谢
现在是数据库OPEN时都不允许,数据又没有备份,所以说除了重建,还能有什么办法吗?
作者: liontiger    时间: 2003-09-10 14:17
标题: 如何查找损坏块,急!谢谢
把alert<SID>;贴出来
作者: liaolwj    时间: 2003-09-10 14:41
标题: 如何查找损坏块,急!谢谢
其中一部分
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1, block # 12051)
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'

***
Corrupt block relative dba: 0x00403b32 (file 1, block 15154)
Bad header found during buffer read
Data in bad block -
type: 48 format: 49 rdba: 0x31303700
last change scn: 0x076c.61730003 seq: 0x0 flg: 0x64
consistency value in tail: 0x31303000
check value in block header: 0x7165, computed block checksum: 0x27cd
spare1: 0x33, spare2: 0x3, spare3: 0x6575
***
Reread of rdba: 0x00403b32 (file 1, block 15154) found same corrupted data
Wed Sep 10 08:53:44 2003
SMON: disabling cache recovery
Wed Sep 10 08:53:45 2003
ORA-604 signalled during: alter database open...
Wed Sep 10 08:53:45 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'

Wed Sep 10 08:53:46 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'

Wed Sep 10 08:53:47 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'

Wed Sep 10 08:53:48 2003
Errors in file C:\oracle\admin\gdls2003\bdump\gdls2003SMON.TRC:
ORA-00376: file 1 cannot be read at this time
ORA-01110: data file 1: 'C:\ORACLE\ORADATA\GDLS2003\SYSTEM01.DBF'
作者: liaolwj    时间: 2003-09-10 16:50
标题: 如何查找损坏块,急!谢谢
各位对该问题还有没有更好的解决办法!
作者: deepblue    时间: 2003-09-12 17:32
提示: 作者被禁止或删除 内容自动屏蔽
作者: 白雪松    时间: 2003-09-16 10:04
标题: 如何查找损坏块,急!谢谢
你说的之中情况,多数是回滚段中坏块造成的,你可以试试下面的办法。


1、将数据关闭
>;     svrmgrl >;Shutdown abort
>;  
>;  2、修改初始化参数文件
>;     $ vi  $ORACLE_HOME/dbs/init< sid >;.ora
>;     添加以下参数
>;      rollback_segments=(system)
>;     _corrupted_rollback_segments=(r01,r02,r03,r04)
>;     _allow_resetlogs_corruption=ture
>;  
>;  3、重新装载数据库
>;  svrmgrl >;Startup mount
>;
>;  4、从数据库的控制文件中将回滚段表空间rbs的数据文件离线并去掉。
>;
>;    svrmgrl >;alter database datafile
>;   ‘##/##/rbs01.dbf’ offline drop;
>;    ---- 对数据库进行恢复。
>;    svrmgrl >;recover database using backup controlfile;
>;    ---- 此时屏幕上可能会出现:
>;
>;    ORA_00280 Change #### for thread# is in sequence#
>;    specify log:[< RET >; for suggested|AUTO|from logsource|cancel]
>;    输入 cancel(不要输入其他命令)
>;
>;    svrmgrl >;alter database open resetlogs;
>;  
>;  5、 重建新的回滚段
>;
>;    ---- 将旧回滚段及回滚表空间删除。
>;    svrmgrl >;alter rollback_segment r01 offline drop;
>;    svrmgrl >;alter rollback_segment r02 offline drop;
>;    svrmgrl >;alter rollback_segment r03 offline drop;
>;    svrmgrl >;alter rollback_segment r04 offline drop;
>;    svrmgrl >;drop tablespace rbs including contents;
>;    ---- 重建新的回滚表空间及回滚段。
>;  svrmgrl >;connect internal
>;  svrmgrl >;create rollback segment ro tablespace system;
>;  svrmgrl >;alter rollback segment ro online;
>;  svrmgrl >;create tablespace rbs datafile
>; ‘##/##/rbs01.dbf’ size ##k;
>;  svrmgrl >;create rollback segment r01 tablespace rbs;
>;  svrmgrl >;create rollback segment r02 tablespace rbs;
>;  svrmgrl >;create rollback segment r03 tablespace rbs;
>;  svrmgrl >;create rollback segment r04 tablespace rbs;
>;  svrmgrl >;alter rollback segment r01 online;
>;  svrmgrl >;alter rollback segment r02 online;
>;  svrmgrl >;alter rollback segment r03 online;
>;  svrmgrl >;alter rollback segment r04 online;
>;
>;
>;  svrmgrl >;Shutdown abort
>;  $  vi  $ORACLE_HOME/dbs/init< sid >;.ora
>;     rollback_segments=(r01,r02,r03,r04)
>;     将参数_corrupted_rollback_segment
>;           _allow_resetlogs_corruption=true去掉
>;  svrmgrl >;Startup normal
>; 如果有其他问题或错误提示请通知我!
作者: lsh0159    时间: 2005-06-03 23:26
标题: 如何查找损坏块,急!谢谢
你真幸运,碰一好人,这个得留着以背后用!




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2