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记录一次数据块的变化。
Oracle 修改一行数据内存主要变化的更多相关文章
- oracle修改有数据的字段属性
正常情况下,有数据时不能直接修改属性,我们可以先备份,然后清空现有数据,然后再修改和还原,过程如下: //先缓存表CREATE TABLE T_TABLE1 AS SELECT * FROM tabl ...
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracl ...
- Oracle使用%rowtype变量存储一行数据
在Oracle中,%rowtype是用来存储一行数据的 语法: rowType_name table_name%rowtype rowType_name :变量名 table_name:指定的表名 具 ...
- oracle数据库之数据插入、修改和删除
作为一合格的测试人员对数据库的单表查询.多表查询.分组查询.子查询等等这些基本查询方法还是要会的.不然到企业中,容易被一些人鄙视,或者说如果数据库学不好,表查不明白,那么对自己能力来说也是一种侮辱,因 ...
- 修改有数据oracle字段类型 从number转为varchar
--修改有数据oracle字段类型 从number转为varchar--例:修改ta_sp_org_invoice表中RESCUE_PHONE字段类型,从number转为varchar --step1 ...
- plsql修改某一行数据
plsql修改某一行数据时, 在查询语句后面加上for update,再点击
- oracle修改已存在数据的字段类型
第一次使用oracle数据库,在通过Navicat premium工具修改字段类型时,发现报“ORA-01439: column to be modified must be empty to cha ...
- ORACLE 多列合并成一行数据 WM_CONCAT函数以及REPLACE
WM_CONCAT()方法 注意字符长度 SELECT BERTHCODE,tpf.freedatetype, ( SELECT WM_CONCAT(SBPT.PARKSTIME||'~'||SBPT ...
- Oracle 通过子查询批量添加、修改表数据
1.通过查询快速创建表 create table test1(id,job,mgr,sal) as () ) ---这是一个分页查询 ok,表创建成功 2.通过查询快速创建视图 create or r ...
随机推荐
- 实现gabor filter的滤波
实现gabor filter的滤波 图像纹理对于航空遥感图片.织物图案.复杂自然风景和动植物都适合.这里我采用遥感图片.织物图案和钢铁表面来做,并和canny图片进行一定的对比. ...
- 转载-python学习笔记之文件I/O
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- HDU(1175),连连看,BFS
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...
- java-资源管理器try-with-resource
在java编程中会遇到很多关闭资源的问题,但是,往往我们的关闭不能百分百正确,所以java7中出现了新的资源管理器方法try-with-resource,这是一项重要的改进,因为没人能再手动关闭资源时 ...
- BZOJ 1488: [HNOI2009]图的同构 polay
题意:两个图AB同构:把A的顶点重新编号后与B一模一样.求n个顶点的图一共有多少个?(同构的算一种) 思路:边有n*(n-1)/2,这些边可以有可以没有,所以等同于边的颜色有两种.然后将n划分成循环节 ...
- BZOJ 1835 基站选址(线段树优化DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1835 题意:有N个村庄坐落在一条直线上,第 i(i>1)个村庄距离第1个村庄的距离 ...
- HDU 3213 Box Relations(拓扑排序构造)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3231 题意:有n个长方体,四种限制条件.(1)I x y x和y有相交:(2)X/Y/Z x y x ...
- Xcode 创建.a和framework静态库
库介绍 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framew ...
- Hibernate实体类注解
常用的hibernate annotation标签如下: @Entity --注释声明该类为持久类.将一个Javabean类声明为一 个实体的数据库表映射类,最好实现序列化.此时,默认情况下,所有的类 ...
- 简单几步配置gitlab
简单几步配置gitlab 之前配置gitlab需要很多步骤,要装apache2.ruby.tomcat.mysql等一片东西.有没有更简单的方式呢?现在可以借助bitnami,简化了很多. 可以参考v ...