暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DUMP Block是否会引起脏数据写入磁盘?

原创 Kamus 2020-03-12
649

问题:Dump Block会否触发脏数据写入磁盘?

我们尝试一个不同的工具BBED。BBED(Oracle Block Browser and Editor)工具是Oracle内部提供的数据块级别查看和修改工具。借助这个工具,我们可以方便的查看Oracle块block级别的存储细节信息,更好地了解Oracle Internal结构的技术细节,DBA们应当了解这个工具的简单使用方法。

掌握尽量多的工具,会让我们具备选择的基础,这也是DBA的基本技能要求。

首先亮出结论:Dump Block不会引起Buffer cache中的脏数据回写入磁盘。然后我们使用bbed工具来验证一下。

(1)创建一个测试表。

SQL> CREATE TABLE t (n NUMBER);
TABLE created
复制

(2)插入一条数据,提交,然后强制checkpoint。

SQL> INSERT INTO t VALUES(1);
1 ROW inserted
SQL> commit;
Commit complete
SQL> ALTER system checkpoint;
System altered
复制

(3)此时这条数据一定已经写回磁盘,这个无需验证,继续插入另外一条数据,提交,但是不checkpoint。

SQL> INSERT INTO t VALUES(2);
1 ROW inserted 
SQL> commit;
Commit complete
复制

(4)此时这条脏数据在buffer cache中,我们可以通过dump block来验证。

block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f94
tl: 6 fb: --H-FL-- lb: 0x2  cc: 1
col  0: [ 2]  c1 03
end_of_block_dump
复制

(5)通过dbms_rowid包取得T表中记录的文件号和block号,本例中取得是file#=58, block#=570。

(6)关键步骤到了,现在我们要用bbed来获取磁盘上的数据块内容,然后跟dump block的结果比较一下。

创建一个filelist文件,命名为files.lst。

$ cat files.lst
58 /fin/u06/cnctest2data/system12.dbf 1048576000
复制

创建一个参数文件par.bbd,用以被bbed调用。

$ cat par.bbd
blocksize=8192
listfile=/home/oraaux/files.lst
mode=browse

执行bbed。
$ bbed parfile=par.bbd
Password: 
 
BBED: Release 2.0.0.0.0 - Limited Production on Mon Mar 13 17:35:32 2006
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
 
BBED> set dba 58,570
        DBA             0x0e80023a (243270202 58,570)
 
BBED> x /*rn rowdata
rowdata[0]                                  @8182    
----------
flag@8182: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8183: 0x01
cols@8184:    1
 
col    0[2] @8185: 1  --只有一条记录,值是1
 
tailchk                                     @8188    
-------
BBED-00210: no row at this offset
复制

到目前为止我们已经验证了dump block并不会把脏数据写回磁盘,为了看一下checkpoint的效果,我们继续往下。

(7)做checkpoint

SQL> ALTER system checkpoint;
System altered
复制

(8)再次运行bbed。

$ bbed parfile=par.bbd
Password: 
 
BBED: Release 2.0.0.0.0 - Limited Production on Mon Mar 13 17:35:32 2006
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
 
BBED> set dba 58,570
        DBA             0x0e80023a (243270202 58,570) 
BBED> x /*rn rowdata
rowdata[0]                                  @8176    
----------
flag@8176: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8177: 0x02
cols@8178:    1
col    0[2] @8179: 2  --这是后来插入的记录,值是2
rowdata[6]                                  @8182    
----------
flag@8182: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8183: 0x01
cols@8184:    1 
col    0[2] @8185: 1  --这是第一条记录,值是1
tailchk                                     @8188    
-------
BBED-00210: no row at this offset
复制

checkpoint将buffer cache中的脏数据写回数据文件了。

最后修改时间:2020-03-12 21:07:46
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论