基础知识补漏-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恢复。
通常在进行大规模数据删除操作时,推荐通过分批删除分次 交,以减少对于回滚段的占 用和冲击。
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恢复。
相关文章推荐
- undo系列学习之undo入门基础知识介绍
- 密码学基础知识(十)查缺补漏(缺)
- Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
- java基础知识补漏(1)---内部类,重写、重载
- java基础知识补漏
- OCP知识点讲解 之 Undo回滚基础知识 推荐
- 基础知识补漏-数据字典
- 基础知识补漏-参数及参数文件
- nodejs基础知识查缺补漏
- 基础知识补漏-数据库的启动和关闭
- MyC++基础知识补漏
- 基础知识补漏-redo
- 关于数理统计基础知识的一点补漏
- Python 学习总结(一):掌握基础知识,查缺补漏
- 基础知识补漏-控制文件和引导
- php基础知识补漏
- java基础知识补漏(2)---匿名内部类
- 关于数理统计基础知识的一点补漏
- 基础知识补漏-内存管理
- ASP.NET中Cookie编程的基础知识