oracle的DML语句和undo简介

对于DML语句来说,只要修改了数据块,Oracle数据库就会将修改前的数据保留下来,保存在undo segment里,而undo segment则保存在undo表空间里。从 Oracle 9i起,有两种undo的管理方式:自动Undo管理(Automatic Undo Management,简称AUM)和手工Undo管理(Manual Undo Management,简称MUM)。 Oracle 9i之前只能使用MUM,而且在MUM中,undo segment又叫做rollback segment。从Oracle 9i起,Oracle就建议使用AUM,而不应再使用MUM了。因此, 我们不讨论MUM以及rollback segment。

1、DML语句与undo

当我们发出一条DML(比如update t set col1='A' where col1='B')语句时,其执行过程可大致概括为以下几步。

在shared pool里进行解析,从而生成执行计划。具体解析过程见第5章。

假设根据执行计划,得出col1='B'的记录存放在10号数据文件的54号数据块里。

服务器进程在buffer cache里找一个可用的undo数据块,如果没有发现,则到undo表空间里找一个可用的undo块,并调入buffer cache。假设获得 的undo数据块号为24号,位于11号undo数据文件里。

将改变前的值,也就是A放入11号undo数据块。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

由于undo数据块发生了变化,于是产生重做记录,假设重做记录号为120。

行号  事务id file# block# row  column  value

120  T1  24  11  10  col1   A

在buffer cache里找到54号数据块。如果没有发现,则从10号数据文件里调入。

将改变后的值,也就是B放入54号数据块。

由于数据块发生了变化,于是产生重做记录,假设重做记录号为121。

行号  事务id file# block# row  column  value

121  T1  10  54  10  col1   B

控制权返回给用户,如果在SQL*Plus里执行DML,则表现为光标返回。

当用户发出commit命令时,触发LGWR进程,将120与121这两个重做记录写入联机日志文件,并将54号数据块和11号undo数据块头部所记录的事务状 态标记设置为已提交。然后控制权返回给用户,如果在SQL*Plus里执行DML操作,则表现为光标返回。

这个时候,54号数据块以及11号undo块并不一定被DBWn写入数据文件。只有在脏数据块的数量达到一定程度才会被写入。

事务只要被提交或回滚,那么该事务所使用的undo块就可以被覆盖。对于上面的例子来说,当第 步,用户发出commit命令以后,11号undo块里的数 据就可以被其他事务所覆盖。

时间: 2025-01-07 18:30:12

oracle的DML语句和undo简介的相关文章

[20140513]无用的dml语句.txt

[20140513]无用的dml语句.txt --昨天需要使用logminer挖掘一些信息,发现生产系统存在大量的DML是无用的垃圾,到底开发是什么测试,了解oracle多少. --这个让我想起多年以前的一个项目,程序使用的操作方式是先delete删除,然后简单的insert插入信息的方式,这个要产生大量 --日志,花了大量的精力才说服对方修改这样操作方式. /* Formatted on 2014/5/13 8:58:20 (QP5 v5.252.13127.32867) */ SELECT

浅析非IMU模式下DML语句产生的REDO日志内容格式

实验内容:非IMU模式下DML语句产生的REDO日志内容格式解读,数据库版本:11.2.0.4 最详细的解读是UPDATE的. 实验环境准备 11G中默认是开启IMU特性的,做此实验需要关闭此特性. alter system set "_in_memory_undo"=false; alter system set "_in_memory_undo"=true;  --实验结束后使用此语句改回使用IMU特性. 修改参数完成后,重启数据库: shutdown imme

oracle的DDL语句为什么不能回滚

在ITPUB上看到有人提出了这个问题.在Sqlserver或一些其他的数据库中,DDL语句也是可以回滚的,那么Oracle为什么不能回滚DDL语句呢. 要说明这个问题,首先需要说明什么是DDL语句.DDL语句是数据定义语句,包括各种数据对象的创建.修改和删除,以及授权等操作. 在Oracle中DDL语句将转化为修改数据字典表的DML语句.一个简单的修改表的DDL语句,会导致Oracle在后台通过递归SQL语句进行大量的查询和修改的操作. 如果有兴趣,可以通过SQL_TRACE根据一下DDL语句,

oracle 11g的在线重定义简介

在Oracle9i出现之前,你只能通过MOVE或导出和导入的方式来进行表的重定义,因此表重定义的过程可能相当漫长或者说是一个离线过程,在此期间应用程序对该表的操作将失败.除了这个,如果用exp,我们也不能保证exp的时候该表的数据没有改变(除非单用户),而imp更是一个漫长的过程.为了解决这个问题,Oracle9i在其DBMS_REDEFINITION软件包中引入了在线重定义功能.这个特性对24*7的数据库系统来说非常重要,使用这个技术DBA可以在保持表允许DML语句的情况下修改结构,比如添加列

详解Oracle的SQL语句处理过程

在调整之前我们需要了解一些背景知识,只有知道这些背景知识,我们才能更好的去调整sql语句. 本节介绍了SQL语句处理的基本过程,主要包括: . 查询语句处理 . DML语句处理(insert, update, delete) . DDL 语句处理(create , drop , alter , ) . 事务控制(commit, rollback) 一.SQL 语句的执行过程(SQL Statement Execution) 图3-1 概要的列出了处理和运行一个sql语句的需要各个重要阶段.在某些

oracle基础sql语句详解

二.SQL Structur query language 结构化查询语言,是操作关系型数据库中的对象. DDL(Data definition language 数据定义语言),用于建表或删表操作,以及对表约束进行修改 create table , alter table , drop table 对表结构的增删操作. DML(Data manipulation language 数据操作语言),向表中插入纪录,修改纪录 insert , update , delete , merge tra

Oracle常用sql语句

Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象 一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSERT INTO 表名(字段名1, 字段名2, --) SELECT (字段名1, 字段名2, --) FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: 'GOOD DAY' 如果字段值里包含单引号' 需要

Oracle中SQL语句解析的步骤

我们都知道在Oracle中每条SQL语句在执行之前都需要经过解析,这里面又分为软解析和硬解析.那么这两种解析有何不同之处呢?它们又分别是如何进行解析呢?Oracle内部解析的步骤又是如何进行的呢?下面我们就这些话题进行共同探讨. 在Oracle中存在两种类型的SQL语句,一类为DDL语句,他们是从来不会共享使用的,也就是每次执行都需要进行硬解析.还有一类就是DML语句,他们会根据情况选择要么进行硬解析,要么进行软解析.在Oracle 8i OCP教材的023中1-12有说明SQL语句的解析步骤,

查找Oracle高消耗语句的方法

 这篇文章主要介绍了查找Oracle高消耗语句的方法,需要的朋友可以参考下 在运行下面的脚本之前需要先用生成AWR报告的SQL(程序脚本一般保存在$ORACLE_HOME下的rdbms/admin中,名称为awrrpt.sql,需要输入生成AWR报告的天数范围)找到开始和结束的snapshot编号:begin_snap和end_snap.  代码如下: <span style="font-size:18px;">set line 1000  set linesize 200