前言

BBED 是 Oracle 提供的一个用于修改数据块的工具,可以用于修改数据块的内容,比如修改数据块中的数据,修改数据块的头部信息等。BBED 是一个很强大的工具,但是使用 BBED 也是有风险的,因为 BBED 可以直接修改数据块的内容,如果不小心修改了数据块的内容,可能会导致数据库的损坏。因此,在使用 BBED 之前,一定要慎重考虑,最好在测试环境中使用 BBED。

记录一下使用 BBED 的一些常用命令

查看帮助

bbed 的 help 命令使用方法和 impdp 类似,可以通过 help=yes 参数查看所有的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─[✗]─[oracle@oracle11g]─[~]
└──╼ $ bbed help=yes
PASSWORD - Required parameter
FILENAME - Database file name
BLOCKSIZE - Database block size
LISTFILE - List file name
MODE - [browse/edit]
SPOOL - Spool to logfile [no/yes]
CMDFILE - BBED command file name
LOGFILE - BBED log file name
PARFILE - Parameter file name
BIFILE - BBED before-image file name
REVERT - Rollback changes from BIFILE [no/yes]
SILENT - Hide banner [no/yes]
HELP - Show all valid parameters [no/yes]

设置 bbed 参数文件

可以通过设置 bbed 的参数文件,避免每次输入参数

如果调试同一个 block 可以直接将 set 参数的选项写入参数文件中,通过测试并不能直接在参数文件中设置 set 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vim ~/.bash_profile

alias bbed='rlwrap  /u01/app/oracle/product/11.2.0/db/rdbms/lib/bbed parfile=/home/oracle/bbed.par password=blockedit'

┌─[oracle@oracle11g]─[~]
└──╼ $ cat bbed.par
blocksize=8192
listfile=/home/oracle/filelist.bbed

## filelist 的内容
WXJ@darkdb 2269,15367 SQL> select file#||chr(9)||name||chr(9)||bytes from v$datafile;

FILE#||CHR(9)||NAME||CHR(9)||BYTES
----------------------------------------------------------------------------------------------------
1       /oradata/darkdb/system01.dbf    817889280
2       /oradata/darkdb/sysaux01.dbf    576716800
3       /oradata/darkdb/undotbs01.dbf   519045120
4       /oradata/darkdb/users01.dbf     5242880
5       /oradata/darkdb/data01.dbf      1073741824


┌─[oracle@oracle11g]─[~]
└──╼ $ cat filelist.bbed
1       /oradata/darkdb/system01.dbf    817889280
2       /oradata/darkdb/sysaux01.dbf    576716800
3       /oradata/darkdb/undotbs01.dbf   519045120
4       /oradata/darkdb/users01.dbf     5242880
5       /oradata/darkdb/data01.dbf      1073741824


创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
create tablespace data datafile '/oradata/darkdb/data01.dbf' size 1G autoextend off;
alter user wxj default tablespace data;

create table t1 ( c1 number, c2 varchar2(100) );
insert into t1 values ( 1, 'hello' );
insert into t1 values ( 2, 'world' );
commit;

select * from t1;
C1 | C2
----------
1  | hello
2  | world

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid), c1, c2 from t1;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) | DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) | C1 | C2
----------------------------------------------------------------------------------------
5                                    | 132                                  | 3  | hello
5                                    | 132                                  | 4  | world
5                                    | 135                                  | 1  | hello
5                                    | 135                                  | 2  | world

-- dump block
alter system dump datafile 5 block 135;
--
--

insert into t1 values ( 3, 'hello' );
insert into t1 values ( 4, 'world' );
commit;

常用命令

1. 查看数据块的内容

1
BBED> map

2. 查看数据块的头部信息

1
BBED> h

listfile

bbed 必须要设置一个 listfile 文件,这个文件随便创建一个空文件即可,没有特别的实际含义,只是为了让 bbed 能够正常工作,如果不设置 listfile 文件,bbed 会报错,无法通过 set 设置环境变量。这个文件只要是 Oracle 用户有读写权限的文件即可,不需要特别的权限

1
2
3
BBED> set FILE 5
BBED-00312: no LISTFILE specified

当然设置了 listfile 文件之后,bbed 也会报错,但是这个错误是正常的,不影响 bbed 的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
┌─[oracle@oracle11g]─[~]
└──╼ $ touch filelist.bbed
┌─[oracle@oracle11g]─[~]
└──╼ $ readlink -f filelist.bbed
/home/oracle/filelist.bbed

BBED> set listfile '/home/oracle/filelist.bbed'
BBED-00300: unable to translate filename ## 这个报错可以忽略

BBED> set filename '/oradata/darkdb/data01.dbf'
        FILENAME        /oradata/darkdb/data01.dbf

