Oracle(block clean out)的块清除
Clean out有2种: fast commit cleanout,delayed block cleanout
1.如果一个事务(transaction)修改不超过10%buffer cache的数据块时,oracle做的是fast commit leanout。
2.如果一个事务(transaction)修改的块超过10% buffer cache,那么超过的块"就执行delayed block leanout,
3.在事务commit前,修改的数据块已经写入硬盘,当发生commit时,oracle并不会把block重新读入内存来做cleanout,这样成本太高.而是把cleanout留到下一次对此块的访问(select,update)时完成。
SQL> show parameter db_cache;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_cache_size big integer 58720256
--只需更改50M/10=5M的数据量就会触发DELAY CLEAN OUT
SQL> create table t2 (id int ,col1 char(2000),col2 char(2000),col3 char(2000),col4 char(1000));
表已创建。
--1行一个块,
SQL> insert into t2 select object_id,object_name,'1','1','1' from all_objects where rownum <=1000;
已创建1000行。
SQL> commit;
SQL> select * from (
select rownum rn, id,dbms_rowid.rowid_relative_fno(rowid) "file#",dbms_rowid.rowid_block_number(rowid) "block#" from t2 )
3 where rn=1 or rn=1000;
RN ID file# block#
---------- ---------- ---------- ----------
1 7559 8 36
1000 14700 8 1160
--fast clean out 快速块清除
SQL> update t2 set id=id,col1=col1,col2='c',col3='c',col4='c' where id='7559'; --第36块
1 ROWS UPDATED
SQL> select xidusn,xidslot,xidsqn,ubafil,ubablk,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBAREC
-------- ---------- ---------- ---------- ---------- ----------
10 22 339 2 41167 11
SQL> COMMIT;
提交成功
SQL> alter system dump datafile 8 block 36;
系统已更改。
Start dump data blocks tsn: 8 file#: 8 minblk 36 maxblk 36
buffer tsn: 8 rdba: 0x02000024 (8/36)
scn: 0x0000.000b21db seq: 0x01 flg: 0x00 tail: 0x21db0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02000024
Object id on Block? Y
seg/obj: 0x739d csc: 0x00.b21db itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2000021 ver: 0x01
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.02b.00000152 0x0080a0c5.002a.2a C--- 0 scn 0x0000.000b218f
0x02 0x000a.016.00000153 0x0080a0cf.002a.0b ---- 1 fsc 0x0000.00000000
----这里的FLAG已经清除
--delay clean out 延时块清除
SQL> update t2 set id=id,col1=col1,col2='c',col3='c',col4='c'; --8M的更新数据
已更新1000行。
SQL> select xidusn,xidslot,xidsqn,ubafil,ubablk,ubarec from v$transaction;
XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBAREC
---------- ---------- ---------- ---------- ---------- ----------
3 8 470 2 6788 1
SQL> COMMIT;
SQL> alter system dump datafile 8 block 36; --大于db_cache_size 10%的块
系统已更改。
SQL> alter system dump datafile 8 block 1160; --小于db_cache_size 10%的块
系统已更改。
Start dump data blocks tsn: 8 file#: 8 minblk 36 maxblk 36
buffer tsn: 8 rdba: 0x02000024 (8/36)
scn: 0x0000.000b2b52 seq: 0x01 flg: 0x02 tail: 0x2b520601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02000024
Object id on Block? Y
seg/obj: 0x739d csc: 0x00.b21db itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2000021 ver: 0x01
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.02b.00000152 0x0080a0c5.002a.2a C--- 0 scn 0x0000.000b218f
0x02 0x0003.008.000001d6 0x0080129d.0043.01 --U- 1 fsc 0x0000.000b2b52
|
|
----大于10%的块未被清除
Start dump data blocks tsn: 8 file#: 8 minblk 1160 maxblk 1160
buffer tsn: 8 rdba: 0x02000488 (8/1160)
scn: 0x0000.000b2b5d seq: 0x01 flg: 0x00 tail: 0x2b5d0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02000488
Object id on Block? Y
seg/obj: 0x739d csc: 0x00.b2b5d itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x200040a ver: 0x01
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x000a.02b.00000152 0x0080a0ce.002a.6a C--- 0 scn 0x0000.000b218f
0x02 0x0003.008.000001d6 0x00801a84.004a.01 C--- 0 scn 0x0000.000b2b52
|
|
----小于10%的块被清除
--再次访问这些块时,会被清除
SQL> set autot on
SQL> select count(*) from t2;
COUNT(*)
----------
1000
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'T2'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1265 consistent gets
0 physical reads
15600 redo size
--产生很多的REDO信息,用于块清除
376 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> /
COUNT(*)
----------
1000
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'T2'
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1005 consistent gets
0 physical reads
0 redo size
--再访问就没有REDO了
376 bytes sent via SQL*Net to client
503 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
--再来看清除的数据块信息
SQL> alter system dump datafile 8 block 36;
系统已更改。
SQL> alter system dump datafile 8 block 1160;
系统已更改。
Start dump data blocks tsn: 8 file#: 8 minblk 36 maxblk 36
buffer tsn: 8 rdba: 0x02000024 (8/36)
scn: 0x0000.000b3059 seq: 0x01 flg: 0x02 tail: 0x30590601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02000024
Object id on Block? Y
seg/obj: 0x739d csc: 0x00.b2c2a itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x2000021 ver: 0x01
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.000.000001d7 0x00800761.003e.01 C--- 1 fsc 0x0000.000b3059
0x02 0x0003.008.000001d6 0x0080129d.0043.01 C--- 0 scn 0x0000.000b2b52
|
|
----大于10%的块也被清除成功
Start dump data blocks tsn: 8 file#: 8 minblk 1160 maxblk 1160
buffer tsn: 8 rdba: 0x02000488 (8/1160)
scn: 0x0000.000b305a seq: 0x01 flg: 0x00 tail: 0x305a0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02000488
Object id on Block? Y
seg/obj: 0x739d csc: 0x00.b305a itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x200040a ver: 0x01
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0008.000.000001d7 0x00801ec8.0046.01 C--- 0 scn 0x0000.000b3059
0x02 0x0003.008.000001d6 0x00801a84.004a.01 C--- 0 scn 0x0000.000b2b52
|
|
----小于10%的块不变
参考至:http://blog.sina.com.cn/s/blog_7414f6640100thhf.html
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
Oracle是业界广泛使用的大型关系型数据库管理系统,其核心组成部分之一就是数据块结构(Block)。数据块是Oracle数据库中最小的存储单位,是操作系统中读写数据的基本单位,也是数据库实例中逻辑上存储数据的基本...
Oracle 数据块(Block)是数据库存储的基本单位,它在Oracle数据库管理系统中扮演着至关重要的角色。数据块的设计和管理直接影响到数据库的性能和空间利用率。本文将深入解析Oracle数据块的结构及其相关知识点。 ...
gc block lost 是 Oracle RAC 环境中一种常见的性能问题,其原因是由于 Global Cache(全局高速缓存)中块的丢失所引起的。在 Oracle RAC 环境中,每个实例都维护着一个 Local Cache(本地高速缓存),用于存储当前...
"Oracle 坏块修复" Oracle 坏块修复是指在 Oracle 数据库中出现的数据块混乱现象,导致数据库进程无法正常解析数据块的内容,进而使数据库进程报错乃至挂起,并级联导致整个数据库实例出现异常。 一、坏块的产生...
Oracle存储过程中的“Out”游标是数据库编程中一种常用的技术,主要用于在PL/SQL块中返回结果集到调用者。在这个场景中,我们有三个文件:TESTPACKAGE.txt,CURSOR_TEST2.txt和OracleProcedure.java,分别涉及Oracle...
BBED(Oracle Block Brower and EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是Oracle一款内部工具,可以直接修改Oracle数据文件块的内容,在一些极端恢复场景下比较有用。
Oracle 数据库中,最基本的数据管理单位是数据块(datablock),它是数据库逻辑上最小的数据单位。在操作系统级别,数据是最小物理存储单位是字节(byte),而在数据库级别则是数据块。Oracle 在处理数据时,通常以...
一个数据块(Block)是 Oracle 数据库中的最小存储单元,它是数据文件(Datafile)中的一部分。每个数据块的大小可以是 2k、4k、8k 或 16k 等,取决于数据库的设置。 在 Oracle 数据库中,数据块的结构主要包括以下...
在 Oracle 数据库中,数据块(Data Block)是最基本的数据存储单位。一个数据块通常包含了一系列的记录,这些记录用于存储数据库表中的数据。理解数据块的物理结构对于深入掌握 Oracle 数据库的工作原理至关重要。 ...
Oracle数据库的块转储(Dumping Oracle Blocks)是一种技术,用于查看数据库中特定数据块、索引块或控制文件块的详细内容。这种操作通常由DBA(数据库管理员)进行,以便深入了解数据库内部的工作机制,或者在遇到...
例如,我们可能会看到类似于“ORA-01578: ORACLE data block corrupted”的错误消息,这表明存在物理损坏的数据块。 坏块错误的影响广泛,可能会影响数据的完整性和一致性,导致查询失败、应用崩溃或者性能下降。...
### Oracle坏块处理详解 #### 引言 在Oracle数据库管理中,遇到ORA-01578错误,即“Oracle数据块损坏”,是DBA(数据库管理员)们经常面临的一项挑战。这种错误通常伴随着ORA-01110错误,指向特定的数据文件及其...
BBED(Block Browser and Editor)是 Oracle 数据库中用于浏览和编辑数据块的重要工具。使用 BBED 工具可以查看和编辑数据块的内容,从而对数据块的内部结构进行分析和修改。 五、解决 ORA-1200 错误 ORA-1200 ...
Oracle RAC 环境下索引热块的处理思路是指在 Oracle RAC 环境下,due to the high concurrency and parallelism of multiple instances, the index block contention issue may occur, leading to performance ...
Oracle 数据块解析是理解 Oracle 数据库内部工作原理的关键部分。数据块是数据库进行最小 I/O 操作的单位,它包含了存储在表、索引和其他数据库对象中的数据。在这个过程中,我们将通过一系列步骤来了解数据块的内部...
Oracle块碎片监控清理以提高性能大全: Oracle_表碎片的监控与清理.pdf Oracle碎片整理 .pdf 表碎片起因及解决办法.pdf 消除oracle块碎片以提高性能.pdf 消除oracle碎片.pdf
BBED(Block Media Recovery)是Oracle提供的一个强有力的内部工具,它允许用户在块级别上直接对数据块进行编辑和修复。这意味着即使遇到磁盘数据错误或磁盘损坏,用户也可以通过BBED对损坏的块进行诊断和恢复。BBED...