在 Ubuntu 上配置 Oracle 数据库复制
方案选型与前置条件
- 常见方案对比与适用场景
- Data Guard 物理备库:高可用与灾备首选,基于重做日志的块级复制,支持最大可用/最大性能模式,切换与回切流程成熟,适合生产核心库。
- Oracle GoldenGate:异构/跨平台、跨版本、细粒度对象与 DML/DDL 双向复制,延迟低、灵活性强,适合零停机迁移与多活/双向场景。
- Streams(已不推荐)/逻辑复制:基于队列的逻辑复制,可跨字符集/版本,但维护复杂度高,官方已转向 GoldenGate,仅在存量环境维护中使用。
- 前置条件
- 两台 Ubuntu 主机(建议 Ubuntu 20.04/22.04),网络互通,开放 1521/TCP(数据库)、22/TCP(SSH)。
- 已安装同版本(或兼容版本)的 Oracle Database(单实例即可),具备 SYS 权限与 Oracle Wallet/口令文件 可用。
- 主库启用 归档日志 与 FORCE LOGGING,存储与归档目录充足;主备 DB_NAME 一致、DB_UNIQUE_NAME 不同。
- 时间同步(如 chrony),磁盘与文件系统权限正确,备份策略到位。
方案一 使用 Data Guard 物理备库(推荐)
- 主库配置
- 启用归档与强制日志
- sqlplus / as sysdba
- archive log list;
- alter database force logging;
- shutdown immediate; startup mount;
- alter database archivelog;
- alter database open;
- 创建备库控制文件与口令文件
- alter database create standby controlfile as ‘/u01/app/oracle/oradata/STDBY/control01.ctl’;
- orapwd file=$ORACLE_HOME/dbs/orapwSTDBY entries=30 force=y
- 配置参数(示例,写入 spfile 后重启)
- alter system set db_unique_name=‘PRI’ scope=spfile;
- alter system set log_archive_config=‘dg_config=(PRI,STDBY)’ scope=spfile;
- alter system set log_archive_dest_1=‘location=/u01/app/oracle/arch valid_for=(all_logfiles,all_roles) db_unique_name=PRI’ scope=spfile;
- alter system set log_archive_dest_2=‘service=STDBY async valid_for=(online_logfiles,primary_role) db_unique_name=STDBY’ scope=spfile;
- alter system set log_archive_dest_state_1=enable scope=spfile;
- alter system set log_archive_dest_state_2=enable scope=spfile;
- alter system set fal_server=‘STDBY’ scope=spfile;
- alter system set fal_client=‘PRI’ scope=spfile;
- alter system set standby_file_management=‘auto’ scope=spfile;
- – 如主备目录不同,增加:
- alter system set db_file_name_convert=‘/u01/app/oracle/oradata/PRI’,‘/u01/app/oracle/oradata/STDBY’ scope=spfile;
- alter system set log_file_name_convert=‘/u01/app/oracle/oradata/PRI’,‘/u01/app/oracle/oradata/STDBY’ scope=spfile;
- 监听与 TNS(两节点一致)
- listener.ora 中为主库 SID 配置静态服务(可选,提升稳定性)。
- tnsnames.ora 增加:
- PRI = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=pri-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=PRI)))
- STDBY = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stdby-host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=STDBY)))
- 备库配置
- 目录与权限
- mkdir -p /u01/app/oracle/oradata/STDBY /u01/app/oracle/arch /u01/app/oracle/fast_recovery_area/STDBY
- chown -R oracle:oinstall /u01/app/oracle
- 使用 RMAN 从主库克隆备库(DUPLICATE)
- rman target sys/oracle@PRI auxiliary sys/oracle@STDBY
- duplicate target database for standby from active database nofilenamecheck;
- 启动备库 MRP(介质恢复进程)
- sqlplus / as sysdba
- alter database recover managed standby database disconnect from session;
- – 如需只读查询:alter database recover managed standby database cancel; alter database open read only;
- 验证与切换
- 主库:alter system switch logfile; 备库:select process,status,thread#,sequence# from v$managed_standby;
- 切换演练(计划内):在主库执行 ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 在备库执行 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; 完成后反向切换。
- 注:以上关键步骤(归档、FAL、db_unique_name、log_archive_dest_n、RMAN duplicate、MRP)为 Data Guard 搭建的核心环节,参数名与流程在不同版本保持一致,仅路径与实例名需按现场调整。
方案二 使用 Oracle GoldenGate 进行逻辑复制
- 适用场景:跨平台/跨版本、零停机升级、双向复制、只复制部分对象/表空间。
- 主备库启用补充日志与最小补充日志
- sqlplus / as sysdba
- alter database add supplemental log data;
- alter database add supplemental log data (primary key,unique,foreign key) columns;
- GoldenGate 安装与用户
- 在两端安装 Oracle GoldenGate for Oracle(对应数据库版本),创建管理用户(如 ggadmin),授予 DBA 或细粒度权限,并配置 ENABLE_GOLDENGATE_REPLICATION=true(12c+)。
- 抽取、投递与复制进程(示例)
- 抽取(主库)
- ADD EXTRACT ext1, TRANLOG, BEGIN NOW
- ADD EXTTRAILSOURCE /u01/gg/dirdat/ea, EXTRACT ext1
- ADD RMTTRAIL /u01/gg/dirdat/ra, EXTRACT ext1
- START EXTRACT ext1
- 投递(主库)
- ADD EXTRACT dpump, EXTTRAILSOURCE /u01/gg/dirdat/ea
- ADD RMTTRAIL /u01/gg/dirdat/ra, EXTRACT dpump
- START EXTRACT dpump
- 复制(备库)
- ADD REPLICAT rep1, EXTTRAIL /u01/gg/dirdat/ra, CHECKPOINTTABLE ggadmin.checkpoint
- START REPLICAT rep1
- 双向复制要点
- 避免环路:在复制链路中对 DML 打 TAG,对含 TAG 的 LCR 不再次复制;或按表/模式拆分方向。
- 冲突处理:定义冲突检测与解决策略(时间戳/版本列/业务规则)。
- 初始化加载:使用 RMAN 增量 SCN 或 Data Pump 做基线,再开启增量同步。
- 注:GoldenGate 的抽取/投递/复制进程模型、初始化与环路避免机制为通用做法,具体参数依业务与版本细化。
方案三 使用 Streams 逻辑复制(存量环境维护)
- 适用场景:已有 Streams 环境维护或特定 DDL 传播需求。
- 关键步骤
- 两库启用 归档日志 与 补充日志,设置 GLOBAL_NAMES=TRUE,并配置 AQ/STREAMS 相关参数(如 streams_pool_size、aq_tm_processes)。
- 创建复制管理员(如 strmadmin)与表空间,使用 DBMS_STREAMS_ADM 配置捕获/传播/应用进程,完成实例化与启动。
- 双向同步需额外注意环路与冲突处理,通常先完成单向再扩展为双向。
- 注:Streams 在 12c 之后官方主推 GoldenGate,新部署建议优先选择 GoldenGate 或 Data Guard。
快速验证与常见问题
- 快速验证
- Data Guard:在主库切换日志后,备库查询 v$archived_log 与 v$managed_standby 的 sequence#/status 是否同步推进;必要时执行 READ ONLY WITH APPLY 验证查询一致性。
- GoldenGate:info all/extract/ replicat 查看进程状态,stats 查看延迟,view report 与 ggsci lag 检查复制时延与错误。
- 常见问题
- 网络与解析:确保 /etc/hosts 或 DNS 正确,tnsping PRI/STDBY 可达;防火墙放行 1521。
- 归档与空间:监控 ARCHIVELOG 与 FRA 使用率,避免归档满导致同步中断。
- 参数一致性:主备 compatible、字符集、时区、时间同步;Data Guard 注意 db_file_name_convert/log_file_name_convert 与 DB_UNIQUE_NAME。
- 补充日志:未启用会导致 Key Columns 缺失,影响一致性与冲突处理。
- 版本与特性:确认数据库版本对 Data Guard/GG 的支持矩阵与补丁级别,必要时先升级再部署复制。