Archive for the 'Oracle RDBMS' Category

Mar 13 2006

Dump Block是否会写Dirty Block

Published by kamus under Oracle RDBMS

这个问题的起源在于我的上一篇文章-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则表示仍然是脏数据。惭愧,自己却绕了一大圈。

6 responses so far

Mar 11 2006

Dump Block是否会读入Buffer Cache?

Published by kamus under Oracle RDBMS

今天忽然有个疑问,如果我们执行alter system dump datafile # block #的话Oracle是否会先把block读入到buffer cache中呢?先打电话问了一下泡在广州温柔乡里面的eygle,他说应该不会,可以直接读取数据文件的。

为了确认,我还是自己测试了一下,结果证明eygle的记忆还是对的。

简略说一下测试步骤,超级简单。

1。重启一下数据库,这样buffer cache中几乎就没什么用户数据了,方便测试
2。随便找一张表看看是在哪个file哪个block里面

  1. SQL> select header_file,header_block
  2.   2  from dba_segments
  3.   3  where segment_name='T1';
  4.  
  5. HEADER_FILE HEADER_BLOCK
  6. ----------- ------------
  7.           4           19

3。T1表在数据文件4中,第一个block是19,检查v$bh,看看这个block有没有在buffer cache中

  1. SQL> select count(*)
  2.   2  from v$bh
  3.   3  where file# = 4 and block# = 19;
  4.  
  5.   COUNT(*)
  6. ----------
  7.          0

4。OK,目前buffer cache中没有这个block,作一次dump再看看有没有

  1. SQL> alter system dump datafile 4 block 19;
  2.  
  3. System altered
  4.  
  5. SQL> select count(*)
  6.   2  from v$bh
  7.   3  where file# = 4 and block# = 19;
  8.  
  9.   COUNT(*)
  10. ----------
  11.          0

5。至此验证了作block dump不会把数据块先读入buffer cache,好,继续作一次select看看,这次一定是读进buffer cache了

  1. SQL> select * from ops$kamus.t1;
  2.  
  3.          N
  4. ----------
  5.  
  6. SQL> select count(*)
  7.   2  from v$bh
  8.   3  where file# = 4 and block# = 19;
  9.  
  10.   COUNT(*)
  11. ----------
  12.          1

小知识
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)。

6 responses so far

Feb 28 2006

一段关于OCP的对话

Published by kamus under Oracle RDBMS

最近不少人问我OCP的事情,很久没有了,最近忽然多起来,不知道是因为我把OCP指南放在了我自己的blog上,还是因为OCP考试降价又重新火起来。正好今天又有一位在MSN上问我考试的问题,索性就多说了几句,贴在这里也希望能给其它有同样疑问的朋友一些帮助。

cir1982@hotmail.com 说:
哥们。。在么?
有点事情请教

- kamus Chanel [K] = blog.dbform.com 说:
啥事儿

cir1982@hotmail.com 说:
我在Oracle中国论坛注册了。收不到确认信

cir1982@hotmail.com 说:
最近想考OCP

- kamus Chanel [K] = blog.dbform.com 说:
那就去www.itpub.net

cir1982@hotmail.com 说:
看到你发的帖子。。。里面附件没法下。。能不能发给我

- kamus Chanel [K] = blog.dbform.com 说:
如果只想要那个文件

cir1982@hotmail.com 说:
我对Oracle也是刚入门的。。

- kamus Chanel [K] = blog.dbform.com 说:
我找一下

cir1982@hotmail.com 说:
嗯。谢谢啦

- kamus Chanel [K] = blog.dbform.com 说:
http://blog.dbform.com/archives/56

cir1982@hotmail.com 说:
想考OCP。。但是觉得费用太高。你认为先考OCA。然后再攻OCP怎么样?给我点建议。呵呵

- kamus Chanel [K] = blog.dbform.com 说:
这是我的blog,下载链接在文章最后

- kamus Chanel [K] = blog.dbform.com 说:
考试不是目的,我一直认为考试只是给自己一个学习的鞭策而已

- kamus Chanel [K] = blog.dbform.com 说:
因为掏了钱所以就强迫自己不能懈怠

- kamus Chanel [K] = blog.dbform.com 说:
仅次而已

- kamus Chanel [K] = blog.dbform.com 说:
在这个前提下,完全可以先报考OCA

cir1982@hotmail.com 说:
是哦。。不过我感觉考试才仅仅入门而已

- kamus Chanel [K] = blog.dbform.com 说:
当你觉得因为学习oracle而对oracle感兴趣了,那么即使没有考试也会去自动学习的

- kamus Chanel [K] = blog.dbform.com 说:
OK,这个时候,你甚至可以不去考OCP了

cir1982@hotmail.com 说:
嗯。因为我马上毕业了。。所以想先系统学习下。考OCA。然后在工作中慢慢积累经验然后再考OCP

- kamus Chanel [K] = blog.dbform.com 说:
因为那个东西其实没用

cir1982@hotmail.com 说:
嗯。也是

- kamus Chanel [K] = blog.dbform.com 说:
OCP的考试内容在工作中是无法积累的

- kamus Chanel [K] = blog.dbform.com 说:
因为太多的基础知识点,即使你不很清楚照样能做好工作

cir1982@hotmail.com 说:
我是说关于数据库管理的一些经验

- kamus Chanel [K] = blog.dbform.com 说:
一个称职的DBA并不一定就能考过OCP

- kamus Chanel [K] = blog.dbform.com 说:
反之亦然

cir1982@hotmail.com 说:
嗯。我感觉也是。一张证书并不能代表能力

- kamus Chanel [K] = blog.dbform.com 说:
而更可能出现的情况是,当你工作忙了,应付工作的精力反而无法让你定下心来学习OCP

