前天看了一个案例因为丢了表上的数据,从索引block中找回了值

转储了oracle block的值,如何得到它真正表中的值,也算 是dump(val,16)的逆运算

sys@ORCL>conn anbob/anbob
Connected.
anbob@ORCL>create table testdump(id number,name varchar2(10),ctime date);

Table created.

anbob@ORCL>insert into testdump values(918,’anbob’,sysdate);

1 row created.

anbob@ORCL>select * from testdump;

ID NAME CTIME
———- ———- ——————-
918 anbob 2012-05-04 09:39:23

anbob@ORCL>select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.rowid_block_number(rowid) blkno
2 from testdump;

FNO BLKNO
———- ———-
15 2676436

sys@ORCL>alter system dump datafile 15 block 2676436;

System altered.

trace file 的部分内容

Start dump data blocks tsn: 13 file#: 15 minblk 2676436 maxblk 2676436
buffer tsn: 13 rdba: 0x03e8d6d4 (15/2676436)
Block header dump: 0x03e8d6d4
Object id on Block? Y
seg/obj: 0xf58a9 csc: 0x03.74dc2b6 itc: 2 flg: E typ: 1 – DATA
brn: 0 bdba: 0x3e8d6d1 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.013.0000eb55 0x00800060.58d9.08 –U- 1 fsc 0x0000.074dc31d
0x02 0x0000.000.00000000 0x00000000.0000.00 —- 0 fsc 0x0000.00000000

data_block_dump,data header at 0xbe72464
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x0be72464
bdba: 0x03e8d6d4
76543210
flag=——–
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f83
avsp=0x1f6f
tosp=0x1f6f
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f83
block_row_dump:
tab 0, row 0, @0x1f83
tl: 21 fb: –H-FL– lb: 0x1 cc: 3
col 0: [ 3] c2 0a 13
col 1: [ 5] 61 6e 62 6f 62
col 2: [ 7] 78 70 05 04 0a 28 18
end_of_block_dump
End dump data blocks tsn: 13 file#: 15 minblk 2676436 maxblk 2676436

–分析ump
根据seg/obj: 0xf58a9我们先确认是这个对象
sys@ORCL>select object_id from dba_objects where owner=’ANBOB’ and object_name=’TESTDUMP';

OBJECT_ID
———-
1005737

sys@ORCL>select to_number(‘f58a9′,’xxxxxxx’) from dual;

TO_NUMBER(‘F58A9′,’XXXXXXX’)
—————————-
1005737

sys@ORCL>select objd,ts#,status from v$bh where file#=15 and block#=2676436;

OBJD TS# STATUS
———- ———- ——-
1005737 13 xcur

根据bdba: 0x03e8d6d4 也可以确认到那个块
anbob@ORCL>variable dba varchar2(30)
anbob@ORCL>exec :dba := dbms_utility.make_data_block_address(15,2676436);

PL/SQL procedure successfully completed.

anbob@ORCL>print dba

DBA
——————————–
65590996

anbob@ORCL>select to_char(65590996,’xxxxxxxxxxx’) from dual;

