[20140324]延迟块提交测试.txt

[20140324]延迟块提交测试.txt

做一个延迟块提交测试。主要出现一般是修改许多记录,修改后当前块已经不在buffer,在commit时,如果这时要读取在磁盘的数据块代
价太大,oracle使用一种延迟机制,在下次select时读取它,提交修改信息,这个时候产生redo信息。

SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

create table t (id number ,name varchar2(20));
insert into t values (1,'a');
commit ;

SCOTT@test> select rowid,t.* from t ;
ROWID                      ID NAME
------------------ ---------- --------------------
AABFkXAAEAAAACnAAA          1 a

SCOTT@test> @lookup_rowid AABFkXAAEAAAACnAAA
    OBJECT       FILE      BLOCK        ROW DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- ----------------------------------------
    284951          4        167          0 4,167                alter system dump datafile 4 block 167 ;

--关闭数据库,再测试。
SCOTT@test> @bh1 4 167
no rows selected

--没有读取不在buffer中。

SCOTT@test> select rowid,t.* from t where rowid='AABFkXAAEAAAACnAAA';
ROWID                      ID NAME
------------------ ---------- --------------------
AABFkXAAEAAAACnAAA          1 a

SCOTT@test> @bh1 4 167
DBARFIL      DBABLK CLASS STATE STATE1 CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ CR_UBA_REC CR_XID_USN CR_XID_SLT CR_XID_SQN CR_CLS_BAS CR_CLS_WRP   LRBA_SEQ   LRBA_BNO   HSCN_BAS   HSCN_WRP   HSUB_SCN OBJECT_NAME
------- ----------- ----- ----- ------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------
      4         167     1     1 xcur            0          0          0          0          0          0          0          0          0          0          0          0          0 4294967295      65535      65535 T

--已经加载块4,167在buffer。

--打开session1,修改记录不提交:
update t set name='b' where rowid='AABFkXAAEAAAACnAAA';

SCOTT@test> @bh1 4 167
DBARFIL      DBABLK CLASS STATE STATE1 CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ CR_UBA_REC CR_XID_USN CR_XID_SLT CR_XID_SQN CR_CLS_BAS CR_CLS_WRP   LRBA_SEQ   LRBA_BNO   HSCN_BAS   HSCN_WRP   HSUB_SCN OBJECT_NAME
------- ----------- ----- ----- ------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------
      4         167     1     1 xcur            0          0          0          0          0          0          0          0          0          0          0        928      41708 3268411537          0          1 T

--可以发现LRBA_SEQ变成928,对应是redo seq。

SCOTT@test> select * from v$log ;
    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ -------------------
         1          1        928   52428800        512          1 NO  CURRENT             3268407908 2014-03-24 09:52:47   2.8147E+14
         2          1        926   52428800        512          1 YES INACTIVE            3268353896 2014-03-20 22:13:22   3268388097 2014-03-21 11:36:05
         3          1        927   52428800        512          1 YES INACTIVE            3268388097 2014-03-21 11:36:05   3268407908 2014-03-24 09:52:47

SCOTT@test> alter system flush buffer_cache;
System altered.

SCOTT@test> @bh1 4 167

DBARFIL      DBABLK CLASS STATE STATE1 CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ CR_UBA_REC CR_XID_USN CR_XID_SLT CR_XID_SQN CR_CLS_BAS CR_CLS_WRP   LRBA_SEQ   LRBA_BNO   HSCN_BAS   HSCN_WRP   HSUB_SCN OBJECT_NAME
------- ----------- ----- ----- ------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------
      4         167     1     0 free            0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0 T

--state1=free ,LRBA_SEQ=0,表示已经写信息到磁盘中。

--回到session1,执行提交命令:
SCOTT@test> commit ;
Commit complete.

SCOTT@test> @bh1 4 167
DBARFIL      DBABLK CLASS STATE STATE1 CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ CR_UBA_REC CR_XID_USN CR_XID_SLT CR_XID_SQN CR_CLS_BAS CR_CLS_WRP   LRBA_SEQ   LRBA_BNO   HSCN_BAS   HSCN_WRP   HSUB_SCN OBJECT_NAME
------- ----------- ----- ----- ------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------
      4         167     1     0 free            0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0 T

