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博客 ” ,链接:https://blog.itpub.net/196700/viewspace-720601/
,如需转载,请注明出处,否则将追究法律责任。