Oracle bbed 实用示例-----修改Data内容、恢复delete的rows
bbed 可以在db open 状态来进行修改,但是建议在做任何修改操作之前先shutdown db。 这样避免checkpoint 进程重写bbed 对block 的修改。 也避免oracle 在bbed 修改完成之前读block 或者申明block 为corrupt。
一. 示例: 修改Data内容
1.1连接bbed
[oracle@ora10 ~]$ bbed parfile=/u01/app/oracle/bbed/bbed.par
Password: BBED: Release 2.0.0.0.0 - Limited Production on Thu Jan 15 17:27:30 2015 Copyright (c) 1982, 2005, Oracle. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED>
1.2查看要修改的内容
SQL> conn tv/tv
Connected.
SQL> select * from t01 where name='zz'; no rows selected SQL> select * from t01 where name='ww'; ID NAME
---------- --------------------------------
1 ww SQL>
注意: bbed 的修改仅仅是对原有位置内容的一个替换
1.3 对应block 的信息如下
SQL> select
2 rowid,
3 dbms_rowid.rowid_relative_fno(rowid)rel_fno, --当数据库文件数小于1024时,rel_fno和file id是相同的
4 dbms_rowid.rowid_block_number(rowid)blockno,
5 dbms_rowid.rowid_row_number(rowid) rowno
6 from t01
7 where name='ww'; ROWID REL_FNO BLOCKNO ROWNO
------------------ ---------- ---------- ----------
AAAMfRAAFAAAAy0AFM 5 3252 332 SQL>
1.4 设置当前文件及数据块
BBED> set dba 5,3252 offset 0
DBA 0x01400cb4 (20974772 5,3252)
OFFSET 0
或 BBED> set file 5
FILE# 5
BBED> set block 3252
BLOCK# 3252
BBED>
1.5 查找关键字ww,确定其在block中的偏移量offset
BBED> find /c ww
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5530 to 6041 Dba:0x01400cb4
------------------------------------------------------------------------
77772c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002 <32 bytes per line> BBED>
1.6 dump数据块的内容
BBED> dump /v dba 5,3252 offset 5530 count 128
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5530 to 5657 Dba:0x01400cb4
-------------------------------------------------------
77772c00 02018002 79792c00 02018002 l ww,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,..... <16 bytes per line> BBED> 注意这里面的Offsets:5530 to 5657, 它指的是这一行的一个地址。其中 第一个w 的offset 是5530 即dump出的第一个77
第二个w 的offset 是5531 即dump出的第二个77
1.7 修改block,将ww 换成xz
BBED> modify /c xz dba 5,3252 offset 5530
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5530 to 5657 Dba:0x01400cb4
------------------------------------------------------------------------
787a2c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002 <32 bytes per line> --dump修改后的数据
BBED> dump /v dba 5,3252 offset 5530 count 128
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5530 to 5657 Dba:0x01400cb4
-------------------------------------------------------
787a2c00 02018002 79792c00 02018002 l xz,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
79792c00 02018002 79792c00 02018002 l yy,.....yy,..... <16 bytes per line> BBED>
1.8 应用变更
BBED> sum dba 5,3252 apply
Check value for File 5, Block 3252:
current = 0x5730, required = 0x5730 BBED>
1.9 回到sql窗口 刷新缓存,查看修改后的数据
SQL> alter system flush buffer_cache; System altered. SQL> select * from tv.t01 where name='ww'; no rows selected SQL> select * from tv.t01 where name='xz'; ID NAME
---------- --------------------------------
1 xz SQL>
注:由于是实验,修改数据时并没有关闭数据库
二. 示例:恢复delete 的rows
当row 被delete 的时候,实际上data 并没有被remove,只是将该row 标记为delete,然后其对应的空间被统计为free space。 row 的status 存在每个row的row header里。Row Header 包含Row Flag,Lock Byte(ITL)和column Count。Row Header 结构:
|
其中Row Flag占用1个byte,并且以bitmask 来保存。bitmask 的解释如下:
|
2.1 dump 一个block,看一个row Flag
SQL> conn /as sysdba
Connected.
SQL> alter system dump datafile 5 block 3252; System altered. SQL> oradebug setmypid
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/admin/orcl/udump/orcl_ora_6106.trc
SQL>!more /u01/app/oracle/admin/orcl/udump/orcl_ora_6106.trc ---有关row的信息如下
block_row_dump:
tab 0, row 0, @0x1db0
tl: 8 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 1] 80
col 1: [ 2] 79 79
tab 0, row 1, @0x1db8
tl: 8 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 1] 80
col 1: [ 2] 79 79
tab 0, row 2, @0x1dc0
tl: 8 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [ 1] 80
col 1: [ 2] 79 79
tab 0, row 3, @0x1dc8
........
........
tab 0, row 332, @0x152f --第332条数据
tl: 9 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [ 2] c1 02
col 1: [ 2] 78 7a --第332条数据的name值78 7a 为 'xz'
end_of_block_dump
注意这里的fb: --H-FL--。 其有8个选项,每个值分别与bitmask 对应。
如果一个row 没有被删除,那么它的Flag 表示为:--H-FL--. 这里的字母分别代表属性的首字母。其对应的值:32 + 8 + 4 =44 or 0x2c
如果一个row 被delete了,那么它的Flag 表示为:--HDFL--. bitmask里的deleted 被设置为16. 其对应的值:32 + 16 + 8 + 4 = 60 or 0x3c
2.2 验证:删除数据
SQL> conn tv/tv
Connected.
SQL> delete from t01 where name ='xz'; 1 row deleted. SQL> commit; Commit complete. SQL> --dump数据块查看Flag的标记:
tab 0, row 332, @0x152f --第332条数据
tl: 2 fb: --HDFL-- lb: 0x1 --Flag 变为:--HDFL--
end_of_block_dump
2.3 现在用bbed 将删除的row 1 内容找回来
- 第332条数据仍然存在数据块中
- 找到第332条数据的row header 位置
- 改变row header中的Flag值即可
1.查找行记录的位置
BBED> set file 5
FILE# 5 BBED> set block 3252
BLOCK# 3252 BBED> find /c xz
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5530 to 6041 Dba:0x01400cb4
------------------------------------------------------------------------
787a2c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
......
<32 bytes per line> BBED> 'xz'在块内的偏移量为5530
2.查看row directory
BBED> print kdbr
sb2 kdbr[0] @118 7600
sb2 kdbr[1] @120 7608
sb2 kdbr[2] @122 7616
.......
sb2 kdbr[332] @782 5423
3.查看第332条记录的起始位置:
BBED> print *kdbr[332] ---不要忘记'*'
rowdata[0]
----------
ub1 rowdata[0] @5523 0x3c BBED> 第332条记录在块内偏移量为5523,而'xz'在块内的偏移量为5530
4.将第332条记录dump出来
BBED> dump /v dba 5,3252 offset 5523 count 32
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5523 to 5554 Dba:0x01400cb4
-------------------------------------------------------
3c010202 c1020278 7a2c0002 01800279 l <....xz,.....y
792c0002 01800279 792c0002 01800279 l y,.....yy,.....y <16 bytes per line> BBED> 3c 5523 --Row Flag
01 5524 --Lock Byte
02 5525 --列数
02 5526 --列长度
c1 5527
02 5528 --列长度
02 5529
78 5530 --'x'
7a 5531 --'z'
5.修改Row Flag的值 将3c 改为 2c
BBED> modify /x 2c offset 5523
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
Block: 3252 Offsets: 5523 to 5554 Dba:0x01400cb4
------------------------------------------------------------------------
2c010202 c1020278 7a2c0002 01800279 792c0002 01800279 792c0002 01800279 <32 bytes per line> BBED> BBED> sum apply
Check value for File 5, Block 3252:
current = 0x0e90, required = 0x0e90 BBED>
5.验证结果
--清缓存
SQL> alter system flush buffer_cache; System altered. SQL> conn tv/tv
Connected.
SQL> select * from t01 where name='xz'; ID NAME
---------- --------------------------------
1 xz SQL> --delete 的数据已经恢复出来。
Oracle bbed 实用示例-----修改Data内容、恢复delete的rows的更多相关文章
- Oracle bbed 实用示例-----File Header Reset
一.查看当前环境 1.1 当前控制文件中的SCN号 [oracle@ora10 ~]$ sqlplus /nolog SQL :: Copyright (c) , , Oracle. All righ ...
- [Oracle]Oracle数据库数据被修改或者删除恢复数据
1.SELECT * FROM CT_FIN_RiskItem--先查询表,确定数据的确不对(cfstatus第一行缺少)2.select * from CT_FIN_RiskItem as of t ...
- ORACLE数据库数据被修改或者删除恢复数据(闪回)
1. SELECT * FROM CT_FIN_RiskItem --先查询表,确定数据的确不对 (cfstatus 第一行缺少) 2. select * from CT_FIN_RiskItem ...
- Oracle bbed使用说明2---常用命令
一.BBED常用命令说明 先看帮助的说明 BBED> help all SET DBA [ dba | file#, block# ] SET FILENAME 'filename' SET F ...
- Oracle BBED 工具 说明
一. BBED介绍 有关BBED 详细使用说明的pdf文档,也是从网上下载的: http: Thename bbed is an acro ...
- Linux 中 17 个 tar 命令实用示例
Tar(Tape ARchive,磁带归档的缩写,LCTT 译注:最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的目录)是类 Unix 系统中使用最广泛的命令,用于归 ...
- 17 个 tar 命令实用示例【转】
Tar(Tape ARchive,磁带归档的缩写,LCTT 译注:最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的目录)是类 Unix 系统中使用最广泛的命令,用于归 ...
- Oracle LISTENER 主机名修改为IP地址后LISTENER无法监听到实例 oracle监听错误与hosts文件配置
为什么listener.ora文件里面HOST后面到底应该输入IP地址还是主机名.我的经验告诉我,这边最好使用主机名.很多的时候,一个机器绑定的不只一个IP地址,如HOST后面是IP地址,那么ORAC ...
- oracle BBED 直接改动数据库block块
1.BBED配置 1)将相应文件放到$ORACLE_HOME/rdbms/mesg和$ORACLE_HOME/rdbms/lib中: --将lib中bbedus.msb和bbedus.msg ...
随机推荐
- 【Shell脚本学习9】Shell替换:Shell变量替换,命令替换,转义字符
如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...
- 【开源项目7】Android视图注入库:butterknife
介绍 ButterKnife通过@InjectView和视图的ID注解的变量去找到并自动转换为你布局上相应的布局视图. class ExampleActivity extends Activity { ...
- iOS 画图讲解
5.画图 (1)画线 //绘图代码写在drawRect里,view加载完成,需要显示的时候调用 //1.获取图形上下文 2.创建路径 3.把图形放入上下文 4.渲染上下文 //drawRect的rec ...
- linux-启动停止重启shell 简单shell示例
停止: #!/bin/bashpid=`ps -ef|grep /opt/lampp|grep -v grep|awk '{print $2}'|wc -l`b=0if [ $pid -gt $b ] ...
- 转: android app进程保活的文章列表
1. Android 后台任务型App多进程架构演化 http://www.jianshu.com/p/4ac1f373e8cd 2. 关于 Android 进程保活,你所需要知道的一切 http:/ ...
- Mybatis源码解析(一)(2015年06月11日)
一.简介 先看看Mybatis的源码结构图,Mybatis3.2.7版本包含的包共计19个,其他版本可能会少. 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为 ...
- C# 中 static 的用法
说明1: 表示静态的关键字说明此对象在应用中只存在一份 说明2:C# 是面向对象的程序设计语言,每一个函数都属于一个类. 当 一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保 ...
- 一场ACM一场梦——我的一年
听着裁判倒计时比赛结束,看着全场鲜艳的气球,今天的结果是the last result i can image. 过几天给校赛出题,去年此时的我,还从来没有过竞赛的经验,只因为在大学开学前看了一点点c ...
- SQLServer Ansi_Padding的用法
关于Ansi_Padding的用法 1.当设置为ON时,不剪裁字符值中插入到varchar列的尾随空格和二进制值中插入到varbinary列的尾随零.不将值按列的长度进行填充. 2.当设置为OFF时, ...
- (转)Yale CAS + .net Client 实现 SSO(2)
第一部分:安装配置 Tomcat 第二部分:安装配置 CAS 1. 下载 CAS 及.NET CAS client. CAS下载地址:http://www.jasig.org/cas/download ...