您的位置:首页 > 其它

基础知识补漏-undo

2016-09-08 15:04 190 查看
undo

通常在进行大规模数据删除操作时,推荐通过分批删除分次 交,以减少对于回滚段的占 用和冲击。

Oracle 内部使用 SCN 作为数据库时钟,这里查询结果集就是根据 SCN 来进行判断的,每个数据块头部都会记录一个 交 SCN,当数据更改 交后, 交 SCN 同时被修改,这个 SCN 在查询时可以用来进行一致性读判断。

Unix Time时间戳转换成标准时间

date -d '1970-01-01 UTC 时间戳 seconds' +"%Y-%m-%d %T %z"

设置期望的保留时间,修改UNDO表空间属性,就可以使UNDO表空间运行在Guarantee(不到时间不覆盖)

模式:

SQL> alter system set undo_retention=900;

System altered.

SQL> alter tablespace undotbs1 retention guarantee;

Tablespace altered.

SQL> select tablespace_name,contents,retention from dba_tablespaces

2 where tablespace_name like 'UNDO%';

TABLESPACE_NAME CONTENTS RETENTION 

------------------------------ --------- -----------

UNDOTBS1 UNDO GUARANTEE

当进行一致性读和回滚时,可能会产生大量的 Consistent Gets 和 physical reads。

冷备迁移时重建UNDO表空间

要求clean shutdown

同平台迁移时可以放弃UNDO表空间,这时启动会报错ora-01157

SQL> startup 

ORACLE instance started. 

……

Database mounted. 

ORA-01157: cannot identify/lock data file 2 - see DBWR trace file 

ORA-01110: data file 2: 'D:\ORADATA\EYGLE\UNDOTBS01.DBF' 

删除UNDO文件启动数据库

SQL> alter database datafile 'D:\ORADATA\EYGLE\UNDOTBS01.DBF' offline drop; 

Database altered. 

SQL> alter database open; 

Database altered. 

SQL> select name from v$datafile; 

NAME 

------------------------------------------------------- 

D:\ORADATA\EYGLE\SYSTEM01.DBF 

D:\ORADATA\EYGLE\UNDOTBS01.DBF 

D:\ORADATA\EYGLE\EYGLE.DBF 

重建UNDO表空间,并切换为当前UNDO表空间

SQL> create undo tablespace undotbs2   、

2  datafile 'd:\oradata\eygle\undotbs2.dbf' size 10M; 

Tablespace created. 

SQL> ALTER SYSTEM SET undo_tablespace='UNDOTBS2'; 

System altered. 

当UNDO过大想创建新的UNDO表空间代替现有表空间以实现缩小表空间时

SQL> create undo tablespace undotbs2; 

SQL> alter system set undo_tablespace=undotbs2 scope=both; 

确认所有回滚表空间所有回滚段都正常OFFLINE

SQL> select usn,xacts,status,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize; 

删除

SQL> drop tablespace undotbs1 including contents;

由于ABORT关闭数据库,导致回滚块损坏,回滚段不断尝试修复回滚段,回滚事务,这一事务导致其他事务的锁等待,从而整个数据库异常缓慢,无法响应。

解决办法:

首选RMAN恢复,但会消耗时间和丢失部分数据,若不允许则参考下面方法

在初始化参数中设置隐含参数:

_offline_rollback_segments=  _SYSSMU29$   

_corrupted_rollback_segments= _SYSSMU29$ 

删除损坏的回滚段:

SQL> drop rollback segment "_SYSSMU29$"; 

这样数据库基本恢复了运作,但是一定会损失部分事务,导致数据库不一致。可能会导致ORA-600错误。

需要的话,之后还要重建undo表空间

SQL> create undo tablespace undotbs1 datafile '/opt/oracle/oradata/conner/undotbs1.dbf' size 10M; 

Tablespace created. 

SQL> alter system set undo_tablespace=undotbs1; 

System altered.  

SQL> drop tablespace undotbs2; 

Tablespace dropped. 

修改参数文件,变更UNDO表空间,并取消_corrupted_rollback_segments等设置

此时数据库内部依然不一致,尽快全库EXP,然后重新建库,IMP恢复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: