Oracle Edition-Based Redefinition 详解

Oracle Edition-Based Redefinition 详解

适用版本:Oracle Database 11g R2+ / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

Edition-Based Redefinition(EBR)支持在线应用升级[1]:

详细见:Oracle 用户 模式 权限 角色


2. 优势

2.1 零停机

- 应用升级
- 业务不停
- 在线

2.2 版本

- 多版本
- 共存
- 切换

2.3 安全

- 回退
- 测试
- 生产

3. Edition

3.1 创建

CREATE EDITION ebr_v2 AS CHILD OF ora$base;

3.2 查看

SELECT * FROM dba_editions;
SELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') FROM dual;

3.3 切换

ALTER SESSION SET EDITION = ebr_v2;

4. 对象

4.1 Editioned

- PL/SQL 对象(包/过程/函数/类型/触发器)
- 同义词
- 视图

4.2 Non-Editioned

- 表
- 索引
- 序列
- 不能 EBR

4.3 启用

ALTER TABLE emp ENABLE EDITIONS;

5. 版本化

5.1 PL/SQL

-- 在新 Edition
ALTER SESSION SET EDITION = ebr_v2;

CREATE OR REPLACE PROCEDURE my_proc AS
BEGIN
  -- 新版本
END;
/

5.2 视图

-- 视图版本化
CREATE OR REPLACE VIEW my_view AS ...;

5.3 表

-- 表需启用
ALTER TABLE emp ENABLE EDITIONS;

6. Cross-Edition Trigger

6.1 作用

- 转换数据
- 旧->新
- 共存

6.2 Forward

CREATE OR REPLACE TRIGGER emp_fwd 
  FORWARD CROSSEDITION 
  BEFORE INSERT OR UPDATE ON emp
  FOR EACH ROW
BEGIN
  :NEW.new_col := :OLD.old_col;
END;
/

6.3 Reverse

CREATE OR REPLACE TRIGGER emp_rev 
  REVERSE CROSSEDITION 
  BEFORE INSERT OR UPDATE ON emp
  FOR EACH ROW
BEGIN
  :OLD.old_col := :NEW.new_col;
END;
/

7. 应用升级

7.1 流程

1. 创建新 Edition
2. 修改代码
3. 测试
4. 切换
5. 旧版保留
6. 回退(可选)

7.2 数据迁移

- ADD COLUMN
- Cross-Edition Trigger
- 数据迁移

7.3 切换

- 应用切换 Edition
- 在线
- 快速

8. 实际应用

8.1 ADD COLUMN

-- 旧版
ALTER TABLE emp ADD (new_salary NUMBER);

-- Cross-Edition Trigger 转换
-- 新版使用 new_salary

8.2 PL/SQL 升级

-- 新 Edition
ALTER SESSION SET EDITION = ebr_v2;
CREATE OR REPLACE PROCEDURE my_proc AS ...;

8.3 视图

-- 新 Edition 视图
CREATE OR REPLACE VIEW emp_view AS ...;

9. 管理

9.1 Editions

-- 创建
CREATE EDITION ebr_v3 AS CHILD OF ebr_v2;

-- 删除
DROP EDITION ebr_v2 CASCADE;

9.2 视图

SELECT * FROM dba_editions;
SELECT * FROM dba_objects WHERE editioning = 'Y';

9.3 实际对象

SELECT object_name, edition_name, status
FROM dba_objects_ae
WHERE object_name = 'MY_PROC';

10. 应用场景

10.1 应用升级

- 大版本
- 在线
- 零停机

10.2 热修复

- 紧急修复
- 新 Edition
- 切换

10.3 A/B 测试

- 多版本
- 测试
- 切换

11. 限制

11.1 表

- 表不能 Editioned
- 仅列变化
- 启用

11.2 复杂

- 管理复杂
- 评估
- 测试

11.3 兼容

- 应用支持
- Edition
- 连接

12. 常见问题

12.1 ORA-38802

- Edition 不存在
- 检查

12.2 对象不可见

- Edition 不对
- 切换

12.3 数据

- Cross-Edition Trigger
- 转换

13. 最佳实践

  1. 评估:业务
  2. 测试:充分
  3. Cross-Edition:数据
  4. 回退:预案
  5. 监控:使用
  6. 文档:版本
  7. 演练:升级
  8. 连接:应用
  9. 清理:旧版
  10. 审计:变更

14. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Edition-Based Redefinition” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/