- kamus Chanel [K] = blog.dbform.com 说:
所以,如果你想拿到OCP证书,那么现在就去考

cir1982@hotmail.com 说:
不过感觉有证书的话找工作会好些。。为以后实践创造物质基础

- kamus Chanel [K] = blog.dbform.com 说:
如果觉得只想提高Oracle水平,那么就完全可以不考

- kamus Chanel [K] = blog.dbform.com 说:
没有一个公司会check你的OCP证书

- kamus Chanel [K] = blog.dbform.com 说:
当你觉得自己oracle知识没有问题了,那么直接在简历上说你过了OCP就行

- kamus Chanel [K] = blog.dbform.com 说:
呵呵,我不是教你骗人。。。

- kamus Chanel [K] = blog.dbform.com 说:
怎么作全靠你自己了

- kamus Chanel [K] = blog.dbform.com 说:
good luck

cir1982@hotmail.com 说:
嗯。想问一下。我以前没怎么接触过Oracle.该怎么入手能给我点建议么

- kamus Chanel [K] = blog.dbform.com 说:
先看完我的那篇文章吧
- kamus Chanel [K] = blog.dbform.com 说:
说得比较清楚了

cir1982@hotmail.com 说:
嗯。我去Blog看看

cir1982@hotmail.com 说:
以后有问题还要麻烦你。呵呵

- kamus Chanel [K] = blog.dbform.com 说:
不客气

- kamus Chanel [K] = blog.dbform.com 说:
恩,对了,因为不少人问我这个问题,我想我也许会把我们的这段聊天内容放到我的blog上

- kamus Chanel [K] = blog.dbform.com 说:
没有问题吧

cir1982@hotmail.com 说:
嗯嗯。NP

- kamus Chanel [K] = blog.dbform.com 说:
ok

No Tags

10 responses so far

Jan 29 2006

NVL, NVL2 or COALESCE?

Published by kamus under Oracle RDBMS

刚看完没什么感觉的春晚,闲来无事,再翻译一篇Eddie Awadblog

NVL, NVL2 or COALESCE?

跟别的RDBMS系统一样,Oracle中的空值(nulls)也应该被特殊对待。在Oracle中,有3个(也许更多?)函数可以用来处理空值,NVL, NVL2 和 COALESCE。我想要问你们一个问题,但是首先我自己得先温习一下。

NVL ( expr1 , expr2 )
如果expr1是空,那么NVL返回expr2。如果expr1不是空,那么NVL返回expr1。

NVL2 ( expr1 , expr2 , expr3 )
如果expr1是空,那么NVL2返回expr3。如果expr1不是空,那么NVL返回expr2。

COALESCE(expr[,expr]…)
返回参数列表中的第一个非空值。

当然我也可以使用CASE或者DECODE函数来处理空值。

下面左右的查询都返回相同的结果:

使用NVL:

  1. HR@XE> select nvl(commission_pct,0)
  2.   2  from employees
  3.   3  where commission_pct is null
  4.   4  and rownum = 1;
  5.  
  6. NVL(COMMISSION_PCT,0)
  7. ---------------------
  8.                     0

使用NVL2:

  1. HR@XE> select nvl2(commission_pct,commission_pct,0)
  2.   2  from employees
  3.   3  where commission_pct is null
  4.   4  and rownum = 1;
  5.  
  6. NVL2(COMMISSION_PCT,COMMISSION_PCT,0)
  7. -------------------------------------
  8.                                     0

使用COALESCE:

  1. HR@XE> select COALESCE(commission_pct,0)
  2.   2  from employees
  3.   3  where commission_pct is null
  4.   4  and rownum = 1;
  5.  
  6. COALESCE(COMMISSION_PCT,0)
  7. --------------------------
  8.                          0

使用CASE:

  1. HR@XE> select
  2.   2      case
  3.   3      when commission_pct is null then 0
  4.   4      else commission_pct
  5.   5      end commission_pct
  6.   6  from employees
  7.   7  where commission_pct is null
  8.   8  and rownum = 1;
  9.  
  10. COMMISSION_PCT
  11. --------------
  12.              0

使用DECODE:

  1. HR@XE> select
  2.   2     decode(commission_pct,null, 0,
  3.   3      commission_pct) commission_pct
  4.   4  from employees
  5.   5  where commission_pct is null
  6.   6  and rownum = 1;
  7.  
  8. COMMISSION_PCT
  9. --------------
  10.              0

我通常都是使用NVL函数来检查空值的,但是,看上去COALESCE函数更加普遍(可以检查多个参数)并且COALESCE是一个所有关系型数据库系统都支持的标准函数。

那么是不是我该改变一下自己使用NVL的习惯转而使用COALESCE呢?各位有什么建议?

请使用这个链接进行函数使用率的投票。

全文完

译者:实际上吸引我的倒不是这篇文章,因为它太简单,呵呵。但是Eddie在文章的最后有一个投票的界面,还挺美观的,按照链接进去看了一下,dPolls,一个很实用的网上投票系统,并且提供了脚本用以将投票界面显示在自己的网页中,看来个人中心越来越受到服务提供商的重视了,无论是Flickr, Del.icio.us, 还是Planzo都提供了这样的脚本,网络中各种服务对于特定用户的体验都允许集中到这个用户自己的网页上,是个很好的现象,对吧。

注册dPolls很简单,注册完毕以后可以创建自己的投票,创建完毕以后dPolls会给出一段代码,将这段代码粘贴在自己的文章中就OK了,下面是我模仿Eddie作的一个完全相同的函数使用率投票,只是show一下界面,大家不要在我这里投,请使用上面的那个Eddie创建的投票链接。


Create polls and vote for free. dPolls.com

5 responses so far

Page 23 of 25« First...«2122232425»