TO_CHAR(6559
————
3e8d6d4

现在我们向回还原表中的值

col 0: [ 3] c2 0a 13
col 1: [ 5] 61 6e 62 6f 62
col 2: [ 7] 78 70 05 04 0a 28 18

第一列为number,看到老白有这种推算方法
0a 转换成10进制-1,13同理,然后再合并,我们试一下

anbob@ORCL>select to_number(‘0a’,’xxxxxxx’)-1||to_number(’13’,’xxxxx’)-1 from dual;

TO_NUMBER(‘0A’,’XXXXXXX’)-1||TO_NUMBER(’13’,’XXXXX’)-1
——————————————————
918
我们再试下接着推算负数
anbob@ORCL>select dump(-98,16) from dual;

DUMP(-98,16)
——————–
Typ=2 Len=3: 3e,3,66

anbob@ORCL>select dump(-98571,16) from dual;

DUMP(-98571,16)
—————————
Typ=2 Len=5: 3c,5c,10,1e,66

anbob@ORCL>select 101-to_number(‘3′,’xxxxxxx’) from dual;

101-TO_NUMBER(‘3′,’XXXXXXX’)
—————————-
98

anbob@ORCL>select 101-to_number(‘5c’,’xxxxxxx’),101-to_number(’10’,’xxxxxxx’),101-to_number(‘1e’,’xxxxxxx’) from dual;

101-TO_NUMBER(‘5C’,’XXXXXXX’) 101-TO_NUMBER(’10’,’XXXXXXX’) 101-TO_NUMBER(‘1E’,’XXXXXXX’)
—————————– —————————– —————————–
9 85 71

往回走是去最后的66,和第一组3e中间用101-(16输为10进制)再组合再一起

有点意思,放开oracle的内部原理不说,其实我们可以用一个ORACLE的函数很方便就可以算出
anbob@ORCL>SELECT utl_raw.cast_to_number(replace(‘3c,5c,10,1e,66′,’,’)) value FROM dual;

VALUE
———-
-98571

anbob@ORCL>SELECT utl_raw.cast_to_number(replace(‘c2 0a 13′,’ ‘)) value FROM dual;

VALUE
———-
918

第二列为字符col 1: [ 5] 61 6e 62 6f 62
对于字符就是把每位ascII码转换为16进制
anbob@ORCL>select chr(to_number(’61’,’xxxxxx’)) from dual;

CH

a

anbob@ORCL>select chr(to_number(‘6e’,’xxxxxx’)) from dual;

CH

n

anbob@ORCL>select chr(to_number(’62’,’xxxxxx’)) from dual;

CH

b

anbob@ORCL>select utl_raw.CAST_TO_VARCHAR2(‘616e626f62′) from dual;

anbob@ORCL>select utl_raw.CAST_TO_VARCHAR2(‘616e626f62′) from dual;

UTL_RAW.CAST_TO_VARCHAR2(‘616E626F62′)
—————————————————-
anbob

第三列是date类型col 2: [ 7] 78 70 05 04 0a 28 18 实值为2012-05-04 09:39:23
anbob@ORCL>select to_number(val16,’xxxxx’) val10 from (select regexp_substr(’78 70 05 04 0a 28 18′,'[^ ]+’,1,rownum) val16 from dual connect by rownum<=7);

VAL10
———-
120
112
5
4
10
40
24

7 rows selected.

年份-100,月日原值,时分秒-1再组合

note:
dump block 中只会记录col 值和长度,而不会记录col datatype,列类型在数据字典中。

还原data block dumps实际值的更多相关文章

  1. Data Block Compression

    The database can use table compression to eliminate duplicate values in a data block. This section d ...

  2. Data Block -- Uncompressed

    Overview of Data Blocks Oracle Database manages the logical storage space in the data files of a dat ...

  3. Hadoop EC 踩坑 :data block 缺失导致的 HDFS 传输速率下降

    环境:hadoop-3.0.2 + 11 机集群 + RS-6-3-1024K 的EC策略 状况:某天,往 HDFS 上日常 put 业务数据时,发现传输速率严重下降 分析: 检查集群发现,在之前的传 ...

  4. oracle --(一)数据块(data Block)

    基本关系:数据库---表空间---数据段---分区---数据块 数据块(data Block)一.数据块Block是Oracle存储数据信息的最小单位.这里说的是Oracle环境下的最小单位.Orac ...

  5. MySQL frm+ibd文件还原data的办法【数据恢复】

    MySQL frm+ibd文件还原data的办法[数据恢复] 此方法只适合innodb_file_per_table          = 1 当误删除ibdata 该怎么办? 如下步骤即可恢复: 1 ...

  6. Populating Tabular Data Block Manually Using Cursor in Oracle Forms

    Suppose you want to populate a non-database data block with records manually in Oracle forms. This t ...

  7. ORA-01578 data block corrupted 数据文件损坏 与 修复 (多为借鉴 linux)

    好吧,先说说造成崩溃的原因: 使用redhat 5.9 Linux 作为数据库服务器, 周五数据库正在使用中,硬关机造成数据库文件部分损坏(周一上班时,应用程序启动不起来,查看日志文件时,发现一个数据 ...

  8. ORA-01578 ORACLE data block corrupted (file # 29, block # 2889087)

    BW数据库后台报错如下:F:\oracle\SBP\saptrace\diag\rdbms\sbp\sbp\trace ORA-01578: ORACLE data block corrupted ( ...

  9. 模拟ORA-26040: Data block was loaded using the NOLOGGING option

    我们知道通过设置nologging选项.能够加快oracle的某些操作的运行速度,这在运行某些维护任务时是非常实用的,可是该选项也非常危急,假设使用不当,就可能导致数据库发生ORA-26040错误. ...

随机推荐

  1. 【转】Android源代码编译命令m/mm/mmm/make分析--不错

    原文网址:http://blog.csdn.net/luoshengyang/article/details/19023609 在前文中,我们分析了Android编译环境的初始化过程.Android编 ...

  2. sql日志框架log4jdbc的AOP式使用

    log4jdbc.log4j2 参考:1.  http://badqiu.iteye.com/blog/743100 2.  https://code.google.com/p/log4jdbc/ 3 ...

  3. JavaScript面向对象继承方法

    JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是JavaScript的类型非常松散,也没有编译器.这样一来 ...

  4. windows mobile 6.5 隐藏 左下角(左上角)的开始按钮 叉号关闭按钮

    其实做起来很简单,但是国内的网站就是找不到. 1.开始按钮原来的界面是这样的: windows mobile 6.0界面: windows mobile 6.5.X界面: 修改一个windows mo ...

  5. MediaInfo源代码分析 2:API函数

    本文主要分析MediaInfo的API函数.它的API函数位于MediaInfo.h文件中的一个叫做MediaInfo的类中. 该类如下所示,部分重要的方法已经加上了注释: //MediaInfo类 ...

  6. jquery 1.9里面已经删除了toggle(fn1, fn2)函数

    转自:http://blog.sina.com.cn/s/blog_50042fab0101c7a9.html jquery 1.9里面已经删除了toggle(fn1, fn2)函数: 引用 Note ...

  7. C#环境下的数值计算库:MathNet

    下面用一个简单的例子来说明MathNet的使用方法: 1. 进入MathNet官网找到数值计算库Math.NET Iridium(Numerics)并下载: 2. 将下载的文件解压缩,在目录下的Bin ...

  8. (转)自适应网页设计(或称为响应式web设计)(Responsive Web Design)

    随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...

  9. UVA 297 Quadtrees(四叉树建树、合并与遍历)

    <span style="font-size: 18pt; font-family: Arial, Helvetica, sans-serif; background-color: r ...

  10. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...