为了使oracle从误操作中快速恢复过来,oracle提供了闪回技术。
如何flashback_on不是yes,使用如下操作打开。如下操作需要sysdba权限。
SQL> shutdown immediate
SQL> startup mount
SQL> alter database flashbash on
SQL> alter database open
show parameter undo_retention;--单位秒
ALTER SYSTEM SET undo_retention=7200 SCOPE=BOTH;
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
15-01-16 10:40:08
SQL> flashback Table t2 to timestamp(to_date('2015-01-16 10:40:08','yyyy-mm-dd hh24:mi:ss'));
ORA-08189: 因为未启用行移动功能, 不能闪回表
SQL> alter table T2 enable row movement;
SQL> flashback Table t2 to timestamp(to_date('2015-01-16 10:40:08','yyyy-mm-dd hh24:mi:ss'));
闪回完成
SQL> drop table t2;
SQL> select * from user_recyclebin;
SQL> flashback table t2 To before drop;
闪回完成。
5).UNDO表空间guarantee属性
如果UNDO表空间是noguarantee状态,Oracle不确保提交后的事务对应的UNDO表空间中的数据会保留UNDO_RETENTION指定的时长,如果UNDO表空间不足,其他事务将可能偷盗相应的未过期的空间;将UNDO表空间设置为guarantee能够确保提交后的事务对应UNDO表空间中的数据在任何情况下都将保留UNDO_RETENTION指定的时长。
SELECT tablespace_name, retention FROM dba_tablespaces where tablespace_name='UNDOTBS1';
1.UNDO表空间空间使用情况。
1).UNDO表空间总大小。
UNDO表空间下也以段的形式存储数据,每个事务对应一个段,这种类型的段通常被称为回滚段,或者UNDO段。默认情况下,数据库实例会初始化10个UNDO段,这主要是为了避免新生成的事务对UNDO段的争用。
UNDO表空间的总大小就是UNDO表空间下的所有数据文件大小的总和:
SQL> select tablespace_name,contents from dba_tablespaces where tablespace_name='UNDOTBS1';
TABLESPACE_NAME CONTENTS
------------------------------------------------------------ ------------------
UNDOTBS1 UNDO
SQL> select tablespace_name,sum(bytes)/1024/1024 mb from dba_data_files where tablespace_name='UNDOTBS1' group by tablespace_name;
TABLESPACE_NAME MB
------------------------------------------------------------ ----------
UNDOTBS1 90
2).查看UNDO表空间的使用情况。
该使用情况可以通过两个视图来查看:
SQL> select owner,segment_name,bytes/1024/1024 mb from dba_segments where tablespace_name='UNDOTBS1';
OWNER SEGMENT_NAME MB
---------- ------------------------------ ----------
SYS _SYSSMU12_2867006942$ .125
SYS _SYSSMU11_3120896088$ .125
SYS _SYSSMU10_1735367849$ 2.125
SYS _SYSSMU9_3051513041$ 2.125
SYS _SYSSMU8_2280151962$ 2.125
SYS _SYSSMU7_825858386$ .9375
SYS _SYSSMU6_2597279618$ 3.125
SYS _SYSSMU5_247215464$ 3.125
SYS _SYSSMU4_437228663$ 2.125
SYS _SYSSMU3_3104504842$ 5.125
SYS _SYSSMU2_2464850095$ 2.125
SYS _SYSSMU1_2523538120$ 3.125
已选择12行。
SQL> select segment_name, v.rssize/1024/1024 mb
2 From dba_rollback_segs r, v$rollstat v
3 Where r.segment_id = v.usn(+)
4 order by segment_name ;
SEGMENT_NAME MB
------------------------------ ----------
SYSTEM .3671875
_SYSSMU10_1735367849$ 2.1171875
_SYSSMU11_3120896088$
_SYSSMU12_2867006942$
_SYSSMU1_2523538120$ 3.1171875
_SYSSMU2_2464850095$ 2.1171875
_SYSSMU3_3104504842$ 5.1171875
_SYSSMU4_437228663$ 2.1171875
_SYSSMU5_247215464$ 3.1171875
_SYSSMU6_2597279618$ 3.1171875
_SYSSMU7_825858386$ .9296875
_SYSSMU8_2280151962$ 2.1171875
_SYSSMU9_3051513041$ 2.1171875
已选择13行。
通过上面的两个查询可以看出,两个视图查询的值几乎一致,通常在巡检的时候,我们习惯查询dba_segments视图来确定UNDO表空间的使用情况,但查询V$ROLLSTAT数据更加准确。
3).查询事务使用的UNDO段及大小。
很多客户想知道,我的UNDO表空间超过了90%,是哪些会话的事务占用了这些空间:
SQL> select s.sid,s.serial#,s.sql_id,v.usn,segment_name,r.status, v.rssize/1024/1024 mb
From dba_rollback_segs r, v$rollstat v,v$transaction t,v$session s
Where r.segment_id = v.usn and v.usn=t.xidusn and t.addr=s.taddr
order by segment_name ;
SID SERIAL# SQL_ID USN SEGMENT_NAME STATUS MB
---------- ---------- -------------------------- ---------- ------------------------------------------------------------ -------------------------------- ----------
8 163 5 _SYSSMU5_247215464$ ONLINE 3.1171875
通过这个SQL语句可以查询到会话对应的活动事务使用的UNDO段名称,以及该段占用的UNDO空间大小,对于非活动事务占用了UNDO空间是由Oracle实例根据参数配置自动化管理的。