你试试看 当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.如果表上存在索引,则要重建表上的索引
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.如果表上存在索引,则要重建表上的索引
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
> 如果有其他问题或错误提示请通知我!
如果是那以前有system tablespace的备份没有?system不同于其他的表空间吧
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;
无法查询到错误的数据块。
我直接按出错块块条件查询:
SELECT * FROM dba_extents
WHERE file_id = 4
AND block_id<1301+blcoks
没有任何数据
然后查询
SELECT * FROM dba_extents
WHERE file_id = 4
AND block_id>=1301+blcoks
发现最小的块号为1310所以不知道坏块是在哪个对象上。
从报错信息来看ORA-01110:data file 1: 'O:\DB\DBFILE\SYSTEM.ORA'
是系统表空间的错误,而且我查找损坏的块号也找不到
所以我怀疑是系统表空间损坏。
如果不用exp/imp的方法,有没有其他的方法修复