新书连载:深入剖析dump block对数据库的影响

编辑说明:《Oracle性能优化与诊断案例精选》出版以来,收到很多读者的来信和评论,我们会通过连载的形式将书中内容公布出来,希望书中内容能够帮助到更多的读者朋友们。

中国有一句古话说“熟视无睹,常见不疑”,指的是我们可能忽视那些随时可见的事物,并且对常见之处深信不疑,这期间可能存在巨大的误区。能够基于常见问题提出辨析和思考,并通过实践验证,是最为考验一个人知识体系的。

接下来我们分析两个常见的案例

一、当我们使用Dump Block方式进行数据块转储时,是否需要将数据读入内存呢?

这是个常用的操作,可是很少有人思考过这个问题,有了思考还要有方法去验证,这整个过程代表着一个工程师在技术上的成熟。

我们立即动手,通过实例来求解一下这个问题的答案。

1、重启一下数据库,这样buffer cache中几乎就没什么用户数据了,方便测试。

2、找一张表看看是在哪个file哪个block里面(测试表,一行数据)。

SQL> select dbms_rowid.rowid_relative_fno(rowid)fno,dbms_rowid.rowid_block_number (rowid) block# from t1; FNO BLOCK# ---- -------- 1 103001

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

SQL> select count(*) 2 from v$bh 3 where file# = 1 and block# = 103001; COUNT(*) ---------- 0

v$bh视图保存着buffer cache中每一个block的信息,是一个重要视图。

4、目前buffer cache中没有这个block,做一次Dump再看看有没有。

SQL> alter system Dump datafile 1 block 103001; System altered SQL> select count(*) 2 from v$bh where file# = 1 and block# = 103001; COUNT(*) ---------- 0

5、这就验证了做block Dump不会把数据块先读入buffer cache。

6、继续做一次select看看,这次一定是读进buffer cache了。

SQL> select * from ops$kamus.t1; SQL> select count(*) 2 from v$bh 3 where file# =1 and block# =103001; COUNT(*) ---------- 1

这就证明了我们的结论:DumpBlock操作不会引发Block读入Buffer Cache。

二、 Dump Block是否会引起脏数据写入磁盘

伴随着上一个问题,随之而来的问题是:Dump Block会否触发脏数据写入磁盘?

这一次我们尝试一个不同的工具BBED。BBED(OracleBlock 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。

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

7、做checkpoint

SQL> ALTER system checkpoint; System altered

8、再次运行bbed。

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

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

merge语句导致的性能问题紧急优化 (r9笔记第85天)

晚上正在休息的时候,突然收到一封报警邮件。 报警内容: CPU utilization is too high ------------------------...

2575
来自专栏木东居士的专栏

拉链表是什么

1734
来自专栏沃趣科技

MySQL中的统计信息相关参数介绍

统计信息的作用 上周同事在客户现场遇到了由于统计信息的原因,导致应用数据迁移时间过慢,整个迁移差点失败。关键时刻同事发现测试环境与生产环境SQL语句执行计划不一...

32610
来自专栏服务端思维

基于数据的访问控制

基于角色的访问控制,只验证访问数据的角色,但是没有对角色内的用户做细分。举个例子,用户甲与用户乙都具有用一个角色,但是如果只建立基于角色的访问控制,那么用户甲可...

571
来自专栏日常学python

今天来认识下数据库

这是我的第七篇原创文章 爬了数据,只能放在记事本上?小的数据还是可以的,但是当你遇到较多的数据,放在记事本上就不是很好了,这时就需要用到数据库来存储了,那我们今...

34514
来自专栏杨建荣的学习笔记

DB time抖动的原因分析案例分享(r6笔记第67天)

今天来给大家分享一下DBtime抖动的诊断案例。讲到的不足之处还希望大家多多指正,共同提高。案例会分下面几个方面来说。 ? 首先来说问题的背景。因为使用的数...

2957
来自专栏程序员的SOD蜜

用惯了ORM,居然不会写分页SQL了

    最近准备找新工作,于是下午请了假,去上地软件园一家国内大型软件外包公司去面试架构师,从国贸到面试地点,坐地铁足足走了一个半小时,终于到了前台,联系了HR...

2396
来自专栏数据和云

性能优化:B*Tree 索引中的数据块分配(五)

黄玮(Fuyuncat) 资深Oracle DBA,个人网www.HelloDBA.com,致力于数据库底层技术的研究,其作品获得广大同行的高度评价. 编辑手记...

2626
来自专栏杨建荣的学习笔记

今天处理的三个小问题——20160120(r7笔记第84天)

今天处理了几件事情,有几件还比较有意思,我拿出三件来说说。 首先是早上有一个同学打电话求助一个问题,给我的反馈是他们目前有一个表,数据量越来越大,目前数据插入变...

2704
来自专栏杨建荣的学习笔记

自动化平台中的ORM和权限设计

最近在梳理平台里的一些基础架构和设计,力争把平台里的通用的部分能够抽象出来,迭代复用。 在数据库设计上我秉承了从简的原则,如果能用一个表搞定,我绝对不会把它拆分...

3115

扫描关注云+社区