- 最后登录
- 2017-5-4
- 在线时间
- 81 小时
- 威望
- 999
- 金钱
- 2391
- 注册时间
- 2013-9-11
- 阅读权限
- 150
- 帖子
- 1124
- 精华
- 5
- 积分
- 999
- UID
- 1220
|
2#
发表于 2017-4-13 14:25:50
我重建过的undo表空间。多次重建过了。最后又重建回undotbs1了。目前这undo表空间有60G大小。足够用了。虽然大也是浪费。
参考了不少文章,没法解决这个问题。哪位无聊时可以随时远程我的环境做研究或提供些思路方向。
修正了6个01555的异常。最后一个没法搞了。
试过重建LOB索引、字段;DBV正常;ANALYZE TABLE 正常。
可查询rowid除LOB对象外的其他数据,无法查询整行记录;
无法update OBJECT=empty_blob() where rowid='AAASdoAAGAAP2ZcAAK';无法删除。
所有报错全是以下代码:
ERROR at line 1:
ORA-08102: index key not found, obj# 75626, file 5, block 4121159 (2)
trace:
oer 8102.2 - obj# 75626, rdba: 0x017ee247(afn 5, blk# 4121159)
kdk key 8102.2:
ncol: 2, len: 16
key: (16): 0a 00 00 00 01 00 00 1b b6 19 3d 04 00 00 00 0c
mask: (4096):
试过不得行噢~
目前在测试一种想法。
可惜只要有数据迁移,在块的位置只要有改变那么rowid也会改变,不方便对比行记录是否一致。
这里有以前的一个expdp有效备份的dmp。
现在在测试导入到一个新库A,然后定位到这条记录,单独导出这条数据。再插入到新库B。新库B是一个新建的库,用于将从生产库expdp导出的数据的测试用库。
我这有本书:《构建最高可用Oracle数据库系统》 511页里面提到expdp过程中,只会将对象正确的数据导出跳过表的坏块。
没有测试过,不知道可不可靠。。。。
如果这样的话,可以把以前的正确的这个行记录导出再插入到新库B里面。得到的是否就无数据丢失的完整还可用的库了?
因为包含了blob对象,目前想到两个方式:
1、expdp/impdp;带query where rowid<>'AAASdoAAGAAP2ZcAAK'
2、create table T2 as select * from T1 where rowid<>'AAASdoAAGAAP2ZcAAK' ---- 建新表且跳过lob损坏的那个行记录,待建表成功再修改表的各种属性……
---- 本地测试结果:两个办法都可以。新、老表的数据一致,包括blob对象,并且排除了有错的这个行记录。对于行中的那个坏的LOB可以另写一个insert into 连同AAASdoAAGAAP2ZcAAK能查询出的字段的数据一起插入表内。
---- 以前的expdp备份中查询不到我要的行的数据,所以放弃导入之前未损坏的lob数据,应该正好是数据库故障时的数据。所以以前的备份查不出来。
使用道具 举报 |
|