Skip to content

Oracle Data Guard复制配置

概述

Oracle Data Guard是Oracle数据库的高可用性解决方案,通过在主数据库和一个或多个备数据库之间维护事务一致性,提供数据保护、灾难恢复和高可用性。Data Guard支持两种主要的复制类型:物理备库和逻辑备库。

架构设计

物理备库架构

物理备库通过Oracle Media Recovery技术,将主库生成的Redo日志应用到备库,保持备库与主库的物理一致性。物理备库的架构特点:

  • 备库使用与主库相同的物理结构和数据文件
  • 支持实时应用Redo日志(Real-Time Apply)
  • 支持只读模式访问(Active Data Guard)
  • 恢复速度快,适合灾难恢复场景

逻辑备库架构

逻辑备库通过SQL Apply技术,将主库生成的Redo日志转换为SQL语句,然后在备库上执行,保持备库与主库的逻辑一致性。逻辑备库的架构特点:

  • 备库可以使用不同的物理结构
  • 支持对特定表空间或表进行恢复
  • 支持在备库上执行DML操作
  • 适合数据仓库和报表查询场景

环境准备

系统要求

配置项要求
Oracle版本19c或21c
操作系统Linux 64位或Windows 64位
内存至少与主库相同
磁盘空间至少与主库相同
网络带宽至少1Gbps(推荐10Gbps)

初始化配置

  1. 确保主库和备库的Oracle版本相同
  2. 配置主库和备库的操作系统参数
  3. 配置主库和备库的网络连接(tnsnames.ora和listener.ora)
  4. 确保主库已启用归档日志模式
  5. 确保主库已启用强制日志记录

物理备库配置

主库配置

  1. 启用归档日志模式
sql
ALTER DATABASE FORCE LOGGING;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary_db';
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary_db,standby_db)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE;
ALTER SYSTEM SET FAL_SERVER=standby_db;
ALTER SYSTEM SET FAL_CLIENT=primary_db;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
  1. 创建备库控制文件
sql
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/app/oracle/oradata/primary_db/standby.ctl';
  1. 创建密码文件
bash
orapwd file=$ORACLE_HOME/dbs/orapwprimary_db password=Oracle123 force=y

备库配置

  1. 创建目录结构
bash
mkdir -p /u01/app/oracle/oradata/standby_db
mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area
  1. 复制主库文件到备库
bash
# 复制密码文件
scp primary_host:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwprimary_db /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwstandby_db

# 复制备库控制文件
scp primary_host:/u01/app/oracle/oradata/primary_db/standby.ctl /u01/app/oracle/oradata/standby_db/

# 复制数据文件(使用RMAN或rsync)
rman target sys/Oracle123@primary_db auxiliary sys/Oracle123@standby_db <<EOF
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;
EOF
  1. 配置备库参数文件
sql
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary_db,standby_db)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby_db';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=primary_db ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary_db';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE;
ALTER SYSTEM SET FAL_SERVER=primary_db;
ALTER SYSTEM SET FAL_CLIENT=standby_db;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
ALTER SYSTEM SET DB_FILE_NAME_CONVERT='primary_db','standby_db' scope=spfile;
ALTER SYSTEM SET LOG_FILE_NAME_CONVERT='primary_db','standby_db' scope=spfile;
  1. 启动备库恢复
sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

逻辑备库配置

主库配置

  1. 启用归档日志模式
sql
ALTER DATABASE FORCE LOGGING;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary_db';
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary_db,logical_standby)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=logical_standby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=logical_standby';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE;
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE;
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;
  1. 启用补充日志
sql
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;

备库配置

  1. 创建目录结构
bash
mkdir -p /u01/app/oracle/oradata/logical_standby
mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area
  1. 复制主库文件到备库
bash
# 复制密码文件
scp primary_host:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwprimary_db /u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapwlogical_standby

# 使用RMAN复制数据库
rman target sys/Oracle123@primary_db auxiliary sys/Oracle123@logical_standby <<EOF
DUPLICATE TARGET DATABASE FOR LOGICAL STANDBY FROM ACTIVE DATABASE NOFILENAMECHECK;
EOF
  1. 配置逻辑备库
sql
-- 启用逻辑备库
ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

-- 验证逻辑备库状态
SELECT DB_UNIQUE_NAME, DATABASE_ROLE, OPEN_MODE FROM V$DATABASE;
SELECT APPLIED_SCN, LATEST_SCN FROM V$LOGSTDBY_PROGRESS;

版本差异

Oracle 19c vs 21c Data Guard复制差异

特性Oracle 19cOracle 21c
自动主备切换支持Fast-Start Failover增强Fast-Start Failover,支持更多场景
备库并行恢复支持并行Media Recovery增强并行恢复,提高恢复速度
逻辑备库性能一般显著提升,支持并行SQL Apply
跨平台复制支持增强跨平台复制,支持更多平台组合
自动诊断基础自动诊断增强自动诊断和修复能力
云集成基础云集成增强云集成,支持与OCI、AWS、Azure等云平台集成

