Undo的作用

  • 数据的回滚
  • 一致性读
  • 表的闪回(事务,查询的闪回..)
  • 失败会话的恢复

回滚rollback操作

SQL> archive log list;
ORA-01031: 权限不足
SQL> conn /as sysdba
已连接。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 45
下一个存档日志序列 47
当前日志序列 47
SQL> create table t1(id int); 表已创建。 SQL> select * from t1; 未选定行 SQL> insert into t1 values('1'); 已创建 1 行。 SQL> insert into t1 values('2'); 已创建 1 行。 SQL> rollback; 回退已完成。 SQL> select * from t1; 未选定行 SQL> desc t1;
名称 是否为空? 类型
----------------------------------------- -------- ---------------------------- ID NUMBER(38) SQL> select * from t1; 未选定行 SQL> insert into t1 values(1); 已创建 1 行。 SQL> insert into t1 values(2); 已创建 1 行。 SQL> select * from t1; ID
----------
1
2 SQL> rollback; 回退已完成。 SQL> select * from t1; 未选定行 SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 45
下一个存档日志序列 47
当前日志序列 47
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。 Total System Global Area 3307048960 bytes
Fixed Size 2180264 bytes
Variable Size 1828719448 bytes
Database Buffers 1459617792 bytes
Redo Buffers 16531456 bytes
数据库装载完毕。
SQL> alter database noarchivelog;
alter database noarchivelog
*
第 1 行出现错误:
ORA-38774: 无法禁用介质恢复 - 闪回数据库已启用 SQL> alter database flashback off; 数据库已更改。 SQL>
SQL> alter database noarchivelog; 数据库已更改。 SQL> alter database open; 数据库已更改。 SQL> archive log list;
数据库日志模式 非存档模式
自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 45
当前日志序列 47
SQL> select * from t1; 未选定行 SQL> insert into t1 values(1); 已创建 1 行。 SQL> insert into t1 values(2); 已创建 1 行。 SQL> select * from t1; ID
----------
1
2 SQL> rollback; 回退已完成。 SQL> select * from t1; 未选定行 SQL> insert into t1 values(1); 已创建 1 行。 SQL> insert into t1 values(2); 已创建 1 行。 SQL> commit; 提交完成。 SQL> rollback; 回退已完成。 SQL> select * from t1; ID
----------
1
2

可见rollback操作和当前数据库 归档模式并没有关系,只和commit操作有关,一旦commit就无法回滚。

如果没有指定 rollback 到哪一个保存点savepoint上,就意味着全部Rollback,而不是只是rollback一条操作。

关于savepoint的操作见下面的命令:

SQL> drop table t1;

表已删除。

SQL> select * from t1;
select * from t1
*
第 1 行出现错误:
ORA-00942: 表或视图不存在 SQL> create table t1(id int); 表已创建。 SQL> insert into t1 values(1); 已创建 1 行。 SQL> savepoint s1; 保存点已创建。 SQL> insert into t1 values(2); 已创建 1 行。 SQL> insert into t1 values(3); 已创建 1 行。 SQL> rollback to s1; 回退已完成。 SQL> select * from t1; ID
----------
1

虽然可以rollback到保存点,但是一旦commit,所有的保存点就都没用了。

undo的逻辑结构

回滚段的空间是可以循环利用的,就像是分块的圆盘,这个圆盘可以增加块,也可以回收块。

undo的空间使用机制-增长

如图中所示,块4填满后需要继续向前填充,虽然块2是inactive的,但是中间隔着一个active的块1,所以不能向前覆盖。这个时候空间就必须要增长了,则会加入新的块5,然后就可以继续向块5中写入undo信息。

undo的空间使用机制-回收

当块4块5块6连续并且都是inactive的时候,此时空间回收机制,可以将这几个块合并成单独的块,块6。

一致性读

回滚段解决了写操作不会阻塞读操作的问题。

一致性读并非总要去读回滚段。

实现的一致性读产生的代价——ORA-01555

ORA-01555: "snapshot too old: rollback segment number string with name "string" too small"

