UNDO作用
- 数据的回滚
- 一致性读
- 表的闪回(事务,查询的闪回....)
- 失败会话的恢复
SQL> rollback;
回滚的过程就是从回滚段里拿到刚刚执行的这条语句产生的回滚,然后应用到以前的数据块上. 回滚的前提是没有commit.一旦提交了,就不能回滚了.
如果网络中断,会话中断,oracle会强制回滚 SQL> insert into t1 values('b');
1 row created.
SQL> select * from t1;
X - a b
SQL> rollback;
Rollback complete.
SQL> select * from t1;
X - a
| |||||||||||||||
为了保证数据读取的一致性,获取数据的结果是发出sql语句的时间一致。如果数据块上的数据已经被改变了,oracle就会用到回滚.
如:9点01分发出的sql查询,数据在9点03分已经修改了,但是这时候oracle返回的依然是9点01分时候的数据的值,这个值是从回滚段里面读取的.
不小心把表的数据修改了,这是你可以去查询在某个时间数据块的值.
如果会话意外终止,可以使用undo将失败的会话恢复.
| |||||||||||||||
Undo的产生
| |||||||||||||||
Undo V.S. Redo
| |||||||||||||||
修改一个数据块时,oracle里纠结做了什么?
1、发出一条SQL语句,将员工1234的工资更新为10,从下面可以看出原来工资为5.
2、ORACLE会从内存里找1234员工的数据块,如果没有内存里没有,就从磁盘上读取数据块到内存中.
3、找回滚段数据块(来装之前的数据),同样,如果内存里面没有,就从回滚段数据文件里读取到内存中.
4、oracle将5这个数据块写到回滚段里.
5.因为我修改了回滚段数据块,产生了undo的redo.
6.将原始数据块从5改为10.
7.原始数据块修改后,产生了本身数据块的redo
| |||||||||||||||
Undo 表空间
SQL> show parameter undo;
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_management string AUTO--------------自动管理undo回滚段 undo_retention integer 900--------------undo数据默认保留的时间(过期的数据会被覆盖) undo_tablespace string UNDOTBS1
SQL> select file_name,bytes from dba_data_files where tablespace_Name='UNDOTBS1';
FILE_NAME -------------------------------------------------------------------------------- BYTES ---------- /u01/app/oracle/oradata/gaga01/undotbs01.dbf 78643200 | |||||||||||||||
自动管理回滚段表空间
| |||||||||||||||
Undo 数据的保留时间
| |||||||||||||||
Undo 表空间的损坏
|