利用BBED恢复UPDATE修改前的值

简介: BBED工具介绍:BBED stands for Block Browser and EDitor.BBED只是一款工具,类似于ultraEdit,单纯的会用BBED来修改数据没有任何意义!关键是要知道为什么要这么改!在充分了解Block格式和Oracle的各种机制的基础上广泛使用BBED, 用它来帮你构造测试案例,用它来帮你验证测试结果,用它来帮你深入理解Oracle!

实验过程如下:
1、创建表guo_test1

gyj@PROD> create table guoyJoe_t1(id int,name varchar2(10));
 
Table created.
 
gyj@PROD> insert into guoyJoe_t1 values(1,'guoyJoe');
 
1 row created.
 
gyj@PROD> insert into guoyJoe_t1 values(1,'tom');
 
1 row created.
 
gyj@PROD> COMMIT;
 
Commit complete.

2、查出这行记录的DBA


gyj@PROD> select name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid)    row# from guoyJoe_t1;
 
NAME            FILE#     BLOCK#       ROW#
---------- ---------- ---------- ----------
guoyJoe             5      20877          0
tom                 5      20877          1
————————————————

3、刷数据缓存


gyj@PROD> alter system flush buffer_cache;
 
System altered.

4、利用BBED找到这行记录(修改前的值:guoyJoe)

BBED> BBED> set file 5    block 20877
        FILE#           5
        BLOCK#          20877

--观察行头
BBED> p kdbr
sb2 kdbr[0] @118 8074
sb2 kdbr[1] @120 8064

BBED> p *kdbr[0]

rowdata[10]

ub1 rowdata[10] @8174 0x2c

--观察事务
BBBED> x /rnc

rowdata[10] @8174

flag@8174: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8175: 0x01
cols@8176: 2

col 0[2] @8177: 1
col 1[7] @8180: guoyJoe

---观察空间
BBED> p kdbhavsp
sb2 kdbhavsp @110 8042

BBED> p kdbhtosp
sb2 kdbhtosp @112 8042

5、发生UPDATE语句,把原来的值guoyJoe修改成oracledba

gyj@PROD> update guoyJoe_t1 set name='oracledba' where name='guoyJoe';
 
1 row updated.
 
gyj@PROD> commit;
 
Commit complete

6、刷数据缓存

gyj@PROD> alter system flush buffer_cache;
 
System altered.

7、利用BBED找到这行被修改后的记录(修改后的值上:oracledba)


BBED> set file 5    block 20877
        FILE#           5
        BLOCK#          20877

--观察行头
BBED> p kdbr
sb2 kdbr[0] @118 8048
sb2 kdbr[1] @120 8064

BBED> p *kdbr[0]

rowdata[0]

ub1 rowdata[0] @8148 0x2c

--观察事务
BBED> x /rnc

rowdata[0] @8148

flag@8148: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8149: 0x01
cols@8150: 2

col 0[2] @8151: 1
col 1[9] @8154: oracledba

---观察空间
BBED> p kdbhavsp
sb2 kdbhavsp @110 8040

BBED> p kdbhtosp
sb2 kdbhtosp @112 8040

8、对比修改前与修改后的数据

BBED> d /v offset 8174 count 16
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877   Offsets: 8174 to 8189  Dba:0x0140518d
-------------------------------------------------------
 2c000202 c1020767 756f794a 6f650106 l ,...á..guoyJoe..
 
 
BBED> d /v offset 8148 count 16
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877   Offsets: 8148 to 8163  Dba:0x0140518d
-------------------------------------------------------
 2c010202 c102096f 7261636c 65646261 l ,...á..oracledba


9、开始恢复
(1)修改row directory指针位置(@118)
--修改前

BBED> p kdbr
sb2 kdbr[0]

                              @118      8074
--修改后
                                 @118      8048

BBED> p kdbr
sb2 kdbr[0]
g
yj@PROD> select to_char('8074','xxxxxxxxxxxxxx') from dual;