--可以发现state1  = free,并没有读取相应的数据块。

SCOTT@test> set autot traceonly
SCOTT@test>  select rowid,t.* from t where rowid='AABFkXAAEAAAACnAAA';
Execution Plan
----------------------------------------------------------
Plan hash value: 3207308387
--------------------------------------------------------------------------------                                                                                                                                                                                               ---
| Id  | Operation                  | Name | Rows  | Bytes | Cost (%CPU)| Time                                                                                                                                                                                                    |
--------------------------------------------------------------------------------                                                                                                                                                                                               ---
|   0 | SELECT STATEMENT           |      |     1 |    37 |     1   (0)| 00:00:0                                                                                                                                                                                               1 |
|   1 |  TABLE ACCESS BY USER ROWID| T    |     1 |    37 |     1   (0)| 00:00:0                                                                                                                                                                                               1 |
--------------------------------------------------------------------------------                                                                                                                                                                                               ---
Statistics
----------------------------------------------------------
          1  recursive calls
          0  db block gets
          2  consistent gets
          1  physical reads
        116  redo size
        672  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

--可以发现产生了redo。第2次执行就没有了。

SCOTT@test>  select rowid,t.* from t where rowid='AABFkXAAEAAAACnAAA';
Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          1  consistent gets
          0  physical reads
          0  redo size
        672  bytes sent via SQL*Net to client
        519  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SCOTT@test> @bh1 4 167
DBARFIL      DBABLK CLASS STATE STATE1 CR_SCN_BAS CR_SCN_WRP CR_UBA_FIL CR_UBA_BLK CR_UBA_SEQ CR_UBA_REC CR_XID_USN CR_XID_SLT CR_XID_SQN CR_CLS_BAS CR_CLS_WRP   LRBA_SEQ   LRBA_BNO   HSCN_BAS   HSCN_WRP   HSUB_SCN OBJECT_NAME
------- ----------- ----- ----- ------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------
      4         167     1     1 xcur            0          0          0          0          0          0          0          0          0          0          0        928      45450 3268411934          0          1 T
      4         167     1     0 free            0          0          0          0          0          0          0          0          0          0          0          0          0          0          0          0 T

--可以发现STATE1=xcur的记录,LRBA_SEQ=928,也说明产生了日志。

--补充一下,测试脚本:
$ cat bh1.sql
set echo off
--------------------------------------------------------------------------------
-- @name: bh
-- @author: dion cho
-- @note: show block header
-- @usage: @bh f# b#
--------------------------------------------------------------------------------

col object_name format a12
col state1 format a6
col dbarfil format 999999
col dbablk  format 9999999999
col state format 99
col class format 99

select
  b.dbarfil,
  b.dbablk,
  b.class,
  state,
  decode(state,0,'free',1,'xcur',2,'scur',3,'cr', 4,'read',5,'mrec',6,'irec',7,'write',8,'pi', 9,'memory',10,'mwrite',11,'donated') as state1,
  cr_scn_bas,
  cr_scn_wrp,
  cr_uba_fil,
  cr_uba_blk,
  cr_uba_seq,
  cr_uba_rec,
  cr_xid_usn,
  cr_xid_slt,
  cr_xid_sqn,
  cr_cls_bas,
  cr_cls_wrp,
  lrba_seq,
  lrba_bno,
  hscn_bas,
  hscn_wrp,
  hsub_scn,
  (select object_name from dba_objects where object_id = b.obj) as object_name
from x$bh b
where
  dbarfil = &1 and
  dbablk = &2
;

$ cat lookup_rowid.sql
set verify off
column dba format a20
column text format a40
SELECT DBMS_ROWID.ROWID_OBJECT ('&1') "OBJECT",
       DBMS_ROWID.ROWID_RELATIVE_FNO ('&1') "FILE",
       DBMS_ROWID.ROWID_BLOCK_NUMBER ('&1') "BLOCK",
       DBMS_ROWID.ROWID_ROW_NUMBER ('&1') "ROW",
          DBMS_ROWID.ROWID_RELATIVE_FNO ('&1')
       || ','
       || DBMS_ROWID.ROWID_BLOCK_NUMBER ('&1')
          "DBA",
          'alter system dump datafile '
       || DBMS_ROWID.ROWID_RELATIVE_FNO ('&1')
       || ' block '
       || DBMS_ROWID.ROWID_BLOCK_NUMBER ('&1')
       || ' ;'
          text
  FROM DUAL;

