向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记录一次数据块的变化。

Oracle 修改一行数据内存主要变化的更多相关文章

  1. oracle修改有数据的字段属性

    正常情况下,有数据时不能直接修改属性,我们可以先备份,然后清空现有数据,然后再修改和还原,过程如下: //先缓存表CREATE TABLE T_TABLE1 AS SELECT * FROM tabl ...

  2. Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)

    1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracl ...

  3. Oracle使用%rowtype变量存储一行数据

    在Oracle中,%rowtype是用来存储一行数据的 语法: rowType_name table_name%rowtype rowType_name :变量名 table_name:指定的表名 具 ...

  4. oracle数据库之数据插入、修改和删除

    作为一合格的测试人员对数据库的单表查询.多表查询.分组查询.子查询等等这些基本查询方法还是要会的.不然到企业中,容易被一些人鄙视,或者说如果数据库学不好,表查不明白,那么对自己能力来说也是一种侮辱,因 ...

  5. 修改有数据oracle字段类型 从number转为varchar

    --修改有数据oracle字段类型 从number转为varchar--例:修改ta_sp_org_invoice表中RESCUE_PHONE字段类型,从number转为varchar --step1 ...

  6. plsql修改某一行数据

    plsql修改某一行数据时, 在查询语句后面加上for update,再点击

  7. oracle修改已存在数据的字段类型

    第一次使用oracle数据库,在通过Navicat premium工具修改字段类型时,发现报“ORA-01439: column to be modified must be empty to cha ...

  8. ORACLE 多列合并成一行数据 WM_CONCAT函数以及REPLACE

    WM_CONCAT()方法 注意字符长度 SELECT BERTHCODE,tpf.freedatetype, ( SELECT WM_CONCAT(SBPT.PARKSTIME||'~'||SBPT ...

  9. Oracle 通过子查询批量添加、修改表数据

    1.通过查询快速创建表 create table test1(id,job,mgr,sal) as () ) ---这是一个分页查询 ok,表创建成功 2.通过查询快速创建视图 create or r ...

随机推荐

  1. Ubiquitous Religions 分类: POJ 2015-06-16 17:13 11人阅读 评论(0) 收藏

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 26678   Accepted: ...

  2. corefile的设置与使用

    一.简介 corefile是Linux下程序崩溃时生成的文件,可以用来分析程序崩溃的原因,因为它内部包含了程序崩溃时的堆栈信息. 二.corefile的设置 默认情况下,程序崩溃是不会生成corefi ...

  3. java提高篇---LinkedList

    一.概述 LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现.基于链表实现的方式使得L ...

  4. 零零碎碎写的shell脚本(二):一键修改网络配置信息脚本

    #!/bin/bash ip_mod=$ mask_mod=$ gw_mod=$ dns_mod=$ hostname_mod=$ hosts=/etc/hosts ifcfg=/etc/syscon ...

  5. unicode下char*和CString和一些数据之间的转换

    首先mfc下字符串只有两种数据:char(一个字节)和wchar_t(两个字节),很多其他数据类型如TCHAR,WCHAR等都是这个两个基本类型的宏定义,BYTE是uchar 1.对话框打印char* ...

  6. 修改客户端Webbrowser对应IE版本步骤

    制作注册表文件的过程 1,” HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InternetExplorer\MAIN\ FeatureControl\FEATURE_B ...

  7. .Net大文件上传(转--待验证)

    几种常见的方法,本文主要内容包括:    第一部分:首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采 ...

  8. 【leetcode❤python】 36. Valid Sudoku

    #-*- coding: UTF-8 -*-#特定的九个格内1-9的个数至多为1#依次检查每行,每列,每个子九宫格是否出现重复元素,如果出现返回false,否则返回true.class Solutio ...

  9. 1,linux基础知识以及新建虚拟机

    1,Windows图形界面只是在个人电脑上普及(dos界面):lunix是在服务器领域,服务器上绝对不出现图形化界面(命令行). 2,2.6.18  主板本,次版本,末版本 如果末版本积累到一定程序就 ...

  10. sqlserver2008创建数据库 报 Cannot read property is filestream 此属性不可用于sql server 7.0 解决

    在创建数据库的时候,报整个错误 Cannot read property is filestream 此属性不可用于sql server 7.0 按照网上的方法  (http://blog.csdn. ...