监控与管理

监控Data Guard状态

  1. 查看Data Guard配置状态
sql
SELECT * FROM V$DATAGUARD_CONFIG;
SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE TARGET='STANDBY';
  1. 查看备库应用状态
sql
-- 物理备库
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;

-- 逻辑备库
SELECT APPLIED_SCN, LATEST_SCN, STATUS FROM V$LOGSTDBY_PROGRESS;
  1. 监控Redo传输延迟
sql
SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME IN ('transport lag', 'apply lag');

常见管理任务

  1. 切换Redo传输模式
sql
-- 从异步切换到同步
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_db SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';

-- 从同步切换到异步
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';
  1. 启用实时应用
sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
  1. 暂停和恢复备库应用
sql
-- 暂停应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

-- 恢复应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

最佳实践

物理备库最佳实践

  1. 使用Real-Time Apply:实时应用Redo日志,减少备库与主库的延迟
  2. 启用Active Data Guard:允许备库在只读模式下运行,提高资源利用率
  3. 配置合适的Redo传输模式:根据网络带宽和恢复时间要求选择同步或异步模式
  4. 定期验证备库可用性:定期执行备库切换测试,确保备库可以正常接管主库
  5. 监控Redo传输和应用延迟:设置告警阈值,及时发现和解决延迟问题

逻辑备库最佳实践

  1. 选择合适的备库类型:根据业务需求选择物理备库或逻辑备库
  2. 优化SQL Apply性能:调整并行度和内存配置,提高SQL Apply效率
  3. 监控逻辑备库应用状态:定期检查应用进度和错误日志
  4. 避免在备库上执行大量DML操作:减少备库负载,避免影响应用性能
  5. 定期验证数据一致性:使用DBMS_COMPARISON包验证主备库数据一致性

故障处理

常见故障及解决方法

  1. Redo传输失败

症状:主库告警日志显示"ORA-12541: TNS:no listener"或"ORA-12514: TNS:listener does not currently know of service requested in connect descriptor"

解决方法

  • 检查备库监听器状态
  • 验证tnsnames.ora配置
  • 检查网络连接
  1. 备库应用失败

症状:备库告警日志显示"ORA-16055: FAL request rejected"或"ORA-01578: ORACLE data block corrupted (file # 5, block # 12345)"

解决方法

  • 检查备库数据文件完整性
  • 验证Redo日志完整性
  • 使用RMAN修复损坏的数据块
  1. 主备库延迟过大

症状:V$DATAGUARD_STATS显示apply lag或transport lag超过阈值

解决方法

  • 检查网络带宽
  • 调整Redo传输模式
  • 增加备库并行恢复进程数
  • 优化备库I/O性能

常见问题(FAQ)

Q: 物理备库和逻辑备库有什么区别?

A: 物理备库通过Media Recovery技术保持与主库的物理一致性,恢复速度快,适合灾难恢复场景;逻辑备库通过SQL Apply技术保持与主库的逻辑一致性,支持对特定表空间或表进行恢复,适合数据仓库和报表查询场景。

Q: 如何选择同步传输还是异步传输?

A: 同步传输(SYNC)可以确保主库提交的事务已成功传输到备库,提供最高的数据保护级别,但会增加主库提交延迟;异步传输(ASYNC)不会增加主库提交延迟,但可能存在数据丢失风险。选择时需要根据业务对数据保护和性能的要求进行权衡。

Q: 如何配置Active Data Guard?

A: 要配置Active Data Guard,需要确保备库已启用Real-Time Apply,然后将备库从MOUNT模式转换为READ ONLY模式:

sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE OPEN READ ONLY;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

Q: 如何执行主备库切换?

A: 主备库切换可以通过SWITCHOVER命令执行,具体步骤如下:

  1. 验证主库和备库状态
  2. 将主库转换为备库角色
  3. 将备库转换为主库角色
  4. 启动新主库的Redo日志传输
  5. 验证新主库和新备库状态

Q: Data Guard支持多少个备库?

A: Oracle 19c和21c支持最多30个备库,其中可以包含物理备库和逻辑备库的组合。

Q: 如何监控Data Guard的性能?

A: 可以使用以下视图监控Data Guard的性能:

  • V$DATAGUARD_STATS:查看传输延迟和应用延迟
  • V$MANAGED_STANDBY:查看物理备库的恢复进程状态
  • V$LOGSTDBY_PROGRESS:查看逻辑备库的应用进度
  • V$ARCHIVE_DEST:查看Redo传输状态

总结

Oracle Data Guard是Oracle数据库的高可用性解决方案,通过配置物理备库或逻辑备库,可以提供数据保护、灾难恢复和高可用性。在配置Data Guard时,需要根据业务需求选择合适的备库类型和配置参数,并定期监控和管理Data Guard的状态,确保其正常运行。Oracle 21c相比19c在Data Guard复制方面有显著增强,包括增强的Fast-Start Failover、并行恢复和云集成等功能。