BBED> set file 5
        FILE#           5

BBED> set block 135
        BLOCK#          135

BBED> show all
        FILE#           5
        BLOCK#          135
        OFFSET          0
        DBA             0x01400087 (20971655 5,135) ## DBA 是由 Oracle 分配的十六进制块地址,5 是文件号,135 是块号,20971655 是十进制块地址,如果熟悉的话可以直接设置 DBA ,这样的话就不需要设置 FILE 和 BLOCK
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192 ## 数据块大小 根据数据库的块大小设置
        MODE            Browse ## 设置 bbed 的模式,Browse 是只读模式,Edit 是可编辑模式
        EDIT            Unrecoverable ## 设置编辑模式,Unrecoverable 是不可恢复的,Recoverable 是可恢复的
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512 ## 一次显示的字节数
        LOGFILE         log.bbd
        SPOOL           No

BBED> dump ## 需要注意的是 Oracle 数据是从下往上存储的,所以 dump 出来的数据是从下往上的 ,顶端是数据块的头部信息/元信息 ,底部是数据块的数据
BBED> dump
 File: /oradata/darkdb/data01.dbf (5)
 Block: 135              Offsets:    0 to 8191           Dba:0x01400087
------------------------------------------------------------------------
 06a20000 87004001 371f1f00 00000106 e5fa0000 01000000 6b760100 341f1f00
 00000000 02003200 80004001 08000900 9c0b0000 1eefc000 be003300 02200000
 371f1f00 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010200 ffff1600 801f6a1f 6a1f0000 02008c1f 801f0000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
....
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 2c010202 c1030577 6f726c64 2c010202 c1020568 656c6c6f 0106371f

 <32 bytes per line>
--
-- 查看 block 的内容
select  dump( c1, 16 ),c1, dump( c2, 16 ), c2 from t1;
DUMP(C1,16)       | C1 | DUMP(C2,16)                 | C2
------------------------------------------------------------
Typ=2 Len=2: c1,4 | 3  | Typ=1 Len=5: 68,65,6c,6c,6f | hello
Typ=2 Len=2: c1,5 | 4  | Typ=1 Len=5: 77,6f,72,6c,64 | world
Typ=2 Len=2: c1,2 | 1  | Typ=1 Len=5: 68,65,6c,6c,6f | hello
Typ=2 Len=2: c1,3 | 2  | Typ=1 Len=5: 77,6f,72,6c,64 | world

1
BBED> listfile

blok

相同的 session 插入的数据,会在同一个块中,如果是不同的 session 插入的数据,会在不同的块中

字符串没有大小端的问题,但是数字有大小端的问题,所以在 dump 数据的时候,需要注意数据的大小端问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
create tablespace data datafile '/oradata/darkdb/data01.dbf' size 1G autoextend off;
alter user wxj default tablespace data;

-- session 1
create table t1 ( c1 number, c2 varchar2(100) );
insert into t1 values ( 1, 'hello' );
insert into t1 values ( 2, 'world' );
commit;

select * from t1;
C1 | C2
----------
1  | hello
2  | world

-- session 2

insert into t1 values ( 3, 'hello' );
insert into t1 values ( 4, 'world' );
commit;

-- 查看数据块

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid), c1, c2 from t1;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) | DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) | C1 | C2
----------------------------------------------------------------------------------------
5                                    | 132                                  | 3  | hello
5                                    | 132                                  | 4  | world
5                                    | 135                                  | 1  | hello
5                                    | 135                                  | 2  | world

-- dump block
alter system dump datafile 5 block 135;

-- 查看 block 的内容
select  dump( c1, 16 ),c1, dump( c2, 16 ), c2 from t1;
DUMP(C1,16)       | C1 | DUMP(C2,16)                 | C2
------------------------------------------------------------
Typ=2 Len=2: c1,4 | 3  | Typ=1 Len=5: 68,65,6c,6c,6f | hello
Typ=2 Len=2: c1,5 | 4  | Typ=1 Len=5: 77,6f,72,6c,64 | world
Typ=2 Len=2: c1,2 | 1  | Typ=1 Len=5: 68,65,6c,6c,6f | hello
Typ=2 Len=2: c1,3 | 2  | Typ=1 Len=5: 77,6f,72,6c,64 | world

--

> set block 135 ## 设置 block ,每设置一次 block,就会重新读取数据块的内容

修改表的数据(长度发生变化,rowid 不变)

只有在 blok 写满的情况下 rowid 才会发生变化,或者行迁移的时候 rowid 也会发生变化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
select rowid, c1, c2 from t1;
ROWID              | C1 | C2
-------------------------------
AAAXZrAAFAAAACEAAA | 3  | hello
AAAXZrAAFAAAACEAAB | 4  | world
AAAXZrAAFAAAACHAAA | 1  | hello
AAAXZrAAFAAAACHAAB | 2  | world

