ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle坏块处理相关

Oracle坏块处理相关

原创 Linux操作系统 作者:shilei1 时间:2012-04-06 13:40:56 0 删除 编辑
dbv  file=/data/d2/sitdata/apps_ts_tx_data.326.760209233   blocksize=8192 检查那几个快坏了。
SELECT  *  ---tablespace_name, segment_type, owner, segment_name, partition_name
FROM dba_extents
WHERE file_id = 89 and  799871  between block_id AND block_id + blocks - 1;
select * from dba_lobs where SEGMENT_NAME='SYS_LOB0000129851C00019$$';
select  BYTES/1024/1024/1024  from dba_segments 
where segment_name = 'FND_LOG_MESSAGES'  and segment_type = 'TABLE' ;
RMAN> blockrecover  datafile 89  block  799864, 799871  ;  如果有备份 
没有办法恢复就得使用 exp,imp :
SQL>create directory dmpdir as  '/data/d1'; 
SQL>grant read,write on directory  dmpdir  to applsys ; 
$ expdp  system/xxxx   directory=dmpdir  dumpfile=FND_LOG_MESSAGES.dmp  tables=applsys.FND_LOG_MESSAGES 
$ impdp  system/xxxx  directory=dmpdir  dumpfile=FND_LOG_MESSAGES.dmp  tables=applsys.FND_LOG_MESSAGES 
Rename 表 。
----------------------------------------------

 今天下午,迁移数据完成后,再给用户做rman备份,备份到一半后,报

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on t2 channel at 06/14/2009 15:49:09
ORA-19566: exceeded limit of 0 corrupt blocks for file /ora9idata02/oradata/stjj/ntiis_01.dbf

 

检查日志中发现以下表空间文件号和块号

Corrupt block relative dba: 0x1a43d4e3 (file 24, block 359808)
Fractured block found during backing up datafile
Data in bad block -
 type: 0 format: 0 rdba: 0x00000000
 last change scn: 0x0000.00000000 seq: 0x0 flg: 0x00
 consistency value in tail: 0x00000000
 check value in block header: 0x0, block checksum disabled
 spare1: 0x0, spare2: 0x0, spare3: 0x0
***

然后用dbv检查发现至少有四,五个坏块

dbv file=/ora9idata02/oradata/stjj/ntiis_01.dbf  blocksize=8192

然后用以下sql检查,看是什么对象损坏

select * from dba_extents where file_id=24 and 359808 between block_id and block_id+blocks-1;
通过检查没有任何行输出
 如果所有的坏块执行这个sql检查出来的结果都是返回0行,说明没有对象在坏块。
因为数据刚导完,应用还在测试,这个用户下的表没数据更新,
而且这个表空间只属于这个用户,就采取删除,重建表空间的方法和数据重新导入
 然后用rman备份数据正常
-------------------------------
首先需要找到坏块的ID(可以运行dbverify实现),假设为,假定文件编码为。运行下面的查询查找段名: 
SELECT segment_name,segment_type,extent_id,block_id, blocks 
from dba_extents t 
where 
file_id =  
AND between block_id and (block_id + blocks - 1) 
一旦找到坏段名称,若段是一个表,则最好建立一个临时表,存放好的数据。若段是索引,则删除它,再重建。 
create table good_table 
as 
select from bad_table where rowid not in 
(select rowid 
from bad_table where substr(rowid,10,6) =
在这里要注意8以前的受限ROWID与现在ROWID的差别。 
还可以使用诊断事件10231 
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10'; 
创建一个临时表good_table的表中除坏块的数据都检索出来 
SQL>CREATE TABLE good_table as select * from bad_table; 
最后关闭诊断事件 
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context off '; 
关于ROWID的结构,还可以参考dbms_rowid.rowid_create函数。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/196700/viewspace-720601/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-10-10

  • 博文量
    529
  • 访问量
    4290