redo中的update

SQL> select * from v$version where rownum=1;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

SQL> !uname -a

Linux localhost.localdomain 2.6.18-194.el5 #1 SMP Mon Mar 29 20:06:41 EDT 2010 i686 i686 i386 GNU/Linux

http://docs.oracle.com/cd/E11882_01/server.112/e25494/onlineredo.htm#ADMIN11302官方文档redo的管理介绍。

首先我们创建一个表tt,并插入数据:

SQL> select * from tt;

ID

----------

0

2

3

4

5

6

7

8

9

10

已选择10行。

为了便于后面的研究,可以强制切换日志:

alter  system switch logfile;

SQL> select * from v$log;

GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARC STATUS          FIRST_CHANGE# FIRST_TIME

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

NEXT_CHANGE# NEXT_TIME

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

1          1        592   52428800        512          1 YES INACTIVE              10459317 23-6月 -15

10460687 23-6月 -15

2          1        593   52428800        512          1 YES INACTIVE              10460687 23-6月 -15

10460698 23-6月 -15

3          1        594   52428800        512          1 NO  CURRENT               10460698 23-6月 -15

2.8147E+14

SQL> select * from v$logfile;

GROUP# STATUS  TYPE

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

MEMBER

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

IS_

---

3         ONLINE

/u01/app/oracle/oradata/orcl3939/redo03.log

NO

2         ONLINE

/u01/app/oracle/oradata/orcl3939/redo02.log

NO

1         ONLINE

/u01/app/oracle/oradata/orcl3939/redo01.log

NO

SQL> select sid,serial#,username from v$session where username=‘HR‘;

SID    SERIAL# USERNAME

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

147         38 HR

SQL> update tt set id=1 where id=0;

已更新1行。

SQL> commit;

提交完成。

SQL> alter system dump logfile ‘/u01/app/oracle/oradata/orcl3939/redo03.log‘;

系统已更改。

SQL> select value from v$diag_info where name=‘Default Trace File‘;

VALUE

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

/u01/app/oracle/diag/rdbms/orcl3939/orcl3939/trace/orcl3939_ora_7209.trc

介绍下面内容之前,谈两个概念:

重做记录(redo record):重做记录通常由一组改变向量组成,是一个改变向量的集合,代表一个数据库的变更,如dml操作等,构成数据库变更的最小恢复最小单位。本例就是update的重做记录包括了相应的回滚段的改变向量和相应的数据块的改变向量。

改变向量(change vector):改变向量表示对数据库内某一个数据块所做的一次变更。改变向量总包括了变更的数据块的版本号,事务操作代码,变更从属数据块的地址(DBA)以及变更后的数据。本例就是一个update事务包含了一系列的变更向量,对于数据块的修改就是一个向量,对于回滚段的修改又是一个向量。

下面摘自日志文件的trace文件:

REDO RECORD - Thread:1 RBA: 0x000252.00000004.0010 LEN: 0x0214 VLD: 0x0d

SCN: 0x0000.009f9e26 SUBSCN:  1 06/23/2015 19:33:04

改变向量1:

CHANGE #1 TYP:2 CLS:1 AFN:4 DBA:0x0100008f OBJ:79489 SCN:0x0000.009f9a3d SEQ:1
OP:11.5 ENC:0 RBL:0

KTB Redo

op: 0x11  ver: 0x01

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

op: F  xid:  0x0009.006.00001023    uba: 0x00c00988.051b.39

Block cleanout record, scn:  0x0000.009f9e23 ver: 0x01 opt: 0x02, entries follow...

itli: 2  flg: 2  scn: 0x0000.009f9a3d

KDO Op code: URP row dependencies Disabled

xtype: XA flags: 0x00000000  bdba: 0x0100008f  hdba: 0x0100008a

itli: 1  ispac: 0  maxfr: 4858

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 1 ckix: 191

ncol: 1 nnew: 1 size: 1

col  0: [ 2]  c1 02   修改后的col
0,数值为1,c1是符号位(十六进制数),02是数值位

CHANGE #2 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.009f9df2
SEQ:2 OP:5.2 ENC:0 RBL:0

ktudh redo: slt: 0x0006 sqn: 0x00001023 flg: 0x0012 siz: 160 fbi: 0

uba: 0x00c00988.051b.39    pxid:  0x0000.000.00000000

CHANGE #3 TYP:0 CLS:33 AFN:3 DBA:0x00c00100 OBJ:4294967295 SCN:0x0000.009f9e26
SEQ:1 OP:5.4 ENC:0 RBL:0

ktucm redo: slt: 0x0006 sqn: 0x00001023 srt: 0 sta: 9 flg: 0x0

CHANGE #4 TYP:0 CLS:34 AFN:3 DBA:0x00c00988 OBJ:4294967295 SCN:0x0000.009f9df2
SEQ:3 OP:5.1 ENC:0 RBL:0

ktudb redo: siz: 160 spc: 522 flg: 0x0012 seq: 0x051b rec: 0x39

xid:  0x0009.006.00001023