-- 修改数据
update t1 set c2 = 'hello world' where c1 = 3;
commit;

select rowid, c1, c2 from t1;
ROWID              | C1 | C2
-------------------------------------
AAAXZrAAFAAAACEAAA | 3  | hello world -- 长度发生变化,rowid 不变
AAAXZrAAFAAAACEAAB | 4  | world
AAAXZrAAFAAAACHAAA | 1  | hello
AAAXZrAAFAAAACHAAB | 2  | world

update 修改的数据长度发生变化,rowid 不变,这是因为 rowid 是由数据块的地址和数据行号组成的,数据行号是数据块中的偏移量,数据块中的数据发生变化,数据行号不变,rowid 也不会变化,但是数据块中的数据发生变化,数据行号发生变化,rowid 也会发生变化。

rowid 组成

rowid 的组成

1
2
3
4
5
6
7
8
select dbms_rowid.rowid_object(rowid) oid, dbms_rowid.rowid_relative_fno(rowid) fno, dbms_rowid.rowid_block_number(rowid) blockid, dbms_rowid.rowid_row_number(rowid) rownumber, c1, c2 from t1;
OID   | FNO | BLOCKID | ROWNUMBER | C1 | C2
----------------------------------------------------
95851 | 5   | 132     | 0         | 3  | hello world
95851 | 5   | 132     | 1         | 4  | world
95851 | 5   | 135     | 0         | 1  | hello
95851 | 5   | 135     | 1         | 2  | world

dump block

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
BBED> set listfile '/home/oracle/filelist.bbed'
BBED-00300: unable to translate filename


BBED> set filename '/oradata/darkdb/data01.dbf'
        FILENAME        /oradata/darkdb/data01.dbf

BBED> set file 5
        FILE#           5

BBED> show all
        FILE#           5
        BLOCK#          1
        OFFSET          0
        DBA             0x01400001 (20971521 5,1)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

BBED> set count 8192
        COUNT           8192set block 135;

BBED> set block 135
        BLOCK#          135
BBED> dump
 File: /oradata/darkdb/data01.dbf (5)
 Block: 135              Offsets:    0 to 8191           Dba:0x01400087
------------------------------------------------------------------------
 06a20000 87004001 371f1f00 00000106 e5fa0000 01000000 6b760100 341f1f00
 00000000 02003200 80004001 08000900 9c0b0000 1eefc000 be003300 02200000
 371f1f00 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010200 ffff1600 801f6a1f 6a1f0000 02008c1f 801f0000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
.......
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 2c010202 c1030577 6f726c64 2c010202 c1020568 656c6c6f 0106371f -- 最初的 dump 信息 00000000 2c010202 c1030577 6f726c64 2c010202 c1020568 656c6c6f 0106371f 可以看出信息没有发生变化

 <32 bytes per line>


-- 重新读取数据块的内容
BBED> set block 135
        BLOCK#          135
BBED> dump

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 2c010202 c1030577 6f726c64 2c010202 c1020568 656c6c6f 0106371f -- 重新读取快的内容,也没有发生变化,这是因为 Oracle 变更的数据实在内存中的,没有写入到磁盘中,所以数据块的内容没有发生变化

 <32 bytes per line>

此时的旧的数据块就是脏块,需要等待一段时间,Oracle 通过 dbwr 会将脏块写入到磁盘中,这个时间一般是 3 秒, 或者手动刷新数据块

1
2
3
4
alter system flush buffer_cache;

-- 也可以执行 checkpoint
alter system checkpoint;

此时在 dump 数据块,就会发现数据块的内容发生了变化

1
2
3
4
5
6
set block 135;
dump

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 2c010202 c1030577 6f726c64 2c010202 c1020568 656c6c6f 0106371f -- 还是没有发生变化,是因为设置的 block 错误了😂 ,应该设置的是 132
<32 bytes per line>

dump 正确的 block

1
2
set block 132;
dump

还是直接修改 block 135 对应的内容吧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid), c1, c2 from t1;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) | DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) | C1 | C2
----------------------------------------------------------------------------------------------
5                                    | 132                                  | 3  | hello world
5                                    | 132                                  | 4  | world
5                                    | 135                                  | 1  | hello
5                                    | 135                                  | 2  | world


select dbms_rowid.rowid_object(rowid) oid, dbms_rowid.rowid_relative_fno(rowid) fno, dbms_rowid.rowid_block_number(rowid) blockid, dbms_rowid.rowid_row_number(rowid) rownumber, c1, c2 from t1;
OID   | FNO | BLOCKID | ROWNUMBER | C1 | C2
----------------------------------------------------
95851 | 5   | 132     | 0         | 3  | hello world
95851 | 5   | 132     | 1         | 4  | world
95851 | 5   | 135     | 0         | 1  | hello
95851 | 5   | 135     | 1         | 2  | world

update t1 set c2 = 'hello world' where c1 = 1;
commit;

select rowid, c1, c2 from t1;
ROWID              | C1 | C2
-------------------------------------
AAAXZrAAFAAAACEAAA | 3  | hello world
AAAXZrAAFAAAACEAAB | 4  | world
AAAXZrAAFAAAACHAAA | 1  | hello world -- 可以看出 rowid 没有发生变化
AAAXZrAAFAAAACHAAB | 2  | world

刷新数据块,重新 dump 数据块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
set block 135;
dump

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 2c010202 c1030577 6f726c64 2c010202 c1020568 656c6c6f 0106371f

<32 bytes per line>

-- 刷脏之后再次 dump
--alter system flush buffer_cache;
-- 一般还是 checkpoint 比较好,flush buffer_cache 会将内存中的其他内容也写入到磁盘中,checkpoint 只会将脏块写入到磁盘中,影响较小
alter system checkpoint;

set block 135;
dump

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 2c000202 c1020b68 656c6c6f
20776f72 6c642c00 0202c102 0568656c 6c6f2c02 0202c102 0b68656c 6c6f2077
6f726c64 [2c000202] ## 从这里开始已经发生变化 [c1030577 6f726c64 2c000202 c1020568 656c6c6f] 【0206594a 这个并不是数据】 ## 这部分没有发生变化,但是 Oracle 不会在使用这部分数据,因为已经没有指针指向这部分数据。这部分数据会被 Oracle 标记为 free block,等待下次使用。Oracle 不会主动清除磁盘上的数据,因为这也会消耗 CPU 和 IO 资源,Oracle 会等待下次使用这部分数据的时候再清除/覆盖这部分数据

<32 bytes per line>

select dump( c2, 16 ) from t1 where c1 = 1;
DUMP(C2,16)
----------------------------------------------
Typ=1 Len=11: 68,65,6c,6c,6f,20,77,6f,72,6c,64

select dump( 'hello', 16 ) from dual;
DUMP('HELLO',16)
----------------------------
Typ=96 Len=5: 68,65,6c,6c,6f

闪回影响

如果没有打开闪回的话,Oracle 写数据的方法是回绕的方式,一直从下网上写,直到元数据的下方(数据文件被写满),然后从尾部开始搜索空闲块。

如果打开了闪回,Oracle 会在数据块的头部写入闪回信息,这个信息是一个指针,指向上一个数据块,这样 Oracle 就可以通过这个指针找到上一个数据块,然后通过上一个数据块的闪回信息找到上上一个数据块,以此类推,直到找到一个没有闪回信息的数据块,这个数据块就是 Oracle 写入数据的起始数据块。这个时候会立马从上往下找寻可用的数据块,不会使用回绕的方式写入数据。

这个也是可以理解的,如果还是使用回绕的方式写入数据,那么在数据文件被写满的时候,Oracle 会从头开始搜索空闲块,这个时间会很长,会影响数据库的性能,所以 Oracle 会在数据块的头部写入闪回信息,这样 Oracle 就可以快速找到可用的数据块,提高数据库的性能。

find 查找数据块

可以通过 bbed 的 find 命令查找数据块,find 命令可以查找数据块中的指定内容,可以查找数据块中的数据,也可以查找数据块中的元数据,可以查找数据块中的任意内容

1
2
3
4
5
6
BBED> help find
FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
## /x 是十六进制,/d 是十进制,/u 是 无符号十进制,/o 是八进制,/c 是字符

BBED> find /c hello ## 可以直接查找字符 hello ,但是最好结合 offset,否则会查找整个数据块/文件,offset=0 是从数据块的头部开始查找

需要注意的是,使用 find 命令之后,offset 会自动设置到查找到的位置,所以在使用 find 命令之后,需要重新设置 offset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
BBED>
BBED> show all
        FILE#           5
        BLOCK#          135
        OFFSET          0
        DBA             0x01400087 (20971655 5,135)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           NoBBED>
BBED> find /c hello
 File: /oradata/darkdb/data01.dbf (5)
 Block: 135              Offsets: 8123 to 8191 ## 在偏移量的 8123-8191 之间找到了 hello           Dba:0x01400087
------------------------------------------------------------------------
 Block: 135              Offsets: 8123 to 8191           Dba:0x01400087
------------------------------------------------------------------------
 68656c6c 6f20776f 726c642c 000202c1 02056865 6c6c6f2c 020202c1 020b6865
 6c6c6f20 776f726c 642c0002 02c10305 776f726c 642c0002 02c10205 68656c6c
 6f020659 4a

 <32 bytes per line>

