利用BBED恢复UPDATE改动前的值
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/30615151
实验步骤例如以下:
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
--改动后
BBED> p kdbr
sb2 kdbr[0] @118 8048
gyj@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)改动事务
(3)改动空间
利用BBED恢复UPDATE改动前的值的更多相关文章
- 利用BBED恢复数据文件头
转载请注明出处:http: @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED block block ) Block: Dba:0x01400001 ---------------- ...
- 使用BBED恢复数据文件头
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/31018075 @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED> ...
- [20190226]测试使用bbed恢复索引.txt
[20190226]测试使用bbed恢复索引.txt --//上午做tab$删除恢复测试时发现,tab$的索引i_tab1很小.可以尝试使用bbed解决这个问题.--//首先在普通表上做一个测试看看. ...
- 利用binlogserver恢复单表实验【转】
使用场景 每次开启binlogserver 指定了mysql-bin.0000XX 后都会从该点从头进行传输一次 创建binlogserver [root@mysql-zst3 binlogserve ...
- Linux中利用extundelete恢复误删除的数据
利用extundelete工具恢复磁盘误删除的数据 原理: 简单介绍下关于inode的知识.在Linux下可以通过"ls -id"命令来查看某个文件或者目录的inode值,例如查看 ...
- 利用RMAN恢复整个数据库
利用RMAN恢复整个数据库案例一 适合场合:恢复的目录一致,同时备份的过程中有归档日志 恢复的数据库目录和down机的数据库一致,还有一个就是RMAN备份的时候已经备份了归档日志. 备份脚本: run ...
- 160628、利用Oracle rownum让表排序字段值连续
利用Oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分 ...
- 11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump
OCR备份 OCR的备份有2种方式,自动备份和手工备份. 自动备份策略: Oracle Clusterware 每隔4小时,CRSD 进程会自动对OCR 进行一次备份,在任意时刻,oracle 总会保 ...
- 利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境
前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有 ...
随机推荐
- Android_使用StrictMode
调试开发
本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/40076049 1.StrictMode简单介绍 自Android 2 ...
- Gradle cookbook(转)
build.gradle apply plugin:"java" [compileJava,compileTestJava,javadoc]*.options*.encoding ...
- Metatable和Metamethod(转)
Metatable和Metamethod是用来干啥的?它们可以使得表a和b的表达式“a + b”变得有意义,其中metatable使两个不相关的表a和b之间可以进行操作,而操作的具体行为比如说&quo ...
- uva 11324 The Largest Clique(图论-tarjan,动态规划)
Problem B: The Largest Clique Given a directed graph G, consider the following transformation. First ...
- 有一个NSStirng类型,retain时尚宣言name财产setter内部方法的每一行代码的作用?
- (void)setName:(NSString *)name { 推断原有对象和新对象是否是同一个对象,假设是同一个,就没有必要再又一次赋值,否则会先release 再retain, ...
- POJ 3356 AGTC(最长公共子)
AGTC Description Let x and y be two strings over some finite alphabet A. We would like to transform ...
- UVa 11621 - Small Factors
称号:发现没有比给定数量少n的.只要2,3一个因素的数字组成. 分析:数论.贪婪,分而治之. 用两个三分球,分别代表乘法2,和繁殖3队列,队列产生的数字,原来{1}. 然后.每取两个指针相应元素*2和 ...
- Swift编程语言学习1.3——类型安全和投机型
Swift 是类型安全(type safe )语言.类型安全的语言可以让你清楚地知道代码被处理值类型.假设你需要一个代码String.你绝对不能进去一个不小心传球Int. 因为 Swift 它是类型安 ...
- innerHTML使用方法
使用方法: 比方在<body>中写了例如以下的代码:<div id=top></div> 如今用top.innerHTML="..........&quo ...
- XML数组和对象,反之亦然
惊人的互相转换,还是因为麻烦.程序很反感麻烦猿 1 阵转xml <?php /* 一维数组转xml 思路: 循环数组每一个单元,添加到xml文档节点中去 */ /* $arr = array( ...