时间: 2024-09-20 16:35:13

[20140324]延迟块提交测试.txt的相关文章

[20170428]延迟块清除测试.txt

[20170428]延迟块清除测试.txt --//做一个延迟块清除测试,前面的测试太乱了,思路非常不清楚. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------------------

[20170420]关于延迟块清除2.txt

[20170420]关于延迟块清除2.txt --昨天做延迟块清除测试时,有一个问题我自己一直没搞明白,就是把表空间设置为只读的情况下,当访问块时, --由于没法更新对应块,不知道为什么每次重启数据库,正常undo的事务槽不可能这么块覆盖,为什么ora_rowscn --总是变化,而且取的是control scn,要认真探究一下问题在那里. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BA

[20170420]关于延迟块清除3.txt

[20170420]关于延迟块清除3.txt --昨天做延迟块清除测试时,有一个问题我自己一直没搞明白,就是把表空间设置为只读的情况下,当访问块时, --由于没法更新对应块,不知道为什么每次重启数据库,正常undo的事务槽不可能这么块覆盖,为什么ora_rowscn --总是变化,而且取的是control scn,要认真探究一下问题在那里. --上午测试没有测试出来,链接http://blog.itpub.net/267265/viewspace-2137714/ => [20170420]关于

[20150409]只读表空间与延迟块清除.txt

[20150409]只读表空间与延迟块清除.txt --昨天测试只读表空间的数据库恢复问题,突然想到一种情况,如果只读表空间存在延迟块清除情况,这样在下次访问是会更新块的信息吗? --自己还是做1个测试: 1.首先在测试前,说明1点,设置表空间只读,仅仅阻止dml操作,并不能阻止ddl操作,ddl操作的是数据字典. SCOTT@test> @ &r/ver1 PORT_STRING                    VERSION        BANNER --------------

[20170419]关于块scn号.txt

[20170419]关于块scn号.txt --//数据块里面有许多scn号相关. --//数据块本身有三处记录的相应的SCN:数据块头的SCN(block scn).ktbbh结构下的 kscnbas,kscnwrp(cleanout scn).ITL信息中的 --//scn/fsc(commit scn 有时候会是control scn),有时候会存在一点点混乱,通过例子说明: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                

[20150515]关于块转储问题.txt

[20150515]关于块转储问题.txt --我自己在学习oracle有时候使用块转储时,发现转储的内容跟我自己的想象不一样. --正好前一阵子ITPUB有人也遇到类似的问题,自己做一个简单探究: 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -----------------------

[20150321]索引空块的问题.txt

[20150321]索引空块的问题.txt --晚上看了: 索引空块较多造成index range scan的IO成本较高 http://www.dbaxiaoyu.com/archives/2504 --感觉有点怪怪的: SELECT /*+gather_plan_statistics ab*/ LOG.OID              OID, LOG.REGION           REGION, LOG.ACCEPT_SEQ       ACCEPT_SEQ, LOG.PROCESS_

[20150527]bbed与数据块检查和2.txt

[20150527]bbed与数据块检查和2.txt http://blog.itpub.net/267265/viewspace-1666781/ --我现在基本拿bbed学习,基本是拿bbed查看,而使用bvi修改数据.我感觉这种方便1写. --实际上使用bbed的好处就是修改数据块检查和不一致,而使用bbed修改很简单仅仅需要执行sum apply就ok了. --对比dbv与bbed确定检查和位置. --实际上既然检查和在16,17字节,只要清零,加上dbv就很容易确定要修改的内容. 1.

[20151109]提升scn号11g测试.txt

[20151109]提升scn号11g测试.txt --以前的测试都在10g下进行的,在11.2.0.4下重复测试. 1.测试环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------------