UNDO表空间保存数据修改之前的数据镜像,有四个作用:为事务提供回退、为事务提供恢复、提供读一致性、提供闪回功能。
查看表空间
select tablespace_name,contents from dba_tablespaces order by 2,1;
TABLESPACE_NAME CONTENTS
-------------------- ---------
EXAMPLE PERMANENT
SYSAUX PERMANENT
SYSTEM PERMANENT
USERS PERMANENT
TEMP TEMPORARY
TEMP02 TEMPORARY
UNDO02 UNDO
UNDOTBS1 UNDO
8 rows selected.
Elapsed: 00:00:00.01
查看现有系统用的是哪个UNDO表空间
show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDO02
其中undo_retention是管理DML闪回功能
查看UNDO工作情况
select segment_name,tablespace_name,status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ -------------------- ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU10_3550978943$ UNDOTBS1 OFFLINE
_SYSSMU9_1424341975$ UNDOTBS1 OFFLINE
_SYSSMU8_2012382730$ UNDOTBS1 OFFLINE
_SYSSMU7_3286610060$ UNDOTBS1 OFFLINE
_SYSSMU6_2443381498$ UNDOTBS1 OFFLINE
_SYSSMU5_1527469038$ UNDOTBS1 OFFLINE
_SYSSMU4_1152005954$ UNDOTBS1 OFFLINE
_SYSSMU3_2097677531$ UNDOTBS1 OFFLINE
_SYSSMU2_2232571081$ UNDOTBS1 OFFLINE
_SYSSMU1_3780397527$ UNDOTBS1 OFFLINE
_SYSSMU20_2406407709$ UNDO02 ONLINE
_SYSSMU19_435463704$ UNDO02 ONLINE
_SYSSMU18_1790535526$ UNDO02 ONLINE
_SYSSMU17_3002035816$ UNDO02 ONLINE
_SYSSMU16_2403826532$ UNDO02 ONLINE
_SYSSMU15_97498397$ UNDO02 ONLINE
_SYSSMU14_3499786256$ UNDO02 ONLINE
_SYSSMU13_2491882411$ UNDO02 ONLINE
_SYSSMU12_3165430591$ UNDO02 ONLINE
_SYSSMU11_3851363650$ UNDO02 ONLINE
21 rows selected.
UNDO保存着一种特殊的段结构:回滚段
在SCOTT用户下重新建立会话,增加回滚数据
update e01 set sal=sal+1;
然后查询回滚段信息
select s.username,t.xidusn,t.used_ublk from v$session s,v$transaction t where s.saddr=t.ses_addr;
USERNAME XIDUSN USED_UBLK
------------------------------ ---------- ----------
SCOTT 20 1
Elapsed: 00:00:00.01
可以执行rollback进行回退
可以在数据库非正常关闭的情况下对数据进行恢复
查询SCOTT用户的e01表中数据
select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 801 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1601 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1251 500 30
7566 JONES MANAGER 7839 02-APR-81 2976 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1251 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2851 30
7782 CLARK MANAGER 7839 09-JUN-81 2451 10
7788 SCOTT ANALYST 7566 19-APR-87 3001 20
7839 KING PRESIDENT 17-NOV-81 5001 10
7844 TURNER SALESMAN 7698 08-SEP-81 1501 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1101 20
7900 JAMES CLERK 7698 03-DEC-81 951 30
7902 FORD ANALYST 7566 03-DEC-81 3001 20
7934 MILLER CLERK 7782 23-JAN-82 1301 10
14 rows selected.
Elapsed: 00:00:00.00
我们模拟数据库掉电后启动的情况
startup force
select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.01
发现表中的数据已经恢复到更新之前的数据
读一致性:一个会话中修改数据,在未提交之前,其他用户看到的数据是未被修改的值
闪回操作
update e01 set sal = 1;
commit;
select * from e01;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 1 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1 500 30
7566 JONES MANAGER 7839 02-APR-81 1 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 1 30
7782 CLARK MANAGER 7839 09-JUN-81 1 10
7788 SCOTT ANALYST 7566 19-APR-87 1 20
7839 KING PRESIDENT 17-NOV-81 1 10
7844 TURNER SALESMAN 7698 08-SEP-81 1 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1 20
7900 JAMES CLERK 7698 03-DEC-81 1 30
7902 FORD ANALYST 7566 03-DEC-81 1 20
7934 MILLER CLERK 7782 23-JAN-82 1 10
14 rows selected.
Elapsed: 00:00:00.00
如果要查询提交之前的老数据
select * from e01 as of timestamp(sysdate-5/1440);
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10
14 rows selected.
Elapsed: 00:00:00.01
查询老数据保存时间
show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDO02
900秒15分钟,如果undo表空间满了,就会将之前的数据删除,可以查看参数
select tablespace_name,retention from dba_tablespaces order by 1;
TABLESPACE_NAME RETENTION
-------------------- -----------
EXAMPLE NOT APPLY
SYSAUX NOT APPLY
SYSTEM NOT APPLY
TEMP NOT APPLY
TEMP02 NOT APPLY
UNDO02 NOGUARANTEE
UNDOTBS1 NOGUARANTEE
USERS NOT APPLY
8 rows selected.
Elapsed: 00:00:00.00
现在显示的是非强制,如果你要强制要求老镜像保存15分钟
alter tablespace undo02 retention guarantee;
select tablespace_name,retention from dba_tablespaces order by 1;
TABLESPACE_NAME RETENTION
-------------------- -----------
EXAMPLE NOT APPLY
SYSAUX NOT APPLY
SYSTEM NOT APPLY
TEMP NOT APPLY
TEMP02 NOT APPLY
UNDO02 GUARANTEE
UNDOTBS1 NOGUARANTEE
USERS NOT APPLY
8 rows selected.
Elapsed: 00:00:00.00
在这种情况下,老数据在不到15分钟是不会被删除的。