Oracle8.0.5中dbms_repair包问题

[复制链接]
查看11 | 回复9 | 2012-5-15 15:24:11 | 显示全部楼层 |阅读模式
SQL> BEGIN
2DBMS_REPAIR.ADMIN_TABLES (
3TABLE_NAME => 'REPAIR_TABLE',
4TABLE_TYPE => dbms_repair.repair_table,
5ACTION => dbms_repair.create_action,
6TABLESPACE => 'AFIS_LQUSER');
7END;
8/
TABLE_TYPE => dbms_repair.repair_table,

*
ERROR at line 4:
ORA-06550: line 4, column 17:
PLS-00201: identifier 'DBMS_REPAIR.REPAIR_TABLE' must be declared
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored
在oracle8.0.5中执行上面过程时出错,是不是8.0.5
没有这个功能啊?
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
8i才有
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
以SYS连接数据库
DESC DBMS_REPAIR
看看DBMS_REPAIR包是否存在。
关于DBMS_REPAIR包的使用可以参考:http://blog.itpub.net/post/468/9121
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
他娘的,这个数据库的数据文件出现了坏块,文件进行了物理备份(一样也有坏块)所以不能采用物理恢复了,通过select发现这些坏块都是出现在二进制数据里。
在导出数据的时候也是出现ora-01578 data block corrupt这种错误,
我现在想,通过pl/sql来导出数据(通过where条件跳过那些坏块,能救出多少救出多少)
基于这种考虑,我想通过dbms_repair包的SKIP_CORRUPT_BLOCKS过程,来跳过这些坏块
BEGIN
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS (
SCHEMA_NAME => 'LQUSER',
OBJECT_NAME => 'TPIMAGE',
OBJECT_TYPE => dbms_repair.table_object,
FLAGS => dbms_repair.skip_flag);
END;
/
可是却用不了,请教各位了,有什么办法可以救出那些没有在坏块中的数据呢?
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
805没有这个包,
自己写个程序,删掉坏块处的数据.
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
楼主帮帮忙,怎么写啊?有没有什么例子给看看!
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
原来写了一个cursor,想把可用的卡号(也就是能够读取的数据)都放到另外一个表中保存起来,这样只是导出这些数据就可以了
但是,发现这样选出来的卡,再次用select keyno,fingerpos,fpimagelen from tpimage时还是出现corrupt block的情况
现在讲写的程序贴在下面:
create or replace procedure getGoodKeyNo is
cursor c_BadKeyNo is select keyno,fingerpos from tpimage;
c_BadKeyNoRecc_BadKeyNo%rowtype;
vKeyNo varchar2(20);
vFingerPos number;
vFpImageLen number;
myException Exception;
begin
delete from badkeyno;
if not c_BadKeyNo%isopen then
open c_BadKeyNo;
end if;
loop
Fetch c_BadKeyNo into c_BadKeyNoRec;
exit when c_BadKeyNo%notfound;
begin
select keyno,fingerpos,fpimagelen into vKeyNo,vFingerPos,vFpImageLen

from tpimage

where keyno=c_BadKeyNoRec.KeyNo

and fingerpos=c_BadKeyNoRec.FingerPos;
insert into badkeyno values(c_BadKeyNoRec.KeyNo,c_BadKeyNoRec.FingerPos);
Exception
when others then null;
end;
end loop;
commit;
end getGoodKeyNo;
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
估计你取卡号时走的是索引
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
我也是这样认为的,因为我的keyno,fingerpos是主键,所以在select的时候能够取到值。但是我的fpimagelen是没有索引的哦!所以我在select 的时候故意加了这个字段,为的就是看这个字段的数据是不是在坏块里面。
回复

使用道具 举报

千问 | 2012-5-15 15:24:11 | 显示全部楼层
我在读数据库的时候出现这样的错误:ORA-01578: ORACLE data block corrupted (file # 9, block # 157735)
现在,我想能不能找到这个块所在的segment然后drop掉这个segment,最后create segment,这样丢失的数据也只有一部分,不会全部都丢失的。
所以我去查这个块在那个segment里
select SEGMENT_TYPE,OWNER || '.' || SEGMENT_NAME FROM DBA_EXTENTS WHERE FILE_ID = 9 and block_ID between 157735 and 157735 + blocks -1;
但是,却查不到记录,不知道是什么原因?(上面的错误提示却总是在应用程序中出现)是不是我写错了,还是有另外的sql statement?
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行