1、查看系统默认使用的undo表空间
SQL> show parameter undo;
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900undo_tablespace string UNDO1
2、新建立一个Undo表空间
SQL> create undo tablespace undo2 datafile '/home/oracle/undo2.dbf' size 10M;
Tablespace created.
3、修改undo表空间由原来的undo1,修改为undo2。
SQL> alter system set undo_tablespace=undo2 scope=both;
System altered.
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------undo_management string AUTOundo_retention integer 900undo_tablespace string UNDO2
4、oracle为了保证数据读一致性,所有增、删、改的操作都会存放到undo表空间里,只要没有执行commit或者rollback两种操作,就不会真正修改数据。若期间突然断电,oracle为了保证数据的一致性
会rollback回去。如果undo表空间的大小小于要删除的表的大小,oracle会提示此表不能删除,需增大undo表空间的大小。
举例说明:
目前undo表空间大小为10M,接下来新建立一个表,让其大小起过10M,再删除这张表,oracle会提示undo表空间的大小不足,需增加undo表空间的大小
SQL> create table tab_big as select * from dba_objects;
SQL> insert into tab_big select * from dba_objects;
SQL> commit;
查一下表tab_big占用空间的大小
SQL> select segment_name,bytes/1024/1024 from user_segments where segment_name='TAB_BIG';
SEGMENT_NAME BYTES/1024/1024
--------------------------------------------------------------------------------- ---------------TAB_BIG 16从上面查询的结果来看,表tab_big的大小为16M,已经超过10M,接下来再删除tab_big;
SQL> delete from tab_big;
delete from tab_big
*ERROR at line 1:ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDO2'上面提示undo2的表空间大小不足,如想删除tab_big表,需增大undo2表空间的大小。
5、增加undo2表空间的大小
SQL> alter database datafile '/home/oracle/undo2.dbf' resize 20M;
Database altered.
修改undo为自动扩展
SQL> alter database datafile '/home/oracle/undo2.dbf' autoextend on next 1M;
6、验证undo读的一致性,先创建一个t2表,再向t2表中插入一条数据。
SQL> create table t2(id int);
Table created.
SQL> insert into t2 values(1);
1 row created.
SQL> update t2 set id=1000;
在当前会话中查看,数据已经修改成了1000,
但是,再开启一个会话 select * from t2 读的是以前的内容,也就是数据还是1
模拟掉电
SQL> update t2 set id=100;没有commitSQL> shutdown abort;(断电)
SQL> startup;
select * from t2(结果为以前结果,也就是数据仍然为1,没有保存系统自动rollback)
7、事务的恢复
delete from t2;
没有commitSQL> startup force;强制重启(数据又回来了)
8、undo的过期时间(commit后保留的时间)
过了保留时间后 ,如有剩余空间 使用剩余空间
如果空间不够,commit后 在保留期间内会覆盖,在保留期间外也会覆盖没有提交的undo段,不能被覆盖