ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 通过BBED的COPY来覆盖表里现有的数据块

通过BBED的COPY来覆盖表里现有的数据块

原创 Linux操作系统 作者:wei-xh 时间:2012-05-12 13:44:43 0 删除 编辑
[i=s] 本帖最后由 wei-xh 于 2012-5-12 13:44 编辑

#通过BBED的COPY来覆盖表里现有的数据块
#修改完成后,需要修改RDBA。

#数据库版本10.2.0.4

1.创建测试表空间、测试表,表空间的段管理方式为ASSM。



2.查看表都占用了哪些数据块

CODE:

test@CRMD> select distinct dbms_rowid.ROWID_OBJECT(rowid) data_object_id#,
2 dbms_rowid.ROWID_RELATIVE_FNO(rowid) rfile#,
3 dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#
4 from test;

DATA_OBJECT_ID# RFILE#      BLOCK#
--------------- ---------- ----------
10815               4          12
10815               4          333.选择把4,23 的内容覆盖到4,12里。

CODE:

BBED> set dba 4,23
DBA 0x01000017 (16777239 4,23)
BBED> map /v
File: /data1/oracle/crmd/users01.dbf (4)
Block: 23 Dba:0x01000017
------------------------------------------------------------
KTB Data Block (Table/Cluster)

struct kcbh, 20 bytes @0
ub1 type_kcbh @0
ub1 frmt_kcbh @1
ub1 spare1_kcbh @2
ub1 spare2_kcbh @3
ub4 rdba_kcbh @4
BBED> p rdba_kcbh
ub4 rdba_kcbh @4 0x01000017

4,23的rdba_kcbh值为0x01000017

BBED> set dba 4,12
        DBA             0x0100000c (16777228 4,12)
BBED> p rdba_kcbh
ub4 rdba_kcbh                               @4        0x0100000c   

4,12的rdba_kcbh值为0x0100000c

BBED> copy dba 4,23 to dba 4,12修改4,12的rdba的值为0c000001(需要对0x0100000c进行反转)

CODE:

BBED> m /x 0c000001
File: /data1/oracle/crmd/users01.dbf (4)
Block: 12 Offsets: 4 to 515 Dba:0x0100000c
------------------------------------
0c000001 36cb0500 00000104 424d0000

BBED> sum dba 4,12 apply
Check value for File 4, Block 12:
current = 0x4d59, required = 0x4d59

BBED> verify dba 4,12
DBVERIFY - Verification starting
FILE = /data1/oracle/crmd/users01.dbf
BLOCK = 12


DBVERIFY - Verification complete

Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0验证数据块OK。没有块损坏。

CODE:

test@CRMD>select count(*) from test;

COUNT(*)
----------
877
test@CRMD>delete from test where dbms_rowid.ROWID_BLOCK_NUMBER(rowid) =12;
ERROR:
ORA-03114: not connected to ORACLE


delete from test where dbms_rowid.ROWID_BLOCK_NUMBER(rowid) =12
*
ERROR at line 1:
ORA-00603: ORACLE server session terminated by fatal error

test@CRMD>rollback;
ERROR:
ORA-03114: not connected to ORACLE


test@CRMD>conn test/test
Connected.
test@CRMD>delete from test;
delete from test
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [ktspstchg-1], [], [], [], [], [], [], [] DELETE 出现了问题。
我个人的猜测是:
由于采用的是ASSM管理,这样搞了之后,3级位图块内记录的块使用信息(比如使用的百分比)跟实际的不一致,造成了这个问题。
如果非ASSM表空间,这种方式可能就不会有问题。

解决的办法就是ceate table xx as select xxx;

使用手工段空间管理,没出现这个问题。过程就不贴出来。

CODE:

create tablespace users datafile '/data1/oracle/crmd/users01.dbf' size 2g SEGMENT SPACE MANAGEMENT MANUAL ;
test@CRMD>delete from test where dbms_rowid.ROWID_BLOCK_NUMBER(rowid) =17;
77 rows deleted.
test@CRMD>delete from test where dbms_rowid.ROWID_BLOCK_NUMBER(rowid) =35;
77 rows deleted.

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

请登录后发表评论 登录
全部评论
Oracle ACE组成员,DBGeeK用户组发起人。曾在DTCC、ORACLE技术嘉年华、Gdevops等公开场合做过数据库技术专题分享,2017年应Oracle邀请在世界最大的数据库会议OOW上做技术分享。组织翻译了《拨云见日,解密Oracle ASM内核》一书。

注册时间:2009-07-04

  • 博文量
    422
  • 访问量
    2306283