Cause: rollback records needed by a reader for consistent read are overwritten by other writers;

Action: if in Automatic Undo Management mode, increase undo_retention setting.otherwise,use larger rollback segments.

快照太久,回滚段太小,回滚记录被覆盖

具体可以参见:ORA-01555 原因与解决

自动管理Undo-AUM

Automatic Undo Management

查看undo配置信息:

SQL> show parameter undo;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1

Undo配置参数含义

-DNDO_MANAGEMENT undo的管理模式,分自动和手动

-UNDO_TABLESPACE 当前正在被使用的undo表

-UNDO_RETENTION 规定多长时间内,数据不能被覆盖。

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

AUTO 表示undo 为自动管理模式。

900 表示在900秒内,undo上的数据不能被覆盖。

UNDOTBS1 是当前正在使用的undo表空间。

注意:undo_retention是一个动态调整的参数,同时,Oracle无法保证在这个保留时间内的undo数据不被覆盖,当undo空间不足时,Oracle将覆盖即使未过保留期的数据以释放空间。

强制保留undo_retention时间内的数据

  • 设置undo tablespace guarantee属性
  • 设置该属性之后也可以取消
SQL> alter tablespace undotbs1 retention guarantee;

表空间已更改。

SQL> alter tablespace undotbs1 retention noguarantee;

表空间已更改。

Undo调优

Undo的设置取决于我们实际的生产系统。如何设置undo更合理地为我们工作呢?

Undo表空间的大小

  我们在创建一个undo表空间的使用,就指定了它的大小,这个大小一旦创建是不可变更的。设置过大,是一种浪费,设置过小,例如删除100万条记录,这些删除的记录都要临时存放到undo表空间中,如果undo的大小不能存储100万条记录,那么就会出问题。

Undo数据的存放时间

  也就是undo_retention 参数所对应的时间,undo上有数据存放时间与undo大小的密切关系。存放时间越长,需要的表空间越大。就像理发师的数量与理发师的效率的关系一样。理发师效率很高,一秒钟解决一个客户,那么就不需要太多的理发师傅。

Undo表空间的历史信息

如何合理设置undo表空间的大小和存放时间呢?那么就需要参考历史记录

关于如何设置undo表空间的大小可以参见:

【技术分享】如何确定或调整undo表空间的大小

关于如何设置undo表空间的存放时间可以参见:

undo_retention:确定最优的撤销保留时间

参考资料:oracle undo 解析


记得帮我点赞哦!

精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,按照目录合理分类,总能找到你需要的学习资料,还在等什么?快去关注下载吧!!!

念念不忘,必有回响,小伙伴们帮我点个赞吧,非常感谢。

我是职场亮哥,YY高级软件工程师、四年工作经验,拒绝咸鱼争当龙头的斜杠程序员。

听我说,进步多,程序人生一把梭

如果有幸能帮到你,请帮我点个【赞】,给个关注,如果能顺带评论给个鼓励,将不胜感激。

职场亮哥文章列表:更多文章

本人所有文章、回答都与版权保护平台有合作,著作权归职场亮哥所有,未经授权,转载必究!