BBED> show all
        FILE#           5
        BLOCK#          135
        OFFSET          8123 ## offset 会自动设置到查找到的位置
        DBA             0x01400087 (20971655 5,135)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No

BBED>
BBED> set offset 0

还需要注意的是,find /x 命令在 32 位系统上只能查找 4 个字节(每个字节 8 位)的内容,64 位系统上只能查找 8 个字节的内容,否则会提示 BBED-00209 错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
BBED> set offset 0
        OFFSET          0

BBED> find /x 68656c6c
 File: /oradata/darkdb/data01.dbf (5)
 Block: 135              Offsets: 8123 to 8191           Dba:0x01400087
------------------------------------------------------------------------
 68656c6c 6f20776f 726c642c 000202c1 02056865 6c6c6f2c 020202c1 020b6865
 6c6c6f20 776f726c 642c0002 02c10305 776f726c 642c0002 02c10205 68656c6c
 6f020659 4a

 <32 bytes per line>

BBED> set offset 0
        OFFSET          0

BBED> find /x 414141141414141414141414141
BBED-00209: invalid number (414141141414141414141414141)


BBED> show all
        FILE#           5
        BLOCK#          135
        OFFSET          0
        DBA             0x01400087 (20971655 5,135)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No

BBED>

modify 修改数据块

可以通过 bbed 的 modify 命令修改数据块中的内容,可以修改数据块中的数据,也可以修改数据块中的元数据,可以修改数据块中的任意内容

1
2
3
4
5
6
7
BBED> help modify
MODIFY[/x|d|u|o|c] numeric/character string
      [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] ## 可以通过 DBA,FILE,FILENAME,BLOCK,OFFSET,symbol,*symbol 来设置需要修改的数据的位置,offset 默认是从当前位置开始修改

## 通过字符串直接修改数据内容最简单,也可以结合 select dump( c2, 16 ) from t1 where c1 = 1; 来查看数据的十六进制内容,然后直接修改数据的十六进制内容
## BBED> modify /c hello world

为了方便测试观察,新插入一条数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
WXJ@darkdb 2280,4150 SQL> col c2 format a15
WXJ@darkdb 2280,4150 SQL>
WXJ@darkdb 2280,4150 SQL> select * from t1;

        C1 C2
---------- ---------------
         3 hello world
         4 world
         1 hello world
         2 world

Elapsed: 00:00:00.00
WXJ@darkdb 2280,4150 SQL>

insert into t1 values ( 5, 'test' );
commit;
WXJ@darkdb 2280,4150 SQL> insert into t1 values ( 5, 'test' );

1 row created.

Elapsed: 00:00:00.01
WXJ@darkdb 2280,4150 SQL> commit;

Commit complete.

Elapsed: 00:00:00.01
WXJ@darkdb 2280,4150 SQL> select * from t1;

        C1 C2
---------- ---------------
         3 hello world
         4 world
         5 test
         1 hello world
         2 world

Elapsed: 00:00:00.00

select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid), c1, c2 from t1;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) | DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) | C1 | C2         
----------------------------------------------------------------------------------------------
5                                    | 132                                  | 3  | hello world
5                                    | 132                                  | 4  | world      
5                                    | 133                                  | 5  | test       
5                                    | 135                                  | 1  | hello world
5                                    | 135                                  | 2  | world      

select dump( c1, 16 ),dump( c2, 16 ) from t1 where c1 = 5;
DUMP(C1,16)       | DUMP(C2,16)             
--------------------------------------------
Typ=2 Len=2: c1,6 | Typ=1 Len=4: 74,65,73,74

修改数据块中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
BBED> set block 133
        BLOCK#          133


BBED> set block 133
        BLOCK#          133

BBED> show all
        FILE#           5
        BLOCK#          133
        OFFSET          0
        DBA             0x01400085 (20971653 5,133)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No

BBED> dump
 File: /oradata/darkdb/data01.dbf (5)
 Block: 133              Offsets:    0 to 8191           Dba:0x01400085
------------------------------------------------------------------------
 06a20000 85004001 341f1f00 00000204 05290000 01000000 6b760100 341f1f00
 00000000 02003200 80004001 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 0206341f

 <32 bytes per line>

## 可以看到这里还是没有变化,因为 Oracle 的数据是在内存中/或者现在还是脏块的,没有写入到磁盘中/刷脏,所以数据块的内容没有发生变化。所以需要刷新数据块

WXJ@darkdb 2280,4150 SQL> alter system checkpoint
  2  ;

System altered.

Elapsed: 00:00:00.07

## WXJ@darkdb 2280,4150 SQL> alter system flush buffer_cache; -- 或者直接刷新 buffer_cache

