zoukankan      html  css  js  c++  java
  • Oracle 修改一行数据内存主要变化

    向Oracle 数据库发出请求,修改一行数据,在内存中主要有以下变化:

    1. 服务器进程将包含该行数据的块读取到内存中

    2. 写redo日志。将内存中该数据块指向undo表空间中数据块的变更向量(Change Vector)记录到redo日志中。

    3. 将内存中的该数据块复制到undo段中。

    4. 写redo日志。将修改的具体操作的变更向量记录到redo日志。

    5. 修改该数据块。

    redo日志记录数据库的一切变化。每次改动至少记录两次redo日志,一次用于指向原来的镜像块,一次用于记录具体的修改内容。

    实验

    插入一条记录,不提交;并尽可能快速地获取修改数据前后的两个SCN.

    插入数据并查看SCN

    一个窗口打开准备查询数据库当前SCN号,一个窗口准备插入一条数据。顺序是先查询数据库当前SCN号,插入表数据,再查询数据库当前SCN号,准备好SQL代码,速度快的话,SCN号可只差一个数字。如下面所示。

    SQL> select dbms_flashback.get_system_change_number from dual;

    GET_SYSTEM_CHANGE_NUMBER

    ------------------------

                     2755028

     

    SQL> select dbms_flashback.get_system_change_number from dual;

    GET_SYSTEM_CHANGE_NUMBER

    ------------------------

                     2755029

    RAC环境下,使用xshell登录节点1的数据库,并插入一条表记录

    SQL> insert into cv1 values(2,'num2');

    1 row created.

     DUMP 在线重做日志

    查看当前日志位置,状态为current的日志为当前日志

    SQL> select thread#,lg.status,lf.MEMBER from v$log lg,v$logfile lf where lg.GROUP#=lf.GROUP#;

       THREAD# STATUS           MEMBER

    ---------- ---------------- --------------------------------------------------------------------------------

             1 INACTIVE         +DATA_DB/orcl/onlinelog/group_1.257.892839137

             1 CURRENT          +DATA_DB/orcl/onlinelog/group_2.258.892839137

             2 INACTIVE         +DATA_DB/orcl/onlinelog/group_3.265.892839983

             2 CURRENT          +DATA_DB/orcl/onlinelog/group_4.266.892839983

    查看当前进程号

    SQL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from  v$mystat where rownum=1));

    SPID

    ------------------------

    5707

    DUMP日志,由于插入数据是在节点1,因此取节点1的当前日志

    SQL> alter system dump logfile '+DATA_DB/orcl/onlinelog/group_2.258.892839137' scn min 2755028 scn max 2755029;

    System altered

    查看日志信息

    $ cd $ORACLE_BASE/diag/rdbms/orcl/orcl1/trace

    $ ls -ltr | grep 5707

    -rw-r----- 1 oracle asmadmin     89 Dec 22 22:02 orcl1_ora_5707.trm

    -rw-r----- 1 oracle asmadmin   4786 Dec 22 22:02 orcl1_ora_5707.trc

    $ more orcl1_ora_5707.trc

    REDO RECORD - Thread:1 RBA: 0x000056.00000892.0010 LEN: 0x0068 VLD: 0x05

    SCN: 0x0000.002a09d4 SUBSCN:  1 12/22/2015 21:55:22

    (LWN RBA: 0x000056.00000892.0010 LEN: 0001 NST: 0001 SCN: 0x0000.002a09d4)

    CHANGE #1 TYP:0 CLS:8 AFN:5 DBA:0x01400088 OBJ:18730 SCN:0x0000.00284767 SEQ:1 OP:13.22 ENC:0 RBL:0

    Redo on Level1 Bitmap Block

    Opcode: 18Update Last search time

    LST: 1450792519

    REDO RECORD - Thread:1 RBA: 0x000056.00000892.0078 LEN: 0x016c VLD: 0x01

    SCN: 0x0000.002a09d4 SUBSCN:  1 12/22/2015 21:55:22

    CHANGE #1 TYP:0 CLS:29 AFN:3 DBA:0x00c000e0 OBJ:4294967295 SCN:0x0000.002a09aa SEQ:1 OP:5.2 ENC:0 RBL:0

    ktudh redo: slt: 0x0018 sqn: 0x000003f9 flg: 0x0012 siz: 112 fbi: 0

                uba: 0x00c01372.00a9.0d    pxid:  0x0000.000.00000000

    CHANGE #2 TYP:0 CLS:30 AFN:3 DBA:0x00c01372 OBJ:4294967295 SCN:0x0000.002a09a9 SEQ:1 OP:5.1 ENC:0 RBL:0

    ktudb redo: siz: 112 spc: 6318 flg: 0x0012 seq: 0x00a9 rec: 0x0d

                xid:  0x0007.018.000003f9 

    ktubl redo: slt: 24 rci: 0 opc: 11.1 [objn: 18730 objd: 18730 tsn: 5]

    Undo type:  Regular undo        Begin trans    Last buffer split:  No

    Temp Object:  No

    Tablespace Undo:  No

                 0x00000000  prev ctl uba: 0x00c01372.00a9.0c

    prev ctl max cmt scn:  0x0000.002a063a  prev tx cmt scn:  0x0000.002a064d

    txn start scn:  0xffff.ffffffff  logon user: 39  prev brb: 12587888  prev bcl: 0 BuExt idx: 0 flg2: 0

    KDO undo record:

    KTB Redo

    op: 0x03  ver: 0x01 

    compat bit: 4 (post-11) padding: 1

    op: Z

    KDO Op code: DRP row dependencies Disabled

      xtype: XA flags: 0x00000000  bdba: 0x0140008d  hdba: 0x0140008a

    itli: 1  ispac: 0  maxfr: 4858

    tabn: 0 slot: 0(0x0)

    CHANGE #3 TYP:0 CLS:1 AFN:5 DBA:0x0140008d OBJ:18730 SCN:0x0000.00284767 SEQ:1 OP:11.2 ENC:0 RBL:0

    KTB Redo

    op: 0x01  ver: 0x01 

    compat bit: 4 (post-11) padding: 1

    op: F  xid:  0x0007.018.000003f9    uba: 0x00c01372.00a9.0d

    KDO Op code: IRP row dependencies Disabled

      xtype: XA flags: 0x00000000  bdba: 0x0140008d  hdba: 0x0140008a

    itli: 1  ispac: 0  maxfr: 4858

    tabn: 0 slot: 0(0x0) size/delt: 11

    fb: --H-FL-- lb: 0x1  cc: 2

    null: --

    col  0: [ 2]  c1 03

    col  1: [ 4]  6e 75 6d 32

    END OF REDO DUMP

    可以看到日志中仅有两个REDO RECORD,每个REDO RECORD下可以有多个CHANGE #,CHANGE #就是Change Vector的编号,而OP则记录该CHANGE #对应的Change Vector做了什么工作。

    本次只是插入一条记录,产生了两个REDO RECORD,每个REDO RECORD下的每个Change Vector对应一次数据块(data block)的变化,现解释以上三个OP的含义如下:

    OP:13.22:OP13是事务段的相关操作,这里就是在undo段对应的data buffer中复制原来的数据块。

    OP:5.2:Update rollback segment header - KTURDH

    OP:5.1:Undo block or undo segment header - KTURDB  

    OP:11.2: Insert Row Piece (插入一个行片,数据块中通常每行一个行片)

    小结

    REDO LOG以REDO RECORD为单位记录日志,修改一条记录至少产生两个REDO RECORD。每个REDO RECORD由多个Change Vector组成,每个Cahnge Vector记录一次数据块的变化。

  • 相关阅读:
    NoSQL数据库:Redis内存使用优化与存储
    http缓存与cdn相关技术
    sphinx 全文索引
    Elasticsearch7.1中文文档-第一章-入门
    创建一个新的laravel
    mysql数据库的主从同步,实现读写分离
    使用 Swoole 来加速你的 Laravel 应用
    Linux下全局安装composer方法
    Laravel 加载第三方类库的方法
    jquery里把数组转换成json的方法
  • 原文地址:https://www.cnblogs.com/perfei/p/4930734.html
Copyright © 2011-2022 走看看