今天刚吃完骨头煲,回到家已是21:30分。由于昨天和今天针对Oracle dirty block做了一些测试,得到了一些结果。于是想把测试过程记录一下,以备后忘。
Oracle dirty block指的是buffer cache中发生过变化且没有刷新到datafile。Oracle block在block head会记录其发生变化时的scn,
也就是说Oracle block在buffer cache更改时也会赋予Oracle当前的scn(如果目前Oracle current scn为1000,此时block发生变化,Oracle会将1000写入block head,这在上篇blog中也有所涉及)。
本文要探讨主要有2个方面:
1、Oracle block刷到数据文件时,是否有做判断?
(1)如果block在buffer cache中未发生变化,执行alter system flush buffer_cache时是否也会将此block刷新至数据文件?
(2)如果block在buffer cache中发生了变化(也就意味着dirty block),执行alter system flush buffer_cache是否也会将此block刷新至数据文件?
如果会刷新至数据文件,当磁盘的block scn大于buffer cache中block scn时,刷出动作是否也会进行?
(3)在rac情况下,block刷新至数据文件是否有区别?
2、alter system checkpoint和alter system flush buffer_cache有什么区别?
首先探讨第一种情况:
如果block在buffer cache中未发生变化,执行alter system flush buffer_cache时是否也会将此block刷新至数据文件?
创建业务用户zhoul,并创建测试表格zhoul
SQL> conn zhoul/zhoul
Connected.
SQL> create table zhoul (i int,name varchar(20));
Table created.
SQL> insert into zhoul values(1,'aaa');
1 row created.
SQL> insert into zhoul values(2,'bbb');
1 row created.
SQL> insert into zhoul values(3,'ccc');
1 row created.
SQL> commit;
Commit complete.
执行全量checkpoint,确保变化块写入数据文件。
SQL> alter system checkpoint;
System altered.
利用dbms_rowid函数获取表格数据对应的数据文件号和block号
SQL> col file# for 999
SQL> col block# for 99999
SQL> set linesize 300
SQL> select dbms_rowid.ROWID_RELATIVE_FNO(rowid) file#,dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block#,i,name from zhoul;
FILE# BLOCK# I NAME
----- ------ ---------- --------------------
7 15511 1 aaa
7 15511 2 bbb
7 15511 3 ccc
SQL> select name from v$datafile where file#=7;
NAME
--------------------------------------------------------------------------------
/oradata/mcstar/zhoul01.dbf
以aaa列为例,将其转化为16进制之后是616161
SQL> select dump('aaa',16) from dual;
DUMP('AAA',16)
----------------------
Typ=96 Len=3: 61,61,61
利用bbed find字符串功能,定位到行aaa在block 15511偏移量位置8185之后开始存储,共占用3个字节。
[ora10g@mcprod admin]$ bbed filename=/oradata/mcstar/zhoul01.dbf blocksize=8192 password=blockedit mode=edit
BBED> find /c aaa
File: /oradata/mcstar/zhoul01.dbf (0)
Block: 15511 Offsets: 8185 to 8191 Dba:0x00000000
------------------------------------------------------------------------
61616105 067757
<32 bytes per line>
将其改变为zzz字符串,注意这是利用bbed在物理级别修改,Oracle 在buffer cache中并未修改,所以Oracle依旧认为block 15511状态为clean。
BBED> modify /c zzz
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /oradata/mcstar/zhoul01.dbf (0)
Block: 15511 Offsets: 8185 to 8191 Dba:0x00000000
------------------------------------------------------------------------
7a7a7a05 067757
<32 bytes per line>
BBED> sum apply
Check value for File 0, Block 15511:
current = 0x9976, required = 0x9976
BBED> exit
如果此时查询zhoul业务表格,可以看到aaa依然存在,并没有出现我们所期望的zzz列,这是因为aaa列依旧在buffer cache中。
SQL> select * from zhoul;
I NAME
---------- --------------------
1 aaa
2 bbb
3 ccc
将buffer cache刷出,再次执行,
可以看到zzz列出现,也就是我们利用bbed物理上修改的结果。
SQL> alter system flush buffer_cache;
System altered.
SQL> select * from zhoul;
I NAME
---------- --------------------
1 zzz
2 bbb
3 ccc
此时查看数据文件,依然是7a7a7a。
BBED> dump block 15511 offset 8185
File: /oradata/mcstar/zhoul01.dbf (0)
Block: 15511 Offsets: 8185 to 8191 Dba:0x00000000
------------------------------------------------------------------------
7a7a7a05 067757
<32 bytes per line>
通过以上测试,我们可以得出以下结论:
当Oracle认为此block不是dirty block,为加快flush buffer cache效率,Oracle并不会将其真正刷至datafile中。
当执行alter system flush buffer cache时,只会将其在内存中清空。
分享到:
相关推荐
Oracle是业界广泛使用的大型关系型数据库管理系统,其核心组成部分之一就是数据块结构(Block)。数据块是Oracle数据库中最小的存储单位,是操作系统中读写数据的基本单位,也是数据库实例中逻辑上存储数据的基本...
gc block lost 是 Oracle RAC 环境中一种常见的性能问题,其原因是由于 Global Cache(全局高速缓存)中块的丢失所引起的。在 Oracle RAC 环境中,每个实例都维护着一个 Local Cache(本地高速缓存),用于存储当前...
Oracle 数据块(Block)是数据库存储的基本单位,它在Oracle数据库管理系统中扮演着至关重要的角色。数据块的设计和管理直接影响到数据库的性能和空间利用率。本文将深入解析Oracle数据块的结构及其相关知识点。 ...
BBED(Oracle Block Brower and EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。
在Oracle数据库中,Block是数据存储的基本单位,而AVG_SPACE是与Block内部空间使用情况密切相关的统计信息。理解AVG_SPACE的意义对于优化数据库性能和管理空间至关重要。 AVG_SPACE表示在每个Block中的平均空闲空间...
本文旨在探讨 Oracle 数据库服务器 IO 高的分析方案和案例探讨,旨在帮助系统管理员和存储管理员更好地理解 Oracle 数据库服务器 IO 高的问题,并提供了一些实用的解决方案。 一、 Oracle 数据库服务器 IO 高的原因...
Oracle数据库升级是一项关键任务,特别是在业务需求不断增长和技术日新月异的今天。Oracle数据库作为一款广泛使用的高性能关系型数据库,其升级过程涉及多个方面,包括选择合适的升级策略、评估风险以及确保业务连续...
ORACLE数据库系统安全探讨.pdf
Oracle数据库优化设计探讨.pdf
Oracle数据库安全性探讨.pdf
"Oracle数据库容灾备份技术...Oracle数据库容灾备份技术探讨是一种非常重要的技术,可以保护和恢复Oracle数据库,确保数据库的高可用性和业务连续性。不同的灾备技术可以根据不同的业务需求和应用场景进行选择和实施。
Oracle数据库是目前世界上最广泛使用的大型...总的来说,Oracle数据库管理技术的探讨涉及到数据库安全、数据处理能力、商业智能支持和架构适应性等多个层面,这些技术对于确保企业数据安全、提升业务效率具有重要意义。
Oracle通过数据块(block)中的ITL(Intent To Lock)事务列表来记录事务对行的修改,每行的头部有一个Lock byte标识锁定状态。未提交的事务使用ITL的SLOT和Lock byte表示被封锁的行。此外,Oracle的行级锁实际上是...
#### 一、Data Block 物理结构概述 在 Oracle 数据库中,数据块(Data Block)是最基本的数据存储单位。一个数据块通常包含了一系列的记录,这些记录用于存储数据库表中的数据。理解数据块的物理结构对于深入掌握 ...
ORACLE数据库安全性探讨 (2).pdf
本文主要探讨两种主要的认证方式:基于操作系统的登录认证和基于Oracle的验证,并详细解释如何通过配置sqlnet.ora文件来改变登录认证方式。 首先,基于操作系统的登录认证(Operating System Authentication,简称...
本文将深入探讨如何在Oracle中将一个用户的所有表的权限授予另一个用户,这一过程通常在PL/SQL环境下通过执行特定的命令来完成。下面我们将详细解析这一操作的步骤、原理以及可能遇到的问题。 ### Oracle中的权限...
根据提供的标题、描述、标签及部分内容,我们可以了解到本篇文章主要关注的是如何在Oracle数据库中查询一个月内的数据。这里的关键在于日期范围的确定以及如何利用Oracle的内置函数来完成这一任务。接下来,我们将...
本文将深入探讨如何在C#中利用Oracle自带的驱动来实现批处理,以一次执行多条SQL语句。 首先,我们需要了解Oracle的数据驱动,即ODP.NET(Oracle Data Provider for .NET)。这是Oracle公司为.NET开发者提供的一个...