ktubl redo: slt: 6 rci: 0 opc: 11.1 [objn: 77450 objd: 79489 tsn: 4]

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

Temp Object:  No

Tablespace Undo:  No

0x00000000  prev ctl uba: 0x00c00988.051b.36

prev ctl max cmt scn:  0x0000.009f99e1  prev tx cmt scn:  0x0000.009f99e9

txn start scn:  0x0000.009f9e05  logon user: 106  prev brb: 12585348  prev bcl: 0 BuExt idx: 0 flg2: 0

KDO undo record:

KTB Redo

op: 0x04  ver: 0x01

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

op: L  itl: xid:  0x0004.019.00000c0b uba: 0x00c01397.030b.38

flg: C---    lkc:  0     scn: 0x0000.009f926c

KDO Op code: URP row dependencies Disabled

xtype: XA flags: 0x00000000  bdba: 0x0100008f  hdba: 0x0100008a

itli: 1  ispac: 0  maxfr: 4858

tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0 ckix: 191

ncol: 1 nnew: 1 size: -1

col  0: [ 1]  80   修改前的col 0:数值是0,80是符号位(十六进制数)

上面只是简单的介绍update时,日志文件里记录的内容,感兴趣可以研究delete,insert等,

时间: 2024-10-14 06:15:09

redo中的update的相关文章

unity中的update、Lateupdate和FixedUpdate。

MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehaviour启用时,其 FixedUpdate在每一帧被调用. 处理Rigidbody时,需要用FixedUpdate代替Update.例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧.(两者帧长不同) MonoBehaviour.LateUpdat

关于unity中的update、Lateupdate和FixedUpdate

MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. MonoBehaviour.FixedUpdate 固定更新 当MonoBehaviour启用时,其 FixedUpdate 在每一帧被调用. 处理Rigidbody时,需要用FixedUpdate代替Update.例如:给刚体加一个作用力时,你必须应用作用力在FixedUpdate里的固定帧,而不是Update中的帧.(两者帧长不同) MonoBehaviour.LateUpda

MySQL中SELECT+UPDATE处理并发更新问题解决方案

这篇文章主要介绍了MySQL中SELECT+UPDATE处理并发更新问题解决方案分享,需要的朋友可以参考下. 问题背景 假设MySQL数据库有一张会员表vip_member(InnoDB表),结构如下: 当一个会员想续买会员(只能续买1个月.3个月或6个月)时,必须满足以下业务要求: 如果end_at早于当前时间,则设置start_at为当前时间,end_at为当前时间加上续买的月数 如果end_at等于或晚于当前时间,则设置end_at=end_at+续买的月数 续买后active_statu

在MySQL中阻止UPDATE语句没有添加WHERE条件的发生

如果在生产环境中使用UPDATE语句更新表数据,此时如果忘记携带本应该添加的WHERE条件,那么..Oh,no…后果可能不堪设想.那么有没有什么办法可以阻止这样的事情发生,又不使用任何的审核工具呢...办法当然是有的 sql_safe_updates sql_safe_updates这个MySQL自带的参数就可以完美的解决我们的问题,并且该参数是可以在线变更的哦~当该参数开启的情况下,你必须要在UPDATE语句后携带WHERE条件,否则就会报出ERROR.. 举个栗子 # sql_safe_up

myeclipse 中 没有update software 解决方案

In some situations you may not be able to install or update software using the menu commands in the Help menu. In these situations you will automatically be redirected to the classic update manager. You can also access the classic update manager from

Oracle 中for update和for update nowait的区别

http://www.cnblogs.com/quanweiru/archive/2012/11/09/2762223.html 1.for update 和 for update nowait 的区别: 首先一点,如果只是select 的话,Oracle是不会加任何锁的,也就是Oracle对 select 读到的数据不会有任何限制,虽然这时候有可能另外一个进程正在修改表中的数据,并且修改的结果可能影响到你目前select语句的结果,但是因为没有锁,所以select结果为当前时刻表中记录的状态.

SQL中使用UPDATE更新数据时一定要记得WHERE子句

我们在使用 SQL 中的 UPDATE 更新数据时,一般都不会更新表中的左右数据,所以我们更新的数据的 SQL 语句中会带有 WHERE 子句,如果没有WHERE子句,就回更新表中所有的数据,在 mysql 中,我们可以设置sql_safe_updates 这个自带的参数来解决,,当该参数开启的情况下,我们必须在 UPDATE 语句后携带 WHERE 条件,否则就会报错.set sql_safe_updates=1; 表示开启该参数.下面是开启sql_safe_updates参数后不带  WHE

NHibernate中session.update()及session.merge()的区别

今天的工作中遇到一个奇怪的问题,如下: "a different object with the same identifier value was already associated with the session: 19519146" 该异常的上下文如下: 1:在net.tcp绑定的wcf远程调用时产生: 2:通过UI调用方法不会产生该异常. 分析该问题: 由异常信息可以看出,该问题是由于在session.update对一组实体进行更新后,试图将新的实体associate到se

eclipse中解决update maven之后jre被改成1.5的问题

在项目的pom.xml中加入下面的代码就能解决 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.