1、查看系统默认使用的undo表空间

SQL> show parameter undo;

SQL> show parameter undo;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_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      AUTO
undo_retention                       integer     900
undo_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;
没有commit

SQL> shutdown abort;(断电)

SQL> startup;

select * from t2(结果为以前结果,也就是数据仍然为1,没有保存系统自动rollback)

 

7、事务的恢复

delete from t2;
没有commit
SQL> startup force;强制重启(数据又回来了)

 

8、undo的过期时间(commit后保留的时间)

过了保留时间后 ,如有剩余空间 使用剩余空间
如果空间不够,commit后 在保留期间内会覆盖,在保留期间外也会覆盖
没有提交的undo段,不能被覆盖