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. 最佳实践
- 评估:业务
- 测试:充分
- Cross-Edition:数据
- 回退:预案
- 监控:使用
- 文档:版本
- 演练:升级
- 连接:应用
- 清理:旧版
- 审计:变更
14. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Edition-Based Redefinition” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/