Oracle 回滚段undo的更多相关文章

  1. Oracle回滚段的概念,用法和规划及问题的解决

    回滚段概述  回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回 ...

  2. [Oracle]关于回滚段的一些转贴摘录

    ORACLE 回滚段 回滚段概述 回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值).回滚段的头部包含正在使用的该回滚段事务的信息.一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段 ...

  3. ORA-01552 非系统表空间不能使用系统回滚段处理

    今天新搭建了一个10g的测试数据库,运行都很正常,但是在打开autotrace功能后执行语句,报错 SQL> set autotrace on SQL> select username,s ...

  4. oracle undo回滚段详解

    1.Undo是干嘛用的?   在介绍undo之前先说一下另外一个东西 transaction ,翻译成交易或事务.我们在进行一个事务的过程中需要申请许多资源,一个复杂的事务也需要很多步来完成.那么一个 ...

  5. 如何删除回滚段状态为NEEDS RECOVERY的undo表空间

    环境:RHEL 6.4 + Oracle 11.2.0.4 背景:备份恢复的测试库在一次不完全恢复后,没有来及做有效的全备,又一次数据库故障导致数据库无法正常open. 只能离线部分数据文件打开数据库 ...

  6. Oracle 手工清除回滚段的几种方法

    关于回滚段的问题,之前也小整理过一个,参考: Current online Redo 和 Undo 损坏的处理方法 http://blog.csdn.net/tianlesoftware/articl ...

  7. Oracle 回滚(ROLLBACK)和撤销(UNDO)

    一.回滚(ROLLBACK)和撤销(UNDO) 回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段. 在9i版本以前 Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实 ...

  8. 简单了解Oracle的回滚段

    因为上一次研究了Oracle的事务一致性,中间查阅资料的时候,看到这个地方与回滚段有关.所以就罗列了以下简单的知识.更为深层次的就不再深挖了,个人感觉对于事务的一致性和隔离级别是开发经理应该了解的,但 ...

  9. oracle回滚机制深入研究

    这篇文章主要描写叙述oracle的回滚机制,篇幅可能较长,由于对于oracle的回滚机制来说,要讨论和描写叙述的实在太多,仅仅能刷选自己觉得最有意义的一部分进行深入研究和分享 一.我们来看一个DML语 ...

随机推荐

  1. HTTP POST 请求的两种编码格式:application/x-www-form-urlencoded 和 multipart/form-data

    在常见业务开发中,POST 请求常常在这些地方使用:前端表单提交时.调用接口代码时和使用 Postman 测试接口时.我们下面来一一了解: 一.前端表单提交时 application/x-www-fo ...

  2. C#LeetCode刷题之#501-二叉搜索树中的众数​​​​​​​(Find Mode in Binary Search Tree)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4086 访问. 给定一个有相同值的二叉搜索树(BST),找出 BS ...

  3. C#LeetCode刷题之#819-最常见的单词(Most Common Word)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3969 访问. 给定一个段落 (paragraph) 和一个禁用单 ...

  4. Vue 离开页面时的校验-mixin-beforeRouteLeave

    一定要看下函数前的注释, 需要在使用的页面定义[needCheckFlag]data属性 一定要看下函数前的注释, 需要在使用的页面定义[needCheckFlag]data属性 一定要看下函数前的注 ...

  5. 学长小清新题表之UOJ 180.实验室外的攻防战

    学长小清新题表之UOJ 180.实验室外的攻防战 题目描述 时针指向午夜十二点,约定的日子--\(2\)月\(28\)日终于到来了.随着一声枪响,伏特跳蚤国王率领着他的跳蚤大军们包围了 \(picks ...

  6. HotSpot的执行引擎-CallStub栈帧

    之前多次提到接触到调用JavaCalls::call()方法来执行Java方法,如: (1)Java主类装载时,调用JavaCalls::call()方法执行的Java方法checkAndLoadMa ...

  7. machine vision plan

    以OpenCV+C#/C++为主,Halcon+C#/C++.LabVIEW+NI Vision,其他还不了解 目前:Halcon+C# 1.完成:测量定位,表面质量检测 2.完成1后开始:OpenC ...

  8. 第一篇scrum冲刺博客--Interesting-Corps

    第一篇scrum冲刺博客 一.Alpha阶段各成员任务 鲍鱼铭 任务名称 预计时间 主页页面和探测空间设计及布局实现 6h 主页页面跳转社区功能及社区设计及布局实现 6h 搜索页面跳转.设计及布局实现 ...

  9. Webstorm的常用快捷键

    编辑 Ctrl + Space 基本代码完成 (任何类. 方法或变量名称) Ctrl + Shift + Enter 完整的语句 Ctrl + P (在方法调用参数) 内的参数信息 Ctrl + Q ...

  10. 运用sed命令高效地删除文件的特定行

    运用 sed 命令高效地删除文件的特定行 正常来说,我们想要删除文件中的某些行内容,一般都是先打开这个文件,然后找到要删除的内容,再然后选中这些行并按删除键进行删除,这在数据量很少时是没有问题的.但是 ...