外观
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) |
初始化配置
- 确保主库和备库的Oracle版本相同
- 配置主库和备库的操作系统参数
- 配置主库和备库的网络连接(tnsnames.ora和listener.ora)
- 确保主库已启用归档日志模式
- 确保主库已启用强制日志记录
物理备库配置
主库配置
- 启用归档日志模式
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;- 创建备库控制文件
sql
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/app/oracle/oradata/primary_db/standby.ctl';- 创建密码文件
bash
orapwd file=$ORACLE_HOME/dbs/orapwprimary_db password=Oracle123 force=y备库配置
- 创建目录结构
bash
mkdir -p /u01/app/oracle/oradata/standby_db
mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area- 复制主库文件到备库
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- 配置备库参数文件
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;- 启动备库恢复
sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;逻辑备库配置
主库配置
- 启用归档日志模式
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;- 启用补充日志
sql
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;备库配置
- 创建目录结构
bash
mkdir -p /u01/app/oracle/oradata/logical_standby
mkdir -p /u01/app/oracle/archivelog
mkdir -p /u01/app/oracle/fast_recovery_area- 复制主库文件到备库
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- 配置逻辑备库
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 19c | Oracle 21c |
|---|---|---|
| 自动主备切换 | 支持Fast-Start Failover | 增强Fast-Start Failover,支持更多场景 |
| 备库并行恢复 | 支持并行Media Recovery | 增强并行恢复,提高恢复速度 |
| 逻辑备库性能 | 一般 | 显著提升,支持并行SQL Apply |
| 跨平台复制 | 支持 | 增强跨平台复制,支持更多平台组合 |
| 自动诊断 | 基础自动诊断 | 增强自动诊断和修复能力 |
| 云集成 | 基础云集成 | 增强云集成,支持与OCI、AWS、Azure等云平台集成 |
监控与管理
监控Data Guard状态
- 查看Data Guard配置状态
sql
SELECT * FROM V$DATAGUARD_CONFIG;
SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE TARGET='STANDBY';- 查看备库应用状态
sql
-- 物理备库
SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK# FROM V$MANAGED_STANDBY;
-- 逻辑备库
SELECT APPLIED_SCN, LATEST_SCN, STATUS FROM V$LOGSTDBY_PROGRESS;- 监控Redo传输延迟
sql
SELECT NAME, VALUE FROM V$DATAGUARD_STATS WHERE NAME IN ('transport lag', 'apply lag');常见管理任务
- 切换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';- 启用实时应用
sql
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;- 暂停和恢复备库应用
sql
-- 暂停应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
-- 恢复应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;最佳实践
物理备库最佳实践
- 使用Real-Time Apply:实时应用Redo日志,减少备库与主库的延迟
- 启用Active Data Guard:允许备库在只读模式下运行,提高资源利用率
- 配置合适的Redo传输模式:根据网络带宽和恢复时间要求选择同步或异步模式
- 定期验证备库可用性:定期执行备库切换测试,确保备库可以正常接管主库
- 监控Redo传输和应用延迟:设置告警阈值,及时发现和解决延迟问题
逻辑备库最佳实践
- 选择合适的备库类型:根据业务需求选择物理备库或逻辑备库
- 优化SQL Apply性能:调整并行度和内存配置,提高SQL Apply效率
- 监控逻辑备库应用状态:定期检查应用进度和错误日志
- 避免在备库上执行大量DML操作:减少备库负载,避免影响应用性能
- 定期验证数据一致性:使用DBMS_COMPARISON包验证主备库数据一致性
故障处理
常见故障及解决方法
- Redo传输失败
症状:主库告警日志显示"ORA-12541: TNS:no listener"或"ORA-12514: TNS:listener does not currently know of service requested in connect descriptor"
解决方法:
- 检查备库监听器状态
- 验证tnsnames.ora配置
- 检查网络连接
- 备库应用失败
症状:备库告警日志显示"ORA-16055: FAL request rejected"或"ORA-01578: ORACLE data block corrupted (file # 5, block # 12345)"
解决方法:
- 检查备库数据文件完整性
- 验证Redo日志完整性
- 使用RMAN修复损坏的数据块
- 主备库延迟过大
症状: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命令执行,具体步骤如下:
- 验证主库和备库状态
- 将主库转换为备库角色
- 将备库转换为主库角色
- 启动新主库的Redo日志传输
- 验证新主库和新备库状态
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、并行恢复和云集成等功能。
