首页 > 数据库 > Oracle > 查看block dump对应的实际值
第一步:登录数据库创建测试表
SQL> conn zc/zc
Connected.
SQL>
SQL>
SQL> create table test(id number,name varchar2(20),ctime date);
Table created.
SQL> insert into test values(5674,'zhangchao',sysdate);
1 row created.
SQL> select * from test;
ID NAME CTIME
---------- -------------------- ---------
5674 zhangchao 20-NOV-24
SQL> alter session set nls_date_format = 'yyyy/mm/dd hh24:mi:ss' ;
Session altered.
SQL> select * from test;
ID NAME CTIME
---------- -------------------- -------------------
5674 zhangchao 2024/11/20 17:47:29
SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) fno,dbms_rowid.rowid_block_number(rowid) blkno from test;
FNO BLKNO
---------- ----------
7 347
第二步:根据块id dump 改数据块
SQL> alter system dump datafile 7 block 347;
System altered.
Trace file /u02/app/oracle/diag/rdbms/gbk/gbk/trace/gbk_ora_7952.trc
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.22.0.0.0
Build label: RDBMS_19.22.0.0.0DBRU_LINUX.X64_231229
ORACLE_HOME: /u02/app/oracle/product/19.9.0/db_1
System name: Linux
Node name: localhost.localdomain
Release: 4.18.0-193.el8.x86_64
Version: #1 SMP Fri Mar 27 14:35:58 UTC 2020
Machine: x86_64
CLID: P
Instance name: gbk
Redo thread mounted by this instance: 1
Oracle process number: 50
Unix process pid: 7952, image: oracle@localhost.localdomain (TNS V1-V3)
*** 2024-11-20T17:49:47.105940-08:00
*** SESSION ID:(462.62967) 2024-11-20T17:49:47.105974-08:00
*** CLIENT ID:() 2024-11-20T17:49:47.105995-08:00
*** SERVICE NAME:(SYS$USERS) 2024-11-20T17:49:47.106015-08:00
*** MODULE NAME:(SQL*Plus) 2024-11-20T17:49:47.106036-08:00
*** ACTION NAME:() 2024-11-20T17:49:47.106056-08:00
*** CLIENT DRIVER:(SQL*PLUS) 2024-11-20T17:49:47.106076-08:00
Start dump data blocks tsn: 4 file#:7 minblk 347 maxblk 347
Block dump from cache:
Dump of buffer cache at level 3 for pdb=0 tsn=4 rdba=29360475
BH (0x9a3e5b18) file#: 7 rdba: 0x01c0015b (7/347) class: 1 ba: 0x9a1c2000
set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0
dbwrid: 0 obj: 74213 objn: 74213 tsn: [0/4] afn: 7 hint: f
hash: [0x6d3cdfc0,0x6d3cdfc0] lru: [0x9a3e5d68,0x9a3e5a98]
obj-flags: object_ckpt_list
ckptq: [0x9a3e5848,0x9bfe7030] fileq: [0x9a3e5858,0x9a3e67d0]
objq: [0x9a3e6768,0x9a3e5ac0] objaq: [0x9a3e6778,0x9a3e5ad0]
st: XCURRENT md: NULL fpin: 'ktspbwh2: ktspfmdb' fscn: 0x2162e2 tch: 4
flags: buffer_dirty
LRBA: [0xa.5b2c0.0] LSCN: [0x2162e2] HSCN: [0x2162e2] HSUB: [1]
Printing buffer operation history (latest change first): (cnt 4)
01. sid:14 L464:chg1_mn:bic:FMS 02. sid:14 L778:chg1_mn:bis:FMS
03. sid:14 L353:gcur:set:MEXCL 04. sid:14 L464:chg1_mn:bic:FMS
05. sid:14 L614:chg1_mn:bis:FBD 06. sid:14 L922:klbc:sw:cq
07. sid:14 L778:chg1_mn:bis:FMS 08. sid:14 L004:new:acq:pin
09. sid:14 L229:bnew:bic:FEN 10. sid:14 L143:new:mk:EXCL
11. sid:14 L177:kcbnew:bic:FSI 12. sid:14 L982:new:bic:FBS
13. sid:14 L176:kcbnew:bic:FSQ 14. sid:14 L122:zgb:set:st
15. sid:14 L830:olq1:clr:WRT+CKT 16. sid:14 L951:zgb:lnk:objq
buffer tsn: 4 rdba: 0x01c0015b (7/347)
scn: 0x2162e2 seq: 0x03 flg: 0x00 tail: 0x62e20603
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x000000009A1C2000 to 0x000000009A1C4000
09A1C2000 0000A206 01C0015B 002162E2 00030000 [....[....b!.....]
09A1C2010 00000000 00000001 000121E5 002162E2 [.........!...b!.]
09A1C2020 00008000 00320002 01C00158 000B0003 [......2.X.......]
09A1C2030 000003F1 01000305 000D00E6 00000001 [................]
09A1C2040 00000000 00000000 00000000 00000000 [................]
Repeat 1 times
09A1C2060 00000000 00010100 0014FFFF 1F6B1F7F [..............k.]
09A1C2070 00001F6B 1F7F0001 00000000 00000000 [k...............]
09A1C2080 00000000 00000000 00000000 00000000 [................]
Repeat 501 times
09A1C3FE0 2C000000 C2030301 7A094B39 676E6168 [...,....9K.zhang]
09A1C3FF0 6F616863 0B7C7807 1E301214 62E20603 [chao.x|...0....b]
Block header dump: 0x01c0015b
Object id on Block? Y
seg/obj: 0x121e5 csc: 0x00000000002162e2 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1c00158 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.00b.000003f1 0x01000305.00e6.0d ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
bdba: 0x01c0015b
data_block_dump,data header at 0x9a1c2064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x9a1c2064
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f7f
avsp=0x1f6b
tosp=0x1f6b
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f7f
block_row_dump:
tab 0, row 0, @0x1f7f
tl: 25 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [ 3] c2 39 4b
col 1: [ 9] 7a 68 61 6e 67 63 68 61 6f
col 2: [ 7] 78 7c 0b 14 12 30 1e
end_of_block_dump
Dump of buffer cache for pdb 0 tsn 4 rdba 0x1c0015b at level 2 done.
Block dump from disk:
buffer tsn: 4 rdba: 0x01c0015b (7/347)
scn: 0x0 seq: 0x01 flg: 0x05 tail: 0x00000001
frmt: 0x02 chkval: 0xa79b type: 0x00=unknown
Hex dump of block: st=0, typ_found=0
Dump of memory from 0x00007F91FBD83000 to 0x00007F91FBD85000
7F91FBD83000 0000A200 01C0015B 00000000 05010000 [....[...........]
7F91FBD83010 0000A79B 00000000 00000000 00000000 [................]
7F91FBD83020 00000000 00000000 00000000 00000000 [................]
Repeat 508 times
7F91FBD84FF0 00000000 00000000 00000000 00000001 [................]
Dump of memory from 0x00007F91FBD83014 to 0x00007F91FBD84FFC
7F91FBD83010 00000000 00000000 00000000 [............]
7F91FBD83020 00000000 00000000 00000000 00000000 [................]
Repeat 508 times
7F91FBD84FF0 00000000 00000000 00000000 [............]
End dump data blocks tsn: 4 file#: 7 minblk 347 maxblk 347
121e5 -->10进制 74213
–分析ump
根据seg/obj: 0x121e5 我们先确认是这个对象
SQL> select object_id from dba_objects where owner='ZC' and object_name='TEST';
OBJECT_ID
----------
74213
SQL> select to_number('121e5','xxxxxxx') from dual;
TO_NUMBER('121E5','XXXXXXX')
----------------------------
74213
select objd,ts#,status from v$bh where file#=7 and block#=347;
OBJD TS# STATUS
---------- ---------- ----------
74213 4 xcur
根据bdba: 0x01c0015b 也可以确认到那个块
variable dba varchar2(30)
exec :dba := dbms_utility.make_data_block_address(7,347);
SQL> variable dba varchar2(30)
exec :dba := dbms_utility.make_data_block_address(7,347);
SQL>
PL/SQL procedure successfully completed.
SQL>
SQL> print dba
DBA
--------------------------------------------------------------------------------
29360475
SQL> select to_char(29360475,'xxxxxxxxxxx') from dual;
TO_CHAR(2936
------------
1c0015b
可以看到正反向验证都没有问题
dump中的数据情况
col 0: [ 3] c2 39 4b
col 1: [ 9] 7a 68 61 6e 67 63 68 61 6f
col 2: [ 7] 78 7c 0b 14 12 30 1e
第三步:bbed 分析
通过bbed 查看数据情况
BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0] @8163 0x2c
BBED> x /r
rowdata[0] @8163
----------
flag@8163: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8164: 0x01
cols@8165: 3
col 0[3] @8166: 0xc2 0x39 0x4b
col 1[9] @8170: 0x7a 0x68 0x61 0x6e 0x67 0x63 0x68 0x61 0x6f
col 2[7] @8180: 0x78 0x7c 0x0b 0x14 0x12 0x30 0x1e
BBED> x /rncd
rowdata[0] @8163
----------
flag@8163: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8164: 0x01
cols@8165: 3
col 0[3] @8166: 5674
col 1[9] @8170: zhangchao
col 2[7] @8180: 120 124 11 20 18 48 30
BBED> x /rnct
rowdata[0] @8163
----------
flag@8163: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8164: 0x01
cols@8165: 3
col 0[3] @8166: 5674
col 1[9] @8170: zhangchao
col 2[7] @8180: 20-NOV-24
第四步: 转换数据
SQL> select dbms_stats.CONVERT_RAW_TO_VARCHAR2('7a68616e676368616f') FROM dual;
DBMS_STATS.CONVERT_RAW_TO_VARCHAR2('7A68616E676368616F')
--------------------------------------------------------------------------------
zhangchao
SQL> select dbms_stats.CONVERT_RAW_TO_DATE('787c0b1412301e') from dual ;
DBMS_STATS.CONVER
-----------------
20241120 17:47:29
SQL> select dbms_stats.CONVERT_RAW_TO_NUMBER('c2394b') FROM dual;
DBMS_STATS.CONVERT_RAW_TO_NUMBER('C2394B')
------------------------------------------
5674
SQL> select * from test;
ID NAME CTIME
---------- -------------------- ---------
5674 zhangchao 20-NOV-24
12c 开始 有了下面的函数
DBMS_STATS.CONVERT_RAW_TO_VARCHAR2
DBMS_STATS.CONVERT_RAW_TO_DATE
DBMS_STATS.CONVERT_RAW_TO_NUMBER
DBMS_STATS.CONVERT_RAW_TO_BIN_FLOAT
DBMS_STATS.CONVERT_RAW_TO_BIN_DOUBLE
DBMS_STATS.CONVERT_RAW_TO_NVARCHAR
DBMS_STATS.CONVERT_RAW_TO_ROWID
11g 以下版本
create or replace function stats_raw_to_date (p_in raw) return date is
v_date date;
v_char varchar2(25);
begin
dbms_stats.CONVERT_RAW_VALUE(p_in, v_date);
return v_date;
exception
when others then return null;
end;
/
create or replace function zero_date return date deterministic is
v_date date;
begin
dbms_stats.CONVERT_RAW_VALUE('64640000010101', v_date);
return v_date;
end;
/
CREATE OR REPLACE FUNCTION FUN_DISPLAY_RAW_LHR(P_RAWVAL RAW,
P_TYPE VARCHAR2)
RETURN VARCHAR2 IS
V_NUMBER NUMBER;
V_VARCHAR2 VARCHAR2(32);
V_DATE DATE;
V_NVARCHAR2 NVARCHAR2(32);
V_ROWID ROWID;
V_CHAR CHAR(32);
BEGIN
IF (P_TYPE = 'NUMBER' OR P_TYPE = 'FLOAT') THEN
DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_NUMBER);
RETURN TO_CHAR(V_NUMBER);
ELSIF (P_TYPE = 'VARCHAR2') THEN
DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_VARCHAR2);
RETURN TO_CHAR(V_VARCHAR2);
ELSIF (P_TYPE = 'DATE' OR P_TYPE LIKE 'TIMESTAMP%') THEN
DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_DATE);
RETURN TO_CHAR(V_DATE);
ELSIF (P_TYPE = 'NVARCHAR2') THEN
DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_NVARCHAR2);
RETURN TO_CHAR(V_NVARCHAR2);
ELSIF (P_TYPE = 'ROWID') THEN
DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_ROWID);
RETURN TO_CHAR(V_ROWID);
ELSIF (P_TYPE = 'CHAR') THEN
DBMS_STATS.CONVERT_RAW_VALUE(P_RAWVAL, V_CHAR);
RETURN TO_CHAR(V_CHAR);
ELSIF (P_TYPE = 'RAW') THEN
RETURN TO_CHAR(P_RAWVAL);
ELSE
RETURN 'UNKNOWN DATATYPE!';
END IF;
EXCEPTION
WHEN OTHERS THEN
RETURN 'ERRORS!';
END FUN_DISPLAY_RAW_LHR;
/
SQL> select FUN_DISPLAY_RAW_LHR('c2394b','NUMBER') LOW_VALUE1 from dual;
LOW_VALUE1
--------------------------------------------------------------------------------
5674
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69924215/viewspace-3050837/ ,如需转载,请注明出处,否则将追究法律责任。