首页 > 代码库 > Undo管理

Undo管理

Undo有什么用?

  • 当connection.rollback()时,用于回滚transaction
  • 系统或数据库出错时,用于恢复数据库
  • 提供读一致性
  • 用flashback query时,分析某一个时间点的数据
  • 逻辑错误时,用flashback恢复

 

自动undo 管理

用undo tablespace管理undo segment

用spfile初始参数设置undo tablespace, UNDO_TABLESPACE = undotbs_01, 注意如果你设置的undo tablespace不存在,startup会失败

 

Manual undo mangement的时候使用rollback segments管理undo

 

自动undo管理相关初始化参数

UNDO_MANAGEMENT=AUTO, or NULL表示auto management, MANUAL表示manual management

UNDO_TABLESPACE=tablespace_name01

 

 

Undo Retention Period

UNDO_RETENTION初始化参数设置minimum undo retention period

当transaction commit后, rollback和恢复就不需要undo data了.但是transaction开始之前就已经在运行的long-running query 还需要undo data来提供一致性读的特性.

 

undo retention period就设置了undo data可以被新的transactionoverwritten的最小时间.

undo retention period的值>time spend of long-running query

 

UNDO_RETENTION参数的2个例外

  • 当undo tablespace is fixed size, UNDO_RETENTION参数被忽略
  • 如果undo tablespace is AUTOEXTEND with MAXSIZE, database会overwritten  unexpired undo data

 

UNDO_RETENTION参数值太小,会出现2个错误

  • DML出错,因为undo space不够用
  • Snapshot too old,说明undo data被overwritten

 

 

RETENTION GUARANTEE初始化参数

保证unexpired undo data不被overwritten

 

如何设置undo retention period

查看V$UNDOSTAT.TUNED_UNDORETENTION, 这个column存着4天内每10 分钟的数据

UNDO_RETENTION = 1800

ALTER SYSTEM SET UNDO_RETENTION = 2400;

 

用undo_advisor选择undo retention period时考虑2个条件

The length of your expected longest running query

The longest interval that you will require for Oracle Flashback operations

 

 

 

Undo 相关view

V$UNDOSTAT

V$ROLLSTAT

V$TRANSACTION

DBA_UNDO_EXTENTS

DBA_HIST_UNDOSTAT