[20170411]bbed删除记录的恢复.txt
[20170411]bbed删除记录的恢复.txt
--//昨天上午做的测试,链接:http://blog.itpub.net/267265/viewspace-2136933/
--//我当时并没有选择恢复记录,仅仅看删除的内容.因为这样恢复是存在许多问题.
--//执行 drop function scott.sleep ; 删除sys.source$相关记录仅仅是该命令的一小部分,恢复
--//sys.source$相关记录会存在许多问题,但是如果是应用数据恢复还是可以,实际上以前我的博客也做过类似操作.
--//当时刚刚开始学习bbed,基本按照别人的例子做的,自己在重复加深理解.
--//主要一些bbed相关知识不懂。
1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SCOTT@book> create table deptx as select * from dept ;
Table created.
SCOTT@book> @ &r/qq deptx 1
ROWID OBJECT FILE BLOCK ROW ROWID_DBA DEPTNO DNAME LOC
------------------ ---------- ---------- ---------- ---------- -------------------- ---------- -------------- -------------
AAAWGhAAEAAAAIjAAA 90529 4 547 0 0x1000223 10 ACCOUNTING NEW YORK
SCOTT@book> alter system checkpoint ;
System altered.
SCOTT@book> alter system checkpoint ;
System altered.
--//脏块写盘.
--//删除恢复一般:
A.首先删除后并没有覆盖,如果覆盖了这样恢复不行.
B.恢复就是恢复flag=0x2c(删除flag=0x3c)
C.恢复相关设置一致,我以前这步从来不做,我觉得麻烦,因为select已经可以访问了.本文主要关注这里。而是直接sum apply。
D.sum apply.
2.使用bbed观察:
BBED> map dba 4 ,547
File: /mnt/ramdisk/book/users01.dbf (4)
Block: 547 Dba:0x01000223
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 96 bytes @20
struct kdbh, 14 bytes @124
struct kdbt[1], 4 bytes @138
sb2 kdbr[4] @142
ub1 freespace[7946] @150
ub1 rowdata[92] @8096
ub4 tailchk @8188
BBED> p dba 4,547 kdbh
struct kdbh, 14 bytes @124 Data Header Structure
ub1 kdbhflag @124 0x00 (NONE) N=pctfree hit(clusters); F=do not put on freelist; K=flushable cluster keys
sb1 kdbhntab @125 1 Number of tables (>1 in clusters)
sb2 kdbhnrow @126 4 Number of rows
sb2 kdbhfrre @128 -1 First free row entry index; -1 = you have to add one
sb2 kdbhfsbo @130 26 Freespace begin offset
sb2 kdbhfseo @132 7972 Freespace end offset
sb2 kdbhavsp @134 7946 Available space in the block
sb2 kdbhtosp @136 7946 Total available space when all TXs commit
--//人为改动kdbh.kdbhavsp=7945;产生不一致。
BBED> assign kdbh.kdbhavsp=7945;
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
sb2 kdbhavsp @134 7945
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0x48ba, required = 0x48ba
BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/users01.dbf
BLOCK = 547
Block Checking: DBA = 16777763, Block Type = KTB-managed data block
data header at 0x7f7a00b3427c
kdbchk: the amount of space used is not equal to block size
used=118 fsc=0 avsp=7945 dtl=8064
Block 547 failed with check code 6110
--// dtl 猜测一下 最后tailchk 占用4个字节. 8192-4=8188,再减去124(注:kdbh的偏移量位置)就是8064.也就真正能写数据的空间8064.
--// 如果2个ITL槽对于一般表 kdbh的偏移就是100(表空间类型ASSM),很好记,ctas建立的表多了1个ITL槽,也就是多了24字节。
SCOTT@book> select sum(length(deptno)+length(dname)+length(loc)) n10 from dept;
N10
----
68
--// used=118 看字面意思就是使用量。
--//如果加上长度指示器,字段数量指示器 (3+1)*4=16,68+16=84.
--//如果包括每条记录flag,lock 2个字节,共4条记录. 84+8=92,也与rowdata[92]对上。
--//还差118-92=26 字节。
BBED> map dba 4 ,547
File: /mnt/ramdisk/book/users01.dbf (4)
Block: 547 Dba:0x01000223
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 96 bytes @20
struct kdbh, 14 bytes @124
struct kdbt[1], 4 bytes @138
sb2 kdbr[4] @142
ub1 freespace[7946] @150
ub1 rowdata[92] @8096
ub4 tailchk @8188
--//注意freespace的偏移量150,kdbh偏移量是124,相差26.正好合适对上。
--//观察 kdbhfsbo @130 26 Freespace begin offset 也正好对上。
--//根据以前我自己的计算公式:
dtl - used +fsc = avsp (注:这时错误,正确应该是dtl - used - fsc = avsp,这里是fsc=0)
8064-118+0=7946
--//还原:
BBED> assign kdbh.kdbhavsp=7946;
sb2 kdbhavsp @134 7946
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0x48b9, required = 0x48b9
3.删除恢复后bbed观察:
SCOTT@book> delete from deptx;
4 rows deleted.
SCOTT@book> commit ;
Commit complete.
SCOTT@book> alter system checkpoint ;
System altered.
--//说明当dml操作后,如果总长度缩短oracle会在对应ITL中的fsc记录空间回收的量.当然如果比原来大,fsc=0.没有变化.
--//如果加上长度指示器,字段数量指示器 (3+1)*4=16,68+16=84.(不包括flag,lock标识)
--//注3个字段,4条记录,而且没有NULL.可以参考链接:http://blog.itpub.net/267265/viewspace-2108017/
BBED> x /rncc *kdbr[0]
rowdata[66] @8162
-----------
flag@8162: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8163: 0x02
cols@8164: 0
--//lock=0x02,使用ITL槽1.
BBED> p ktbbh.ktbbhitl[1]
struct ktbbhitl[1], 24 bytes @68
struct ktbitxid, 8 bytes @68
ub2 kxidusn @68 0x000a
ub2 kxidslt @70 0x0010
ub4 kxidsqn @72 0x00004f79
struct ktbituba, 8 bytes @76
ub4 kubadba @76 0x00c00119
ub2 kubaseq @80 0x0fcc
ub1 kubarec @82 0x04
ub2 ktbitflg @84 0x2004 (KTBFUPB)
union _ktbitun, 2 bytes @86
sb2 _ktbitfsc @86 84
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ub2 _ktbitwrp @86 0x0054
ub4 ktbitbas @88 0x1764e8fb
--//注意看下划线, ktbbh.ktbbhitl._ktbitun._ktbitfsc=84.与推测一致。
BBED> p kdbh
struct kdbh, 14 bytes @124
ub1 kdbhflag @124 0x00 (NONE)
sb1 kdbhntab @125 1
sb2 kdbhnrow @126 4
sb2 kdbhfrre @128 -1
sb2 kdbhfsbo @130 26
sb2 kdbhfseo @132 7972
sb2 kdbhavsp @134 7946
sb2 kdbhtosp @136 8038
--//人为改动kdbh.kdbhavsp=7945;产生不一致。
BBED> assign kdbh.kdbhavsp=7945;
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
sb2 kdbhavsp @134 7945
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0xd46b, required = 0xd46b
BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/users01.dbf
BLOCK = 547
Block Checking: DBA = 16777763, Block Type = KTB-managed data block
data header at 0x7f04d01be27c
kdbchk: the amount of space used is not equal to block size
used=34 fsc=84 avsp=7945 dtl=8064
Block 547 failed with check code 6110
--//这样我以前的计算公式就不对了。实际上是减fsc
--// dtl - used - fsc = avsp ,特此更正。
--//8064-34-84=7946 ,哎学习还是不认真,缺少交流。
--//used=34 很容易确定
--//注意freespace的偏移量150,kdbh偏移量是124,相差26.正好合适对上。
--//观察 kdbhfsbo @130 26 Freespace begin offset 也正好对上。
--//删除记录后 包括每条记录flag,lock 2个字节,共4条记录,8个字节,相加正好26+8=34.
--//简单一点 118-84=34.
4.删除恢复:
--//先还原kdbh.kdbhavsp=7946;
BBED> assign kdbh.kdbhavsp=7946;
sb2 kdbhavsp @134 7946
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0xd468, required = 0xd468
--//有了以上信息,要恢复删除记录就简单了。
1.修改flag=0x2c
2.清除fsc=0 .
3.修改tosp=avsp .
BBED> x /rncc *kdbr[0]
rowdata[66] @8162
-----------
flag@8162: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8163: 0x02
cols@8164: 0
BBED> x /rncc *kdbr[1]
rowdata[44] @8140
-----------
flag@8140: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8141: 0x02
cols@8142: 0
BBED> x /rncc *kdbr[2]
rowdata[24] @8120
-----------
flag@8120: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8121: 0x02
cols@8122: 0
BBED> x /rncc *kdbr[3]
rowdata[0] @8096
----------
flag@8096: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH)
lock@8097: 0x02
cols@8098: 0
--//执行如下:
assign dba 4,547 offset 8162=0x2c
assign dba 4,547 offset 8140=0x2c
assign dba 4,547 offset 8120=0x2c
assign dba 4,547 offset 8096=0x2c
BBED> x /4rncc *kdbr[3]
rowdata[0] @8096
----------
flag@8096: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8097: 0x00
cols@8098: 3
col 0[2] @8099: 40
col 1[10] @8102: OPERATIONS
col 2[6] @8113: BOSTON
rowdata[24] @8120
-----------
flag@8120: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8121: 0x00
cols@8122: 3
col 0[2] @8123: 30
col 1[5] @8126: SALES
col 2[7] @8132: CHICAGO
rowdata[44] @8140
-----------
flag@8140: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8141: 0x00
cols@8142: 3
col 0[2] @8143: 20
col 1[8] @8146: RESEARCH
col 2[6] @8155: DALLAS
rowdata[66] @8162
-----------
flag@8162: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8163: 0x00
cols@8164: 3
col 0[2] @8165: 10
col 1[10] @8168: ACCOUNTING
col 2[8] @8179: NEW YORK
--//ok,bbed写显示正常。
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0xd468, required = 0xd468
BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/users01.dbf
BLOCK = 547
Block Checking: DBA = 16777763, Block Type = KTB-managed data block
data header at 0x172107c
kdbchk: the amount of space used is not equal to block size
used=118 fsc=84 avsp=7946 dtl=8064
Block 547 failed with check code 6110
--//修改fsc=0.满足 dtl-used-fsc=avsp
BBED> assign ktbbh.ktbbhitl[1]._ktbitun._ktbitfsc=84
sb2 _ktbitfsc @86 0
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0xd43c, required = 0xd43c
BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/users01.dbf
BLOCK = 547
Block Checking: DBA = 16777763, Block Type = KTB-managed data block
data header at 0x172127c
kdbchk: space available on commit is incorrect
tosp=8038 fsc=0 stb=0 avsp=7946
Block 547 failed with check code 6111
--//再修改tosp=avsp。
BBED> assign kdbh.kdbhtosp=kdbh.kdbhavsp
sb2 kdbhtosp @136 7946
BBED> sum dba 4,547 apply
Check value for File 4, Block 547:
current = 0xd450, required = 0xd450
BBED> verify
DBVERIFY - Verification starting
FILE = /mnt/ramdisk/book/users01.dbf
BLOCK = 547
--//OK,现在正常了。
5.检查恢复情况:
SCOTT@book> alter system flush buffer_cache ;
System altered.
SCOTT@book> select * from deptx;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
总结:
1.修改flag=0x2c
2.清除fsc=0 .
3.修改tosp=avsp .
4.更正以前的错误:dtl - used - fsc = avsp
[20170411]bbed删除记录的恢复.txt相关推荐
- [20190130]删除tab$记录的恢复2.txt
[20190130]删除tab$记录的恢复2.txt --//前面链接写好了脚本,开始测试删除后的恢复.千万不要在生产系统做这样的测试!! --//参考链接:http://blog.itpub.net ...
- 如何查看AD域账号的删除记录
**如何查看AD域账号删除记录及恢复** 在日常AD域管理中,有时候我们不小心删除了域账号,或者我们想查看这个域账号是什么时候创建并删除的,那怎么办?是否可以恢复?其实微软本身已经为我们的账号信息做了 ...
- 删除的android电话怎么找回,通话记录删除了怎么恢复?安卓手机通话记录恢复方法...
通话记录删除了怎么恢复?安卓手机通话记录恢复方法 2018年11月08日 17:35作者:黄页编辑:黄页 分享 我们和他人通话结束后,手机上会出现通话记录,但是要是不小心把这些通话记录删除了该怎么办? ...
- 微信支付记录删除后怎么恢复?赶紧收藏这两个小技巧
微信支付记录的用途有很多,可以作为一些证据,也能作为自己开销的一些记录.特别是一些商家要依靠这些支付记录才能够清楚自己每个月的账单,但因为自己不小心的把微信支付记录给删除后怎么恢复?遇到这种情况,我们 ...
- 删除通话记录怎样恢复
删除通话记录怎样恢复?我们现在有的时候可能会因为一些比较小的原因,就会导致我们的手机通话记录被删除,那么我们若是想要找回我们删除的手机通话记录,是不是可以呢?又该怎么找回呢? 首先,若是我们有进行过备 ...
- initramfs两种方法恢复_微信会话记录删除了怎么恢复?最权威的方法在这
随着手机软件的不断更新以及长时间使用,占用的手机内存也开始越来越大,我们只能通过清理手机内存来释放多余的空间了.如果我们在清理微信的时候删除了聊天记录,那后面有需要的时候该怎么找回呢?很多朋友都会上百 ...
- 微信通话记录恢复 android,微信删除的通话记录怎么恢复?以下方法做完后该怎么做?...
2019-06-03 22:56:55 既然已删除就不好恢复 全部 2019-06-03 22:56:55 2019-06-03 22:47:32 朋友你好,微信的通话记录删除后是无法恢复的,不支持. ...
- 行车记录仪的记录怎么删除?删除记录后还能恢复吗?
行车记录仪的记录怎么删除?行车记录仪如今是每个车主的必备工具,它能记录车辆行驶途中的影像以及声音,可为交通事故提供证据,碰到专业碰瓷和拦路抢劫的的情况,行车记录仪可以提供破案的决定性证据:如事故发生现 ...
- 微信好友拉黑删除后怎么恢复聊天记录?只需三步拯救你的微信记录!
微信好友拉黑删除后怎么恢复聊天记录?现在微信是我们使用最多的聊天软件,平时年轻人在使用微信的过程中的三大步骤,添加好友聊天,一言不合拉黑删除,一气呵成操作完成之后,事后等到和好之后重新添加回来之后发现 ...
最新文章
- 阿里员工吐槽:我在阿里工作五年,面试一个小公司竟然挂了
- Deep TEN: Texture Encoding Network
- python在linux报错xe6,python出现SyntaxError: Non-ASCII character '\xe6' in file \的错误
- layoutSubviews何时被调用
- leetcode 777. Swap Adjacent in LR String | 777. 在LR字符串中交换相邻字符(双指针)
- CRM里把用户分配给一个position的执行调试
- 编写vbs脚本发送邮件
- php 目录及文件操作
- linux系统入门命令大全,Linux常用命令5 - Linux 入门常用命令_Linux教程_Linux公社-Linux系统门户网站...
- 查看设置本机共享文件 net share
- ServletContextListener作用(转)
- /usr/bin/ld: cannot find -lstdc++ -lz问题
- PCB设计常见的有那些问题
- 【QT学习之路】QThread的简单使用
- Java之棋牌游戏——编写一个斗地主洗牌发牌的程序,要求按照斗地主的规则完成洗牌发牌的过程
- 安卓如何修改dns服务器地址,安卓手机怎么修改DNS?安卓手机修改DNS服务器图文详情介绍[多图]...
- unity用visual studio写代码的时候一直显示importing assets
- 博图——HMI中的中英文切换功能
- Open vSwitch(OVS)相关问题
- 秦储一行拜访陕西省文联和陕西新华出版传媒集团
热门文章
- fedora 17 xfce 安装libreoffice
- 读阿里程序员的文章有感
- 条码标签编辑软件如何选择?
- T568A 与 T568B
- 共享服务器打不开文件csc,csc.exe 无法执行程序的异常
- 报表设计工具FastReport Online Designer V2022.1新功能全剖析
- 为什么Quora选择用Python语言?
- linux安装ssl证书步骤,centos安装SSL证书的图文教程
- python炫酷gui界面_python+tkinter+动画图片+爬虫(查询天气)的GUI图形界面设计
- PHP中获取当前请求的URL