大家好,我是 睿 。
在传统的 Active Data Guard ( ADG )中,备库只能做只读查询,这让很多“读多写少”的应用场景非常痛苦——报表系统偶尔要写点临时数据,就得切到主库,增加主库压力。
Oracle 19c 正式引入的 DML Redirection ( DML 重定向)特性完美解决了这个问题:在备库执行 DML 时, Oracle 会自动把操作重定向到主库执行,执行完后再把结果同步回备库,对应用几乎透明!
今天这篇文章带你从原理到实战,完整玩转这个特性。
DML Redirection 允许在 Active Data Guard 物理备库( READ ONLY 模式)上执行 DML ( INSERT/UPDATE/DELETE )操作。
工作原理( 5 步流程):
1. 客户端在备库发出 DML ;
2. 备库检测到 DML ,通过内部 DB Link (名称必须为 ADGREDIRECT )把语句发送到主库;
3. 主库执行 DML 并产生 Redo ;
4. Redo 通过 Data Guard 传输到备库并应用;
5. 备库会话等待 Redo 应用完成后,返回结果给客户端。
核心优势:
1. 实现真正 的 Read-Mostly 负载分担
2 . 减少主库压力
3 . 应用无需修改连接字符串
4 . 保持 ACID 特性
Oracle 官方建议:仅用于偶尔的 DML (建议重定向 DML 占比 < 10% ),避免对主库造成额外负担。
1. 主备均为 19c 及以上版本
2. 备库必须是 Active Data Guard ( READ ONLY WITH APPLY )
3. 主备网络连通(备库能连到主库)
4. 备库处于实时应用模式( Real-time Apply )
查看备库状态:
SELECT OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS, PROTECTION_MODE, FLASHBACK_ON FROM V$DATABASE;
1. 在备库启用 DML 重定向
-- 系统级启用(推荐,大多数场景)
ALTER SYSTEM SET ADG_REDIRECT_DML = TRUE SCOPE=BOTH;
该参数动态生效,无需重启数据库!
2. 创建 Public DB Link
必须在主库创建(会通过 Redo 同步到备库),名称固定为 ADGREDIRECT 。
-- 先删除旧的(如果存在) DROP PUBLIC DATABASE LINK ADGREDIRECT; -- 创建 CREATE PUBLIC DATABASE LINK ADGREDIRECT CONNECT TO system IDENTIFIED BY "你的密码" USING '(DESCRIPTION= (ADDRESS=(PROTOCOL=TCP)(HOST=主库IP)(PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=你的服务名)) )';
注意事项:
<1> 使用有足够权限的用户
<2> 监控主库负载和备库 Apply 延迟
3. 测试验证
使用非 SYS 用户在备库执行 DML :
sqlplus mary/oracle SQL> INSERT INTO mary.test VALUES (1, 'test_dml_redirect'); 1 row created. SQL> COMMIT; Commit complete. 然后在主库查询验证: SQL> SELECT * FROM test.test;
Oracle 19c 的 ADG DML Redirection 是 Active Data Guard 的重大进化,让备库从纯只读真正走向读为主、偶尔可写,极大提升了投资回报率,通常适用于 报表系统偶尔需要写中间结果表 、 低频配置表更新 等场景。
掌握这个特性后,你可以更放心地把读写混合的负载压到备库,解放主库资源。
点赞 + 转发 + 关注,下期我们继续分享!
评论区告诉我:你在生产环境中是否已经启用 ADG DML 重定向功能?最希望把哪类操作迁移到备库执行?

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70047128/viewspace-3174349/ ,如需转载,请注明出处,否则将追究法律责任。