背景
学习用bbed替换同一个表中不同数据块,即用同一个表中1个数据块的内容替换另一个数据块的内容。结论
1,可以使用bbed copy命令复制一个数据块内容到另一个数据块2,copy命令为
BBED> help copy
COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
3,使用bbed copy复制数据块后,目标数据块的kcbh结构体的rdba_kcbh要恢复到修改前的内容
4,在用copy复制数据块前,先要查看或备份下源数据块的内容
p kcbh block 源数据块编号
5,rdba_kcbh它是以反序显示,但存储以显示的顺序反过来存储
具体修改顺序如下:
1,查看未复制前的rdba_kcbh,用命令:p kcbh block 未修改前的目标数据块
2, 采用copy复制源数据块内容到目标数据块,用命令:copy 源数据块 to 目标数据块
3, 定位到目标数据块的rdba_kcbh的偏移量,还原rdba_kcbh为修改前的内容,用命令
set block 目标数据块
set offset rdba_kcbh的偏移量 (一般源于修改前的map获取,因为修改中间不能使用map,可能会报错)
根据修改前的rdba_kcbh内容,用m /x 修改前的rdba_kcbh值,进行还原即可
固化或真正修改目标数据块,用命令:sum apply
查看目标数据块的rdba_kcbh,用命令:p rdba_kcbh,查看是否变更成功
4,如果中期想回退操作,使用undo即可
6,bbed print命令,组合非常强大,可以基于数据块地址,文件号,文件名称,块号,块内的偏移量,或块内的结构体,或采用父子树状结构体,显示其数据块的对应内容
BBED> help print
PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
BBED> p block 99183
kcbh.type_kcbh
--------------
ub1 type_kcbh @0 0x06
BBED> p 4
kcbh.rdba_kcbh
--------------
ub4 rdba_kcbh @4 0x0101836f
BBED> p rdba_kcbh
ub4 rdba_kcbh @4 0x0101836f
BBED> p kcbh.rdba_kcbh
ub4 rdba_kcbh @4 0x0101836f
7,用bbed修改数据块的内容,必须用强制刷新缓冲池,方可生效,否则仍是原有的值
感叹,BBED牛比啊,强悍
测试
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
SQL> create table t_replace_block(a int,b int);
Table created.
SQL> insert into t_replace_block select level,level from dual connect by level<=10000;
10000 rows created.
SQL> commit;
Commit complete.
SQL> select distinct DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) from t_copy_block;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)
------------------------------------
4
SQL> select distinct DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) block_number from t_copy_block;
BLOCK_NUMBER
------------
99182
99183
99185
99198
99193
99197
99187
99189
99199
99179
99180
BLOCK_NUMBER
------------
99194
99190
99181
99184
99186
99188
99191
18 rows selected.
数据块99182
SQL> select a,b from t_copy_block where DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)=99182 and dbms_rowid.rowid_row_number(rowid)=1;
A B
---------- ----------
1135 1135
数据块99183
SQL> select a,b from t_copy_block where DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)=99183 and dbms_rowid.rowid_row_number(rowid)=1;
A B
---------- ----------
1694 1694
准备用99182数据块内容替换99183数据块内容
[oracle@seconary bbed_test]$ bbed parfile=bbed.text password=blockedit
BBED: Release 2.0.0.0.0 - Limited Production on Fri Oct 30 21:49:57 2015
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
查看数据块99182
BBED> p kcbh block 99182
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0101836e
ub4 bas_kcbh @8 0x037afb1b
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x1d7a
ub2 spare3_kcbh @18 0x0000
查看数据块99183
BBED> p kcbh block 99183
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0101836f
ub4 bas_kcbh @8 0x037afb1b
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x9362
ub2 spare3_kcbh @18 0x0000
复制数据块99182内容到数据块99183
BBED> copy block 99182 to block 99183
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 99183 Offsets: 0 to 31 Dba:0x0101836f
------------------------------------------------------------------------
06a20000 6e830101 1bfb7a03 00000106 7a1d0000 01002100 dc240100 8ff97a03
<32 bytes per line>
再次查看数据块99183
BBED> p kcbh block 99183
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0101836e
ub4 bas_kcbh @8 0x037afb1b
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x1d7a
ub2 spare3_kcbh @18 0x0000
BBED>
当前数据块变成复制数据块的目标数据块99183
BBED> d
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 99183 Offsets: 0 to 31 Dba:0x0101836f
------------------------------------------------------------------------
06a20000 6e830101 1bfb7a03 00000106 7a1d0000 01002100 dc240100 8ff97a03
<32 bytes per line>
BBED> d
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 99183 Offsets: 4 to 35 Dba:0x0101836f
------------------------------------------------------------------------
6e830101 1bfb7a03 00000106 7a1d0000 01002100 dc240100 8ff97a03 0000e81f
<32 bytes per line>
但复制后还需要把99183数据块的rdba_kcbh还原回去,用于指定文件号及数据块,不然就乱套了
BBED> p rdba_kcbh block 99183
ub4 rdba_kcbh @0 0x0000a206
未复制前的99183数据块的rdba_kcbh
ub4 rdba_kcbh @4 0x0101836f
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0101836e
ub4 bas_kcbh @8 0x037afb1b
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x1d7a
ub2 spare3_kcbh @18 0x0000
BBED> set offset 4
OFFSET 4
BBED> d
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 99183 Offsets: 4 to 35 Dba:0x0101836f
------------------------------------------------------------------------
6e830101 1bfb7a03 00000106 7a1d0000 01002100 dc240100 8ff97a03 0000e81f
<32 bytes per line>
BBED> m /x 6f830101
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 99183 Offsets: 4 to 35 Dba:0x0101836f
------------------------------------------------------------------------
6f830101 1bfb7a03 00000106 123d0000 01002100 dc240100 8ff97a03 0000e81f
<32 bytes per line>
BBED> sum apply
Check value for File 4, Block 99183:
current = 0x1d7b, required = 0x1d7b
BBED> p kcbh block 99183
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x0101836f
ub4 bas_kcbh @8 0x037afb1b
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x1d7b
ub2 spare3_kcbh @18 0x0000
再次查看表的数据是否变化过来
可见数据块的内容已经发生了,但一定要进行刷新缓冲池,才能让新变更的内容体现出来
SQL> select a,b from t_copy_block where DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)=99183 and dbms_rowid.rowid_row_number(rowid)=1;
A B
---------- ----------
1694 1694
SQL> alter system flush buffer_cache;
System altered.
SQL> select a,b from t_copy_block where DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)=99183 and dbms_rowid.rowid_row_number(rowid)=1;
A B
---------- ----------
1135 1135
个人简介:
8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院
河北廊坊新奥集团公司
项目经验:
中国电信3G项目AAA系统数据库部署及优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
联系方式:
手机:18201115468
qq : 305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900
itpub博客名称:wisdomone1
http://blog.itpub.net/9240380/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-1820208/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-1820208/