## 刷脏之后一定要再次 set block 133,重新 dump 数据块,否则数据块的内容不会发生变化

BBED> set block 133
        BLOCK#          133

BBED> dump
 File: /oradata/darkdb/data01.dbf (5)
 Block: 133              Offsets:    0 to 8191           Dba:0x01400085
------------------------------------------------------------------------
 06a20000 85004001 e85d2000 00000206 d94c0000 01000000 6b760100 341f1f00
 00000000 02003200 80004001 01001b00 af0b0000 1bf5c000 d1001500 01200000
 e85d2000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010100 ffff1400 8d1f791f 791f0000 01008d1f 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
...
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 002c0102 02c10604 74657374 0206e85d

 <32 bytes per line>

BBED> find /c test
 File: /oradata/darkdb/data01.dbf (5)
 Block: 133              Offsets: 8184 to 8191           Dba:0x01400085
------------------------------------------------------------------------
 74657374 0206e85d

 <32 bytes per line>

BBED> show all
        FILE#           5
        BLOCK#          133
        OFFSET          8184 ## offset 会自动设置到查找到的位置
        DBA             0x01400085 (20971653 5,133)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No

BBED>
BBED> modify /c testnew ## 记得修改 MODE 为 EDIT,否则会报错 BBED-00215: editing not allowed in BROWSE mode
BBED-00215: editing not allowed in BROWSE mode

BBED> set mode edit
        MODE            Edit

BBED> show all
        FILE#           5
        BLOCK#          133
        OFFSET          8184
        DBA             0x01400085 (20971653 5,133)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No

## 这里不需要指定 offset,因为 offset 已经设置到查找到的位置了
BBED> modify /c testnew
 File: /oradata/darkdb/data01.dbf (5)
 Block: 133              Offsets: 8184 to 8191           Dba:0x01400085
------------------------------------------------------------------------
 74657374 6e65775d

 <32 bytes per line>

修改成功之后查看表的数据是否发生变化

1
2
3
4
5
6
7
8
9
10
11
12
WXJ@darkdb 2280,4150 SQL> select * from t1;

        C1 C2
---------- ---------------
         3 hello world
         4 world
         5 test
         1 hello world
         2 world

Elapsed: 00:00:00.00
WXJ@darkdb 2280,4150 SQL>

此时还没发生变化,因为Oracle会先将数据读取到内存中,此时查询 t1 的数据是从内存中读取的,所以数据还是没有发生变化,需要等待一段时间,Oracle 会将内存中的数据写入到磁盘中,这个时间一般是 3 秒,或者手动刷新数据块

这里也可以看出 checkpoint 和 flush buffer_cache 的区别,checkpoint 只会将脏块写入到磁盘中,flush buffer_cache 会将内存中的所有数据写入到磁盘中,所以 checkpoint 的性能更好,checkpoint 也不会查看到数据文件已经发生了修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
WXJ@darkdb 2280,4150 SQL> alter system checkpoint;

System altered.

Elapsed: 00:00:00.09
WXJ@darkdb 2280,4150 SQL>
WXJ@darkdb 2280,4150 SQL> select * from t1;

        C1 C2
---------- ---------------
         3 hello world
         4 world
         5 test
         1 hello world
         2 world

Elapsed: 00:00:00.00
WXJ@darkdb 2280,4150 SQL> alter system flush buffer_cache;

WXJ@darkdb 2269,15367 SQL> select * from t1;
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 133)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'



no rows selected

Elapsed: 00:00:03.55

关闭校验和参数(db_block_checksum)默认true,尝试查看表数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
alter system set db_block_checksum = false scope = spfile;


WXJ@darkdb 2269,15367 SQL> alter system set db_block_checksum = false scope = spfile;

System altered.

Elapsed: 00:00:00.02
WXJ@darkdb 2269,15367 SQL> select * from t1;
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 133)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'



no rows selected

Elapsed: 00:00:00.45
WXJ@darkdb 2269,15367 SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.03
WXJ@darkdb 2269,15367 SQL> select * from t1;
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 133)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'



no rows selected

bbed sum 查看/修改校验和

因为实验没有做完的时候重启了实例,所以修改参数 db_block_checksum 之后也无法正常查看数据,可以通过 bbed 的 sum 选项重新计算校验和

1
2
3
-- 在此之前记得修改参数 db_block_checksum 为 true
alter system set db_block_checksum = true scope = spfile;

查看校验和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
## sum 默认是查看当前 block 的校验和,默认支持查看,需要搭配选项 apply 修改校验和

BBED> help sum
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]


BBED> set filename '/oradata/darkdb/data01.dbf'
        FILENAME        /oradata/darkdb/data01.dbf

BBED> set file 5
        FILE#           5

BBED> set block 133
        BLOCK#          133

