回滚段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表空间的存放时间可以参见:
参考资料:oracle undo 解析
- nvm安装node和npm,个人踩坑记录
- clang_intprt_t类型探究
- 学习zepto.js(Hello World)
- JS中函数声明与函数表达式的异同
- [技巧]看我如何通过Weeman+Ettercap拿下路由器管理权限
- 一分钟理清Vue-cli 代码构建步骤。
- 点击图片放大至原始图片大小
- 替代jquery1.9版本以前的toggle事件函数(开关)
- 总结CSS3新特性(Animation篇)
- Scrapy爬虫入门
- 移动端页面按手机屏幕分辨率自动缩放的js
- PYTHON黑帽编程 4.1 SNIFFER(嗅探器)之数据捕获--补充
- es 5 数组reduce方法记忆
- CSS3与动画有关的属性transition、animation、transform对比
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- spring-boot-route(十四)整合Kafka
- laravel 事件/监听器实例代码
- pytorch 多分类问题,计算百分比操作
- spring-boot-route(十五)整合RocketMQ
- spring-boot-route(十六)使用logback生产日志文件
- 你真的知道怎么实现一个延迟队列吗 ?
- 腾讯云容器服务日志采集最佳实践
- 深度剖析Lottie动画原理
- spring-boot-route(十七)使用aop记录操作日志
- spring-boot-route(十八)spring-boot-actuator监控应用
- 浅析PHP7的多进程及实例源码
- spring-boot-route(十九)spring-boot-admin监控服务
- Python scrapy爬取小说代码案例详解
- 解决pip install psycopg2出错问题
- PHP开发的文字水印,缩略图,图片水印实现类与用法示例