Oracle Streams: 灵活逻辑复制的经典篇章前言在本系列的前九篇文章中, 我们系统地探讨了Oracle数据库在高可用、容灾、复制和网络连接等各个领域的核心技术. 从RAC集群到Data Guard, 从GoldenGate到主从复制, 每一门技术都展现了Oracle在数据保护方面的强大能力.今天, 我们将为本系列画上一个圆满的句号, 深入探讨一款在Oracle历史上占有重要地位的数据复制技术——Oracle Streams. 虽然随着GoldenGate的崛起, Streams已逐渐退出主流舞台, 但其精巧的架构设计和灵活的复制能力, 至今仍值得我们学习和借鉴. 理解Streams, 不仅有助于维护存量的老系统, 更能加深我们对Oracle内核复制机制的理解.1. 什么是 Oracle Streams?1.1 核心定义Oracle Streams是Oracle数据库从9i版本开始引入的一项内置信息共享技术. 它允许在数据库之间、甚至在单个数据库内部, 灵活地捕获、暂存、传播和应用数据、事务和事件.Streams不仅仅是一个数据复制工具, 更是一个通用的信息流平台. 它可以被视为GoldenGate的前身和理念先驱, 两者在架构思想上高度相似: 都是从日志中捕获变更, 然后将其作为消息进行分发和处理.1.2 Streams 的核心定位| 特性 | Streams | Data Guard | GoldenGate || :--- | :--- | :--- | :--- ||复制原理| 逻辑日志捕获 | 物理块级恢复 | 逻辑日志捕获 ||复制粒度| 精细到表/模式/列 | 整个数据库 | 精细到表/列/行 ||目标库模式| 可读写 | 只读(物理备库) | 可读写 ||异构支持| 有限(Oracle间) | 不支持 |广泛支持||License成本| 企业版自带 | 需额外License | 需单独购买 ||当前状态| 12c后逐步弃用 | 持续增强 | 官方主推 |2. Streams 核心架构与工作流程Streams的架构与GoldenGate惊人地相似, 其核心流程同样分为三个阶段:捕获(Capture)、暂存与传播(Staging Propagation)、应用(Apply).目标数据库网络传播源数据库格式化变更LCR排队推送LCRLCR出队执行DML/DDLRedo Logs归档日志Capture 进程提取变更本地高级队列Local AQPropagation 作业传播LCR远程高级队列Remote AQApply 进程应用变更目标表/数据库2.1 核心组件详解1. Capture Process(捕获进程)捕获进程是一个Oracle后台进程, 它直接读取数据库的Redo Log(在线日志或归档日志), 从中提取出用户关心的DML和DDL变更, 并将其格式化为一个或多个逻辑变更记录(LCR, Logical Change Record).LCR是Streams中的核心数据结构, 它包含了一行数据变更的完整信息, 包括: 操作类型(INSERT/UPDATE/DELETE)、表名、变更前的列值(Old Values)和变更后的列值(New Values).2. Queue(队列)与 Staging(暂存)提取出的LCR不是直接被应用, 而是被放入一个高级队列(Advanced Queue, AQ)中. 队列是基于数据库表实现的、事务性、持久化的消息存储机制.事务性: LCR的入队和捕获的事务本身是一体的, 保证了数据一致性.持久化: LCR被安全地存储在数据库表中, 即使系统重启也不会丢失.3. Propagation(传播)传播作业负责将LCR从一个队列转移到另一个队列. 这个目标队列可以在同一个数据库内, 也可以在远程数据库内. 传播通过网络服务名进行, 支持配置过滤规则, 只传播满足条件的LCR.4. Apply Process(应用进程)应用进程从目标队列中读取LCR, 并在目标数据库上执行对应的DML或DDL操作, 将数据变更最终落实.2.2 端到端数据流用户在源库提交一个UPDATE事务.LGWR进程将Redo记录写入在线Redo Log.Capture进程从Redo Log中读取并解析出该UPDATE操作, 生成LCR.Capture进程将LCR放入本地高级队列.Propagation作业检测到本地队列中有待传播的消息, 将LCR推送到目标库的远程高级队列.Apply进程从目标队列中取出LCR.Apply进程在目标库上执行相应的UPDATE语句.3. 如何使用 Streams 进行数据复制?下面通过一个实际案例, 演示如何使用Streams实现HR.EMPLOYEES表的单向复制.3.1 前提条件源库和目标库均运行在ARCHIVELOG模式.源库和目标库之间已配置好网络服务名(如SOURCEDB和TARGETDB).以具有DBA权限的用户登录.3.2 配置步骤第一步: 创建Streams管理员和队列在两端的数据库上都需要创建Streams管理员用户, 并授予必要权限.-- 在源库和目标库分别执行 CREATE TABLESPACE streams_tbs DATAFILE /u01/app/oracle/oradata/ORCL/streams01.dbf SIZE 100M; CREATE USER strmadmin IDENTIFIED BY password DEFAULT TABLESPACE streams_tbs QUOTA UNLIMITED ON streams_tbs; GRANT DBA TO strmadmin; GRANT EXECUTE ON DBMS_STREAMS_ADM TO strmadmin; BEGIN DBMS_STREAMS_ADM.SET_UP_QUEUE( queue_table strmadmin.rep_queue_table, queue_name strmadmin.rep_queue, queue_user strmadmin); END; /第二步: 在源库上创建捕获进程捕获进程负责从Redo Log中提取HR.EMPLOYEES表的变更.-- 在源库以strmadmin用户执行 BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name hr.employees, streams_type capture, streams_name capture_emp, queue_name strmadmin.rep_queue, include_dml true, include_ddl true, source_database SOURCEDB); END; /第三步: 配置传播作业如果源库和目标库是不同的数据库, 需要配置传播作业来传输LCR.-- 在源库以strmadmin用户执行 -- 首先确保目标库也有相同的队列结构 BEGIN DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES( table_name hr.employees, streams_name propagate_emp, source_queue_name strmadmin.rep_queue, destination_queue_name strmadmin.rep_queueTARGETDB, include_dml true, include_ddl true, source_database SOURCEDB); END; /第四步: 在目标库上创建应用进程-- 在目标库以strmadmin用户执行 BEGIN DBMS_STREAMS_ADM.ADD_TABLE_RULES( table_name hr.employees, streams_type apply, streams_name apply_emp, queue_name strmadmin.rep_queue, include_dml true, include_ddl true, source_database SOURCEDB); END; /第五步: 启动所有进程-- 在源库启动捕获进程 EXEC DBMS_CAPTURE_ADM.START_CAPTURE(capture_emp); -- 在目标库启动应用进程 EXEC DBMS_APPLY_ADM.START_APPLY(apply_emp);第六步: 验证复制-- 在源库插入测试数据 INSERT INTO hr.employees (employee_id, first_name, last_name, email, hire_date, job_id) VALUES (9999, Test, User, testtest.com, SYSDATE, IT_PROG); COMMIT; -- 在目标库查询是否同步 SELECT * FROM hr.employees WHERE employee_id 9999;3.3 监控与故障诊断-- 查看捕获进程状态 SELECT CAPTURE_NAME, STATUS, ERROR_MESSAGE FROM DBA_CAPTURE; -- 查看传播作业状态 SELECT PROPAGATION_NAME, STATUS, ERROR_MESSAGE FROM DBA_PROPAGATION; -- 查看应用进程状态 SELECT APPLY_NAME, STATUS, ERROR_MESSAGE FROM DBA_APPLY; -- 查看队列中的消息数量 SELECT NAME, MSG_COUNT FROM V$BUFFERED_QUEUES;4. Streams 的优势与局限4.1 Streams 的优势灵活精细: 可以复制到表、列甚至行的级别, 支持复杂的过滤和转换规则.双向复制: 天然支持多主(N-Way)复制, 并内置了自动冲突检测与解决机制.成本优势: 作为Oracle企业版的内置功能, 无需额外购买License.紧密集成: 与Oracle数据库内核深度集成, 通过AQ、LogMiner等技术实现.4.2 Streams 的局限性能开销: Capture进程读取Redo Log会消耗CPU和I/O资源, 在高并发OLTP环境下需要仔细评估.复杂度高: 配置和管理Streams远比Data Guard复杂, 排查问题需要深入理解其内部机制.官方弃用: 从Oracle 12c开始, Streams被标记为Deprecated(弃用), Oracle官方明确推荐使用GoldenGate进行数据复制.异构支持有限: Streams主要用于Oracle数据库之间的复制, 对异构数据库的支持远不如GoldenGate.5. Streams 架构全景图目标数据库TARGETDB网络源数据库SOURCEDB用户事务Redo LogCapture进程capture_emp本地队列strmadmin.rep_queuePropagation作业propagate_empTCP/IP通过数据库链接远程队列strmadmin.rep_queueApply进程apply_emphr.employees 表总结Oracle Streams作为一款开创性的逻辑复制技术, 其捕获-排队-传播-应用的四阶段架构思想, 深刻影响了后续的GoldenGate等产品. 虽然在Oracle的官方路线图中, 它已被GoldenGate的光芒所掩盖, 但Streams曾经和正在服务的无数企业级系统, 证明了其设计的优秀和可靠.对于DBA和数据库架构师而言, 理解Streams的工作原理, 不仅有助于维护存量的Streams复制环境, 更能加深对Oracle日志捕获(LogMiner)、高级队列(AQ)等底层技术的理解, 这些都是构成Oracle数据库深厚底蕴的重要组成部分.---至此, 本系列Oracle高可用与数据复制技术完全指南十篇文章全部完成. 我们从Oracle RAC集群的共享一切架构出发, 历经Data Guard的日志传输、OCFS的集群文件系统、ASM的自动化存储管理、多层负载均衡的调度艺术、GoldenGate的异构复制神器、主从复制的读写分离、灾难恢复的纵深防线、网络服务名的连接桥梁, 最终以Streams的经典逻辑复制收尾.希望这十篇文章能够为您在Oracle数据库架构设计与运维管理的道路上, 提供一份系统、全面且深入的技术参考. 感谢您的持续阅读与支持!---如果本文对您有帮助, 请随手点赞、收藏! 您的支持是我持续分享深度技术内容的最大动力.