BBED> show all
        FILE#           5
        BLOCK#          133
        OFFSET          0
        DBA             0x01400085 (20971653 5,133)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No
BBED> sum
Check value for File 5, Block 133:
current = 0x4cd9, required = 0x2f2a ## 可以看到当前的校验和和需要的校验和不一致,当前的校验和是 0x4cd9,需要的校验和是 0x2f2a

BBED>

BBED> dump
 File: /oradata/darkdb/data01.dbf (5)
 Block: 133              Offsets:    0 to  511           Dba:0x01400085
------------------------------------------------------------------------
 06a20000 85004001 e85d2000 00000206 【d94c0000】这里的校验和是新的值 01000000 6b760100 341f1f00
 00000000 02003200 80004001 01001b00 af0b0000 1bf5c000 d1001500 01200000
 e85d2000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010100 ffff1400 8d1f791f 791f0000 01008d1f 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 <32 bytes per line>

BBED>

## 更新校验和
BBED> sum apply
BBED-00215: editing not allowed in BROWSE mode


BBED> set mode edit
        MODE            Edit

BBED> sum apply
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
Check value for File 5, Block 133:
current = 0x2f2a, required = 0x2f2a

BBED>

## 发现还是不能查看数据,检查上文的修改步骤,发现字段长度也变化了😂之前是 test 修改为了 textnew ,所以这里无法直接查看数据,大意了 🤣
WXJ@darkdb 2280,21677 SQL> select * from t1;
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 133)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'



no rows selected

Elapsed: 00:00:00.41
WXJ@darkdb 2280,21677 SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.06
WXJ@darkdb 2280,21677 SQL> select * from t1;
ERROR:
ORA-01578: ORACLE data block corrupted (file # 5, block # 133)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'



no rows selected

Elapsed: 00:00:00.36

直接删除表重新测试

1
2
3
4
5
WXJ@darkdb 2280,21677 SQL> drop table t1;
Table dropped.

Elapsed: 00:00:00.13

这里也可以发现,直接删除表并没有报错,对于坏块来说,只要没有访问到坏块,Oracle 是不会报错的,只有访问到坏块的时候才会报错,这也是 Oracle 的一个优点,对于坏块的容忍度很高,不会因为一个坏块就导致整个数据库无法使用

根据前文重新创建测试表,然后修改数据块中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
WXJ@darkdb 2280,21677 SQL> create table t1 ( c1 number, c2 varchar2(20) );

Table created.

Elapsed: 00:00:00.05
WXJ@darkdb 2280,21677 SQL> insert into t1 values(1,'test');

1 row created.

Elapsed: 00:00:00.01
WXJ@darkdb 2280,21677 SQL> insert into t1 values(2,'test2');

1 row created.

Elapsed: 00:00:00.00
WXJ@darkdb 2280,21677 SQL> commit;

Commit complete.

Elapsed: 00:00:00.01


查看数据所在的 block

1
2
3
4
5
 select dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid), c1, c2 from t1;
DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) | DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) | C1 | C2   
----------------------------------------------------------------------------------------
5                                    | 141                                  | 1  | test 
5                                    | 141                                  | 2  | test2

bbed 修改对应块中的数据,保持长度一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
BBED> show all
        FILE#           5
        BLOCK#          133
        OFFSET          8184
        DBA             0x01400085 (20971653 5,133)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No


BBED> set block 141
        BLOCK#          141

BBED> dump
 File: /oradata/darkdb/data01.dbf (5)
 Block: 141              Offsets:    0 to 8191           Dba:0x0140008d
------------------------------------------------------------------------
 06a20000 8d004001 3ad12000 00000106 4a160000 01000000 2f770100 36d12000
 00000000 02003200 88004001 08002100 8d0b0000 bb08c000 cd003d00 02200000
 3ad12000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010200 ffff1600 811f6b1f 6b1f0000 02008d1f 811f0000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 002c0102 02c10305 74657374 322c0102 02c10204 74657374 01063ad1

 <32 bytes per line>

select dump( c1, 16 ),dump( c2, 16 ), c1, c2 from t1 ;
DUMP(C1,16)       | DUMP(C2,16)                 | C1 | C2   
------------------------------------------------------------
Typ=2 Len=2: c1,2 | Typ=1 Len=4: 74,65,73,74    | 1  | test 
Typ=2 Len=2: c1,3 | Typ=1 Len=5: 74,65,73,74,32 | 2  | test2

BBED> find /c test
 File: /oradata/darkdb/data01.dbf (5)
 Block: 141              Offsets: 8172 to 8191           Dba:0x0140008d
------------------------------------------------------------------------
 74657374 322c0102 02c10204 74657374 01063ad1

 <32 bytes per line>

