Oracle Flashback Transaction Backout 详解
Oracle Flashback Transaction Backout 详解
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Flashback Transaction Backout 撤销事务[1]:
2. 前提条件
2.1 依赖
-- 主键
ALTER TABLE employees ADD PRIMARY KEY (id);
-- 补充日志
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
2.2 权限
GRANT SELECT ANY TRANSACTION TO scott;
GRANT EXECUTE ON DBMS_FLASHBACK TO scott;
2.3 归档
- 归档模式
- 归档日志保留
3. DBMS_FLASHBACK.TRANSACTION_BACKOUT
3.1 基本
DECLARE
v_xid SYS.XID_ARRAY;
BEGIN
v_xid := SYS.XID_ARRAY('0A001200AB1234');
DBMS_FLASHBACK.TRANSACTION_BACKOUT(
numtxns => 1,
xids => v_xid,
options => DBMS_FLASHBACK.BACKOUT_NOCASCADE
);
END;
/
COMMIT;
3.2 options
- NOCASCADE:默认,依赖检查
- NOCASCADE_FORCE:强制,可能数据不一致
- NONCONFLICT_ONLY:仅冲突
- CASCADE:级联回退
4. 步骤
4.1 找出事务
-- Flashback Versions Query
SELECT versions_xid, versions_operation, id, salary
FROM employees
VERSIONS BETWEEN TIMESTAMP
(SYSTIMESTAMP - INTERVAL '1' HOUR) AND SYSTIMESTAMP
WHERE id = 100;
4.2 详细
SELECT xid, operation, undo_sql, table_name, table_owner
FROM flashback_transaction_query
WHERE xid = HEXTORAW('0A001200AB1234');
4.3 回退
DECLARE
v_xid SYS.XID_ARRAY;
BEGIN
v_xid := SYS.XID_ARRAY('0A001200AB1234');
DBMS_FLASHBACK.TRANSACTION_BACKOUT(
numtxns => 1,
xids => v_xid,
options => DBMS_FLASHBACK.BACKOUT_NOCASCADE
);
END;
/
COMMIT;
4.4 验证
SELECT * FROM employees WHERE id = 100;
5. 级联回退
5.1 依赖事务
-- 找出依赖
SELECT xid, operation, undo_sql
FROM flashback_transaction_query
WHERE table_name = 'EMPLOYEES'
ORDER BY commit_scn;
5.2 多事务回退
DECLARE
v_xid SYS.XID_ARRAY;
BEGIN
v_xid := SYS.XID_ARRAY('0A001200AB1234', '0B001200AB1235');
DBMS_FLASHBACK.TRANSACTION_BACKOUT(
numtxns => 2,
xids => v_xid,
options => DBMS_FLASHBACK.BACKOUT_CASCADE
);
END;
/
COMMIT;
6. 限制
6.1 不支持
- LOB 操作
- 一些 DDL
- 跨数据库
6.2 数据丢失
- 归档日志缺失
- 后续事务覆盖
6.3 冲突
- 数据已被其他事务修改
- NONCONFLICT_ONLY 仅回退无冲突部分
7. 应用场景
7.1 误操作撤销
-- 误 UPDATE/DELETE
DBMS_FLASHBACK.TRANSACTION_BACKOUT(...);
7.2 错误事务回退
- 错误事务已提交
- 反向操作
- 数据恢复
7.3 审计恢复
- 审计发现问题
- 精确回退
- 不影响其他
8. 与其他对比
8.1 Flashback Table
- 表级回退
- 简单
- 整表
8.2 Transaction Backout
- 事务级
- 精确
- 复杂
8.3 PITR
- 数据库级
- 影响全库
- 最慢
9. 监控
9.1 事务
SELECT * FROM flashback_transaction_query
WHERE xid = HEXTORAW('...');
9.2 依赖
SELECT * FROM dba_flashback_txn_report;
SELECT * FROM dba_flashback_txn_state;
10. 常见坑与排错
10.1 ORA-55511
- 不支持操作
- LOB
- DDL
10.2 ORA-55508
- 超出范围
- 归档日志缺失
10.3 冲突
- 数据已被修改
- NONCONFLICT_ONLY
11. 最佳实践
- 补充日志:必须
- 主键:依赖
- 归档保留:充足
- 测试:场景
- 审计:变更
- 冲突:评估
- 级联:谨慎
- 验证:数据
- 备份:兜底
- 演练:定期
12. 参考资料
[1] Oracle Database PL/SQL Packages and Types Reference 19c, “DBMS_FLASHBACK” https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/