`

SCN之delayed block cleanout

 
阅读更多

 Block的cache header部分,记录着一个block scn,它是当前块最后一次变更的时间戳(确切说,这个更新并不是指itl上的scn的最新更新,在接下来delayed block cleanout下的slot重用情况下,可以看到block scn并不等于itl上的最后一次更新的scn)。可以通过dump获得block scn/last itl scn 和发布ora_rowscn语句获得last itl scn。

1. SQL> select distinct ora_rowscn,dbms_rowid.rowid_block_number(rowid) from test_ind where dbms_rowid.rowid_block_number(rowid)=31501;
ORA_ROWSCN DBMS_ROWID.ROWID_BLOCK_NUMBER(
———- ——————————
617405 31501

2. SQL> alter system dump datafile 4 block 31501;
Start dump data blocks tsn: 4 file#: 4 minblk 31501 maxblk 31501
buffer tsn: 4 rdba: 0x01007b0d (4/31501)
scn: 0×0000.00096bbd seq: 0×01 flg: 0×02 tail: 0x6bbd0601
frmt: 0×02 chkval: 0×0000 type: 0×06=trans data
――――――――――――――――――――――――――――――――――――――
Itl Xid Uba Flag Lck Scn/Fsc
0×01 0x000a.001.00000089 0x008033be.0046.14 C— 0 scn 0×0000.00065b9e
0×02 0×0008.02b.000000ac 0x00802fea.004a.28 –U- 1 fsc 0×0000.00096bbd

    发布transaction后,未提交之前,block scn是不会改变的,对应的itl中也并不做scn记录。Block scn的改变,确切的说不是在发布commit之时(因为有delayed block cleanout的情况存在),而是在transaction对应的itl获得commit scn之时。

    当发生fast commit cleanout,系统将transaction提交时刻的scn作为commit scn,更新block上 itl和undo segment header的Transaction table的slot上的 scn,并修改block scn,三者是一致的。发生delayed block cleanout的时候,之前的transaction commit更新的只是Transaction table,而并未做block上的处理,等待下次使用此block的时候,更新block scn和itl状态。block scn和itl的更新又分2种情况:
    (1)当不产生undo slot重用的时候, delayed block cleanout时,结合Transaction table里面和undo slot的信息,更新block scn和itl上的Scn/Fsc为transaction曾经提交时候的scn。
    (2)当产生undo slot重用的时候,更新对应itl上scn为control scn,而block scn 为delayed block cleanout发生时刻的scn。

    简单看一下这个测试过程。

(一)fast commit cleanout

1.建表/插入数据

SQL> create table test_scn(see char(500)) pctfree 90 tablespace test_a ;
Table created
SQL> insert into test_scn values(‘see1′);
1 row inserted
SQL> insert into test_scn values(‘see2′);
1 row inserted
SQL> commit;
Commit complete
SQL> select dbms_rowid.rowid_block_number(rowid),ora_rowscn from test_scn;
DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN
—————————— ———-
25617 622604
25618 622604

2.发布事务更新

SQL> update test_scn set see=’kao’ where see=’see1′;
SQL> select dbms_rowid.rowid_block_number(rowid),ora_rowscn from test_scn;
DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN
—————————— ———-
25617 622604
25618 622604 ――发现block scn并未改变
SQL>commit;

SQL> select dbms_rowid.rowid_block_number(rowid),ora_rowscn from test_scn;

DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN
—————————— ———-
25617 622604
25618 622683 ――已经更新

(二) delayed block cleanout

1.创建一个小undo表空间.

SQL> create undo tablespace undo datafile ‘E:\ORACLE\PRODUCT\10.2.0\ORADATA\DEMO\undo.dbf’ size 2M;
Tablespace created
SQL> alter system set undo_tablespace=’undo’;
System altered

2 .发布更新后,清空buffer_cache,创造延时块清除条件,然后提交

SQL> select dbms_rowid.rowid_block_number(rowid),dbms_rowid.rowid_relative_fno(rowid), ora_rowscn,t.* from test_scn t;
DBMS_ROWID.ROWID_BLOCK_NUMBER( DBMS_ROWID.ROWID_RELATIVE_FNO( ORA_ROWSCN SEE
—————————— —————————— ———- ——————–
25617 6 625000 kao1
25618 6 693298 see2
SQL> update test_scn set see=’kao2′ where see=’see2′;
1 row updated
SQL> select XIDUSN,XIDSLOT,XIDSQN from v$transaction;
XIDUSN XIDSLOT XIDSQN
———- ————- —————- —————- —————-
20 33 21 ――得到XIDUSN,XIDSLOT的使用情况,后续发布重用脚本
SQL> alter system flush buffer_cache;
System altered
SQL> commit;
Commit complete
SQL> select timestamp_to_scn(systimestamp) from dual;
TIMESTAMP_TO_SCN(SYSTIMESTAMP)
——————————
693323 —–大概的commit scn

3.发布脚本,使XIDUSN 20 XIDLOT 33 重用。

SQL>exec proc_go_break_reuse(20,33,21);

代码如下:

CREATE TABLE goon
AS
   SELECT *
     FROMdba_objects
    WHERE 1 = 2;

create or replace PROCEDURE proc_go_break_reuse (v_XIDUSN     NUMBER,
                                                v_XIDSLOT    NUMBER,
                                                v_XIDSQN     NUMBER)
/* ————————————————–
Description:It’s used to maketransaction slot reused
—————————————————*/
AS
   nsid                 NUMBER;
   TYPE transaction_record_type IS RECORD
   (
      XIDUSN    NUMBER,
      XIDSLOT   NUMBER,
      XIDSQN    NUMBER
   );
  transaction_record  transaction_record_type;
BEGIN
   SELECT SYS_CONTEXT ('userenv', 'sid') INTO nsid FROM DUAL;
   LOOP
      INSERT INTO goon
         SELECT *
           FROM dba_objects
          WHERE ROWNUM < 100;
      SELECT XIDUSN,XIDSLOT,XIDSQN
        INTO transaction_record
        FROM v$transaction a,v$session b
       WHERE a.ADDR = b.TADDR AND b.SID = nsid;
      IF (    transaction_record.XIDUSN=v_XIDUSN
          AND transaction_record.XIDSLOT =v_XIDSLOT
          AND transaction_record.XIDSQN >v_XIDSQN)
      THEN
         GOTO resue_end;
      END IF;
      COMMIT;
      DELETE FROM goon;
      SELECT XIDUSN,XIDSLOT,XIDSQN
        INTO transaction_record
        FROM v$transaction a, v$session b
       WHERE a.ADDR = b.TADDR AND b.SID = nsid;
      IF (    transaction_record.XIDUSN=v_XIDUSN
          AND transaction_record.XIDSLOT=v_XIDSLOT
          AND transaction_record.XIDSQN >v_XIDSQN)
      THEN
         GOTO resue_end;
      END IF;
      COMMIT;
   END LOOP;
  <<resue_end>>
   COMMIT;
END;

4.产生延时块清除,记录相应scn号

SQL> select * from test_scn;
SEE
——————————————————————————–
kao1
kao2
SQL> select timestamp_to_scn(systimestamp) from dual;

TIMESTAMP_TO_SCN(SYSTIMESTAMP)
——————————
703860 ―――发生延时块清除时候的大概scn

SQL> select dbms_rowid.rowid_block_number(rowid), ora_rowscn from test_scn t where see=’kao2′;

DBMS_ROWID.ROWID_BLOCK_NUMBER( ORA_ROWSCN
—————————— ———-
25618 701061 —最后一次itl 上的 commit scn

5.dump undo header和block 25618

SQL> alter system dump undo header ‘_SYSSMU15$’;

System altered
TRN CTL:: seq: 0×0340 chd: 0x002b ctl: 0×0021 inc: 0×00000000 nfb: 0×0001
mgc: 0×8201 xts: 0×0068 flg: 0×0001 opt: 2147483646 (0x7ffffffe)
uba: 0x0200009b.0336.0a scn: 0×0000.000ab285 -这是control scn
―――――――――――――――――――――――――――――――――――――
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
————————————————————————————————
0×00 9 0×00 0×0018 0×0001 0×0000.000ab2f0 0x0200009b 0×0000.000.00000000 0×00000001 0×00000000 1210262128
―――――――――――――――――――――――――――――――――――――――――――――
0×21 9 0×00 0×0018 0xffff 0×0000.000abd20 0×02000084 0×0000.000.00000000 0×00000052 0×00000000 1210262179 --该slot已经被重用,重用的提交scn为000abd20
―――――――――――――――――――――――――――――――――――――――――――――
0x2f 9 0×00 0×0017 0x002e 0×0000.000ab387 0x0200009b 0×0000.000.00000000
0×000000

SQL> alter system dump datafile 6 block 25618;

Start dump data blocks tsn: 6 file#: 6 minblk 25618 maxblk 25618
buffer tsn: 6 rdba: 0×01806412 (6/25618)
scn: 0×0000.000abd72 seq: 0×01 flg: 0×00 tail: 0xbd720601 ―――这个scn 就是block scn,scn号为703858,可见应该是延时块清除的时候的scn
frmt: 0×02 chkval: 0×0000 type: 0×06=trans data

Hex dump of block: st=0, typ_found=1
Dump of memory from 0x074C8400 to 0x074CA400
……………………………………………………………………..
Block header dump: 0×01806412
Object id on Block? Y
seg/obj: 0×2966 csc: 0×00.abd72 itc: 2 flg: E typ: 1 – DATA
brn: 0 bdba: 0x180640e ver: 0×01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0×01 0×0014.021.00000015 0x0200009f.02c5.0e C-U- 0 scn 0×0000.000ab285 --这个scn就是control scn,在TRN CTL有记录,对应为701061
0×02 0×0010.016.00000014 0×02000074.0294.0d C— 0 scn 0×0000.000a9432

关于SCN,也可参阅

http://czmmiao.iteye.com/blog/2077044

 

参考至:http://www.easyora.net/blog/scn_block_scn.html

如有错误,欢迎指正

邮箱:czmcj@163.com

分享到:
评论

相关推荐

    Oracle SCN机制解析

    Oracle SCN(System Change Number)机制是Oracle数据库中用于追踪和管理数据变化的关键组件。SCN是一个不断递增的数字,确保了数据库能够准确地识别和处理事务中的数据修改,尤其是在故障恢复、Data Guard、Streams...

    SCN_release_v1_ELM_随机配置网络_SCN_

    随机配置网络(SCN,Stochastic Configuration Network)是一种在机器学习领域中,特别是神经网络模型中的先进算法。它是 Extreme Learning Machine (ELM) 的一种扩展和优化版本,旨在解决ELM在实际应用中的一些限制...

    个人经验总结:Oracle数据库SCN号详解

    ### 个人经验总结:Oracle数据库SCN号详解 #### 一、引言 在Oracle数据库管理与维护过程中,了解SCN(System Change Number)的概念及其作用至关重要。SCN是Oracle数据库内部用于跟踪数据库状态变化的一个重要机制,...

    SCN_release_v1_随机配置网络_SCN_

    这可能包括图像处理、自然语言处理、推荐系统等,其灵活性和可扩展性是其主要优点之一。 文件"SCN_release_v1"很可能是整个项目的主版本,包含了实现SCN网络的基础代码和相关文件。在深入研究和利用这些代码之前,...

    oracle scn概念解析

    ### Oracle SCN 概念解析 #### 一、SCN 的定义与作用 **SCN (System Change Number)** 是 Oracle 数据库中的一个重要概念,用于记录数据库的状态变化。它本质上是一个递增的逻辑计数器,每当数据库发生变化时就会...

    oracle SCN 祥解

    **SCN(System Change Number,系统变更号)**是Oracle数据库内部用于标识事务处理中的事件顺序以及确保数据一致性的关键机制之一。SCN是一种逻辑的时间戳,它用于排序数据库中发生的事件,以满足事务的ACID特性...

    SCN号的闪回

    "SCN号的闪回"是Oracle数据库中一个重要的恢复机制,全称为System Change Number,它是Oracle数据库中记录事务更改的唯一序列号。SCN是一个不断增加的数字,每次数据库中的数据发生变化时,都会生成一个新的SCN,...

    scn号与恢复研究.pdf

    3. **记录Redo Block Address (RBA)**:CKPT还会在控制文件中记录RBA,这表示恢复时需要从Redo Log中的哪个位置开始回放。 与Checkpoint相关的SCN号有四个,它们分别具有不同的作用: 1. **SystemCheckpointSCN**...

    oracle scn

    Oracle SCN Oracle SCN(System Change Number)是一种非常重要的标记,Oracle 使用它来标记数据库在过去时间内的状态和轨迹。SCN 是一个逻辑时钟来记录数据库事件。它非常的重要,并不是只是为了恢复。 Oracle ...

    ORACLE SCN问题解析

    Oracle SCN(System Change Number)是Oracle数据库中的一个关键概念,它是数据库系统中记录所有更改的序列号,确保了数据的一致性和可恢复性。SCN是一个递增的数字,每次数据库发生事务性改变时,SCN都会增加。...

    Oracle系统改变号SCN详解

    Oracle系统的System Change Number (SCN)是其内部用于记录数据库变化的关键组件,它是一个不断递增的数值,确保了数据库操作的顺序性和一致性。SCN的重要性在于,它不受操作系统时间的影响,避免了由于时间篡改导致...

    oracle scn 详解

    - **控制文件中的SCN类型**:控制文件中包含多种类型的SCN,分别是system SCN、datafile SCN、last SCN以及start SCN。 - **system SCN**:表示整个数据库的状态,通常可以从`V$DATABASE`视图中的`CHECKPOINT_...

    oracle patch scn--修改oracle scn工具(oracle异常恢复利器)

    oracle scn修改工具,可以直接修改oracle scn,在极端情况下恢复使用,比如解决ORA-600 2662等类似错误,使用说明:https://www.xifenfei.com/2022/06/win-oracle-scn-patch.html

    迅浏览硬盘 scn2

    "迅浏览硬盘 scn2"是一款专门设计用于快速浏览硬盘上所有文件,包括隐藏文件位置的软件工具。在日常计算机操作中,我们往往需要查找特定的文件或文件夹,尤其是在大型硬盘或存储设备中,这个过程可能非常耗时。"迅...

    Oracle数据块结构分析说明BLOCK结构详解

    Oracle是业界广泛使用的大型关系型数据库管理系统,其核心组成部分之一就是数据块结构(Block)。数据块是Oracle数据库中最小的存储单位,是操作系统中读写数据的基本单位,也是数据库实例中逻辑上存储数据的基本...

    数据库SCN 监控-new.txt

    Oracle 数据库在2019年 6月23日自动生效了新的SCN 生成的量由以前的16K 涨导 32K,但还是没有根本上解决问题,历史遗留问题还有可能发生,所以我们需要继续监控数据库 SCN 问题

    BLOG_Oracle_lhr_Oracle SCN的一点研究.pdf

    Oracle数据库中的SCN(System Change Number,系统改变号)是Oracle系统内部维护的一种序列号,它随着系统更新自动增加,用于标记数据库中的每一个改变,保证数据的一致性和顺序恢复。SCN在数据库中无处不在,几乎...

    ASIO4ALL_2_9_SCN

    ASIO4ALL_2_9_SCN 是一个针对声音处理的专业驱动程序,主要适用于音乐制作、音频编辑和专业音频系统。这个驱动程序的核心是ASIO(Audio Stream Input/Output),它是由Steinberg公司开发的低延迟音频接口标准。ASIO...

    数据库SCN 监控SQL.txt

    针对Oracle 在 2019年 6月23日后,新SCN 策略生效后,我们开始对数据库 Oracle scn 监控

Global site tag (gtag.js) - Google Analytics