BBED> show all
        FILE#           5
        BLOCK#          141
        OFFSET          8172
        DBA             0x0140008d (20971661 5,141)
        FILENAME        /oradata/darkdb/data01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.bbed
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           8192
        LOGFILE         log.bbd
        SPOOL           No

BBED> modify /c demo
 File: /oradata/darkdb/data01.dbf (5)
 Block: 141              Offsets: 8172 to 8191           Dba:0x0140008d
------------------------------------------------------------------------
 64656d6f 322c0102 02c10204 74657374 01063ad1 ## 通过这里也可以看出,如果存在两个一样的字符,修改的时候只会修改第一次匹配出现的字符


 <32 bytes per line>

## 刷新 cache,查看数据

alter system flush buffer_cache;
alter system set db_block_checksum = false scope = spfile;

这里测试发现不管是在另一个 session 修改参数,还是刷新 cache 都无法正常查看数据,都会提示存在坏块,当前 session,新的session还是刷新cache之后重新再次连接的session都无法查看数据,但是看吕海波的ocm课程中可以在修改block check参数为false然后刷新cache之后可以正常查看数据,我测试环境为11g,可能版本不同导致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
WXJ@darkdb 2280,21677 SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 141)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'


Elapsed: 00:00:00.03
WXJ@darkdb 2280,21677 SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 141)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'


Elapsed: 00:00:00.03
WXJ@darkdb 2280,21677 SQL>
WXJ@darkdb 2280,21677 SQL> select * from t1;
select * from t1
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 5, block # 141)
ORA-01110: data file 5: '/oradata/darkdb/data01.dbf'


Elapsed: 00:00:00.03
WXJ@darkdb 2280,21677 SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.01

通过 bbed sum 修改校验和之后能够正常查看数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
BBED> set block 141
        BLOCK#          141

BBED> sum
Check value for File 5, Block 141:
current = 0x164a, required = 0x0d44

BBED> sum apply
Check value for File 5, Block 141:
current = 0x0d44, required = 0x0d44

WXJ@darkdb 2280,21677 SQL> alter system set db_block_checksum = false scope = spfile;

System altered.
WXJ@darkdb 2280,21677 SQL> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.01
WXJ@darkdb 2280,21677 SQL> select * from t1;

        C1 C2
---------- --------------------
         1 test
         2 demo2

从这里可以看出,只会修改最近一次匹配的字符,如果存在多个相同的字符,修改的时候只会修改最近一次匹配的字符,所以在修改数据的时候需要注意。存在多个相同字符的时候最好指定 offset

dump 块

1
2
alter system dump datafile 5 block 141;
select tracefile from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat));

在 吕海波的 oracle 10g ocm 的课程中,dump 通过 bbed 修改过的块,即便是修改了校验和,在日志中也会出现坏块的信息,但是在我的环境 Oracle 11g 中,两次(重启前后)日志都没有出现坏块的提示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
┌─[oracle@oracle11g]─[/u01/app/oracle/diag/rdbms/darkdb/darkdb/trace]
└──╼ $ grep -i block darkdb_ora_3982.trc darkdb_ora_2850.trc
darkdb_ora_3982.trc:Start dump data blocks tsn: 6 file#:5 minblk 135 maxblk 135
darkdb_ora_3982.trc:Block dump from cache:
darkdb_ora_3982.trc:Block dump from disk:
darkdb_ora_3982.trc:Hex dump of block: st=0, typ_found=1
darkdb_ora_3982.trc:Block header dump:  0x01400087
darkdb_ora_3982.trc: Object id on Block? Y
darkdb_ora_3982.trc:data_block_dump,data header at 0x7fb06805aa64
darkdb_ora_3982.trc:block_row_dump:
darkdb_ora_3982.trc:end_of_block_dump
darkdb_ora_3982.trc:End dump data blocks tsn: 6 file#: 5 minblk 135 maxblk 135
darkdb_ora_2850.trc:Start dump data blocks tsn: 6 file#:5 minblk 141 maxblk 141
darkdb_ora_2850.trc:Block dump from cache:
darkdb_ora_2850.trc:Block dump from disk:
darkdb_ora_2850.trc:Hex dump of block: st=0, typ_found=1
darkdb_ora_2850.trc:Block header dump:  0x0140008d
darkdb_ora_2850.trc: Object id on Block? Y
darkdb_ora_2850.trc:data_block_dump,data header at 0x7fb4fdcaea64
darkdb_ora_2850.trc:block_row_dump:
darkdb_ora_2850.trc:end_of_block_dump
darkdb_ora_2850.trc:End dump data blocks tsn: 6 file#: 5 minblk 141 maxblk 141
┌─[oracle@oracle11g]─[/u01/app/oracle/diag/rdbms/darkdb/darkdb/trace]
└──╼ $