Mar 20 2006
计划五一旅游ing
这几天计划五一的旅游,我想去德国,我也知道确实是要花一大笔钱,但是,欧洲真的很漂亮啊。
如果能够成行,各位等着看疯狂美丽的图片和游记吧,如果没有去成,也不要惊讶,因为钱不是那么好赚的,签证也不是那么简单就可以拿到的。
Mar 20 2006
这几天计划五一的旅游,我想去德国,我也知道确实是要花一大笔钱,但是,欧洲真的很漂亮啊。
如果能够成行,各位等着看疯狂美丽的图片和游记吧,如果没有去成,也不要惊讶,因为钱不是那么好赚的,签证也不是那么简单就可以拿到的。
Mar 13 2006
这个问题的起源在于我的上一篇文章-Dump Block是否会读入Buffer Cache,d.c.b.a留言提出了这个问题,dump block会否让刚插入的块写入数据文件呢?
一个有趣的问题,但是我却不知道如何验证,如何查看磁盘上的block内容是一个难点。昨天在Oracle-L邮件列表中提了这个问题,今天就得到Christian Antognini的帮助,提示我可以去使用bbed来查看磁盘块的内容。谢谢Chris,非常好的一个方法。
先放出结论,Dump Block不会引起buffer cache中的脏数据回写入磁盘。然后是验证的详细步骤。
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, @0×1f9a
tl: 6 fb: –H-FL– lb: 0×1 cc: 1
col 0: [ 2] c1 02
tab 0, row 1, @0×1f94
tl: 6 fb: –H-FL– lb: 0×2 cc: 1
col 0: [ 2] c1 03
end_of_block_dump
5。通过dbms_rowid包取得T表中所有记录所存储的数据文件号和block号,具体SQL不说了,本例中取得是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(貌似泄漏密码有法律问题,这里就不说了,大家google去吧,可以找到的)
$ 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 0×0e80023a (243270202 58,570)
BBED> x /*rn rowdata
rowdata[0] @8182
———-
flag@8182: 0×2c (KDRHFL, KDRHFF, KDRHFH)
lock@8183: 0×01
cols@8184: 1
col 0[2] @8185: 1 –只有一条记录,值是1
tailchk @8188
——-
BBED-00210: no row at this offset
BBED> exit
OK,到目前为止我们已经验证了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 0×0e80023a (243270202 58,570)
BBED> x /*rn rowdata
rowdata[0] @8176
———-
flag@8176: 0×2c (KDRHFL, KDRHFF, KDRHFH)
lock@8177: 0×02
cols@8178: 1
col 0[2] @8179: 2 –这是后来插入的记录,值是2
rowdata[6] @8182
———-
flag@8182: 0×2c (KDRHFL, KDRHFF, KDRHFH)
lock@8183: 0×01
cols@8184: 1
col 0[2] @8185: 1 –这是第一条记录,值是1
tailchk @8188
——-
BBED-00210: no row at this offset
checkpoint将buffer cache中的脏数据写回数据文件了。
Update
itpub上的网友oracledba提供了更简单的方法,仍然是v$bh视图,查看v$bh.dirty字段,如果为N表示已经被写入磁盘,如果为Y则表示仍然是脏数据。惭愧,自己却绕了一大圈。
Mar 11 2006
今天忽然有个疑问,如果我们执行alter system dump datafile # block #的话Oracle是否会先把block读入到buffer cache中呢?先打电话问了一下泡在广州温柔乡里面的eygle,他说应该不会,可以直接读取数据文件的。
为了确认,我还是自己测试了一下,结果证明eygle的记忆还是对的。
简略说一下测试步骤,超级简单。
1。重启一下数据库,这样buffer cache中几乎就没什么用户数据了,方便测试
2。随便找一张表看看是在哪个file哪个block里面
3。T1表在数据文件4中,第一个block是19,检查v$bh,看看这个block有没有在buffer cache中
4。OK,目前buffer cache中没有这个block,作一次dump再看看有没有
5。至此验证了作block dump不会把数据块先读入buffer cache,好,继续作一次select看看,这次一定是读进buffer cache了
小知识
1. v$bh视图保存着buffer cache中每一个block的信息。
2. dba_segments视图中一个ASSM类型segment的header_block是从它的PAGETABLE SEGMENT HEADER算起的,并不包括前面用于控制free block的两个位图块(FIRST LEVEL BITMAP BLOCK和SECOND LEVEL BITMAP BLOCK)。