关系型数据库回滚段
UNDO 是什么?
记录数据修改前的样子,用于回滚和一致性读
类比:撤销键,随时能退回上一步
两个用途
一是回滚:事务失败或 ROLLBACK 时,用 UNDO 把数据改回去。二是一致性读:你查数据时,如果那一行正被别人改,Oracle 会用 UNDO 拼出你开始查询那一刻的版本,所以“读不加锁”。
和 MySQL 的 undo log 对比
MySQL 的 undo log 存在系统表空间或独立 undo 表空间里,逻辑类似。差别在管理方式:Oracle 用 UNDO 表空间统一管理,有 UNDO_RETENTION 控制保留时长;MySQL 由 purge 线程清理,靠 history list length 观察积压。
常见故障
`ORA-01555: snapshot too old` 就是 UNDO 被覆盖了,查询需要的历史版本找不到了。原因通常是:查询跑太久、UNDO 表空间太小、有长事务或大批量 DML。解决方向是加大 UNDO、缩短查询、避免在业务高峰跑大批量。