TO_CHAR('8074',

       1f8a

gyj@PROD> select to_char('8048','xxxxxxxxxxxxxx') from dual;

TO_CHAR('8048',

       1f70

BBED> d /v offset 118 count 16
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20877 Offsets: 118 to 133 Dba:0x0140518d

701f801f 00000000 00000000 00000000 l p...............

BBED> modify /x 8a offset 118
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20877 Offsets: 118 to 133 Dba:0x0140518d

8a1f801f 00000000 00000000 00000000

<32 bytes per line>

BBED> sum apply
Check value for File 5, Block 20877:
current = 0x8a00, required = 0x8a00

BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/PROD/tp01.dbf
BLOCK = 20877

Block Checking: DBA = 20992397, Block Type = KTB-managed data block
data header at 0x7f76ff66e264
kdbchk: xaction header lock count mismatch ----事务锁报错

    trans=1 ilk=1 nlo=0

Block 20877 failed with check code 6108

DBVERIFY - Verification complete

Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 1
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS; facility=BBED

2)接下来修改事务锁
---把更新前值的事务锁标记从00改为01

BBBED> x /rnc

rowdata[10] @8174

flag@8174: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8175: 0x01
cols@8176: 2

BBED> d /v offset 8175 count 16
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20877 Offsets: 8175 to 8190 Dba:0x0140518d

000202c1 02076775 6f794a6f 6501066f l ...á..guoyJoe..o

BBED> modify /x 01 offset 8175
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20861 Offsets: 8175 to 8190 Dba:0x0140517d

010202c1 02076775 6f794a6f 650106ed


--把更新后值的事务锁标识01改为00

BBED> x /rnc

rowdata[0] @8148

flag@8148: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8149: 0x01
cols@8150: 2

BBED> d /v offset 8149 count 16
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20877 Offsets: 8149 to 8164 Dba:0x0140518d

010202c1 02096f72 61636c65 6462612c l ...á..oracledba,

BBED> modify /x 00 offset 8149
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20861 Offsets: 8159 to 8174 Dba:0x0140517d

000202c1 02096f72 61636c65 6462612c

BBED> sum apply
Check value for File 5, Block 20877:
current = 0x8a00, required = 0x8a00
BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/PROD/tp01.dbf
BLOCK = 20877

Block Checking: DBA = 20992397, Block Type = KTB-managed data block
data header at 0x7cb464
kdbchk: the amount of space used is not equal to block size

    used=46 fsc=0 avsp=8040 dtl=8088 

---提示数据块的空间使用不正确(dtl-used=kdbhavsp=kdbhtosp)
       8088-46=8042 与 avsp=8040相关2,也就是说我要恢复到8042
     
 (3)修改空间,把空间修改为6a1f,以dtl-used=kdbhavsp为主

gyj@PROD> select to_char('8042','xxxxxxxxxxxxxx') from dual;

  TO_CHAR('8042',
   ---------------
       1f6a

BBED> modify /x 6a1f offset 110
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20877 Offsets: 110 to 125 Dba:0x0140518d

6a1f681f 00000200 8a1f801f 00000000

<32 bytes per line>

BBED> modify /x 6a1f offset 112
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)

Block: 20877 Offsets: 112 to 127 Dba:0x0140518d

6a1f0000 02008a1f 801f0000 00000000

<32 bytes per line>

BBED> sum apply
Check value for File 5, Block 20877:
current = 0x8a00, required = 0x8a00

BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/PROD/tp01.dbf
BLOCK = 20877

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
Message 531 not found; product=RDBMS; facility=BBED

10、恢复成功(oracledba--->guoyJoe)

gyj@PROD> alter system flush buffer_cache;

System altered.

gyj@PROD> select name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid) row# from guoyJoe_t1 where id=1;

NAME FILE# BLOCK# ROW#


guoyJoe 5 20877 0
tom 5 20877 1

实际上用BBED恢复UPDATE前的值不难,主要是要了解内部原理和块格式
总结如下:
 (1)修改行头
 (2)修改事务
相关文章
|
数据可视化 PyTorch 算法框架/工具
“零一万物”Yi系列魔搭最佳实践教程来了!
11 月 6 日,李开复博士带队创办的AI2.0公司零一万物正式开源发布首款预训练大模型 Yi-34B,模型开放商用申请,已在阿里云魔搭社区ModelScope首发。魔搭第一时间推出了模型部署相关教程,供开发者参考并快速上手。
|
9月前
|
人工智能 运维 Linux
进化、重构、赴未来,龙蜥加速推进产业面向AI时代变革 | 2024龙蜥大会主论坛
在2024龙蜥大会中,本次分享的主题是关于英特尔公司与龙蜥社区的合作成果和未来计划。 1. 龙蜥操作系统开源社区取得的关键性的进展 2. 社区治理 3. Anolis 23:面向AI时代,IT基础设施全新底座 4. 面对机遇开源共创,服务用户聚力前行 5. 面向AI时代,龙蜥社区发布三大计划加速生态建设 6. 展望未来
168 5
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
数据采集 数据挖掘 定位技术
python基于淘宝历史数据的用户行为分析(一)
python基于淘宝历史数据的用户行为分析(一)
python基于淘宝历史数据的用户行为分析(一)
|
存储 开发工具 数据安全/隐私保护
Git 与 SVN:版本控制领域的双星对比
【8月更文挑战第27天】
538 6
|
存储 Serverless API
阿里云百炼应用实践系列-10分钟构建能主动提问的智能导购
通过使用阿里云百炼平台,您可以快速构建一个多代理(Multi-Agent)架构的智能导购助手。该助手能够通过多轮互动了解顾客的具体需求,收集详细信息后,利用阿里云百炼的知识检索增强功能或已有的商品数据库进行商品搜索,为顾客推荐最合适的产品。
1477 8
|
网络协议 安全 API
你知道 HTTP 是如何使用 TCP 连接的吗?今天我就来告诉你!(上)
之前我写了篇关于 HTTP 的文章,文章中讲述了 HTTP 的特点,HTTP 的报文,HTTP 的请求方式等知识,接下来,深入了,我们就关于 HTTP 引发的面试题来进行入手,一起来看一下吧!
你知道 HTTP 是如何使用 TCP 连接的吗?今天我就来告诉你!(上)
|
存储 安全 Java
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列
Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列