Oracle【实战篇】05:DG与ADG的高效部署与性能调优指南
1. DG与ADG部署前的环境准备
在开始部署Oracle Data Guard(DG)或Active Data Guard(ADG)之前,需要做好充分的准备工作。这个阶段就像盖房子前打地基,基础不牢后续工作都会受影响。我见过不少项目因为前期准备不足,导致后期频繁返工。
首先,硬件配置要满足基本要求。主备库服务器建议采用相同配置,特别是CPU和内存要匹配。存储空间方面,备库需要与主库相同的容量,还要额外考虑归档日志的存储需求。网络带宽建议至少1Gbps,如果数据变更频繁,可能需要更高带宽。
软件环境方面,主备库的Oracle版本必须完全一致,包括小版本号和补丁级别。我曾经遇到一个案例,客户主库是19.3.0.0而备库是19.3.0.1,结果DG同步一直报错。操作系统版本可以不同,但要确保Oracle对该OS版本的支持。
关键参数配置需要注意以下几点:
- 主库必须开启归档模式(ARCHIVELOG)
- 设置合理的归档日志删除策略
- 配置正确的DB_UNIQUE_NAME参数
- 设置合适的LOG_ARCHIVE_CONFIG参数
-- 检查归档模式 SELECT log_mode FROM v$database; -- 启用归档模式(如未开启) SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;网络配置是另一个重点。主备库之间需要开通以下端口:
- Oracle监听端口(通常1521)
- 归档日志传输端口
- DG Broker使用的端口(如启用)
建议配置/etc/hosts文件确保主机名解析正常,同时配置TNSNAMES.ORA文件测试连接性。我曾经遇到一个奇葩问题,DG同步时断时续,最后发现是DNS解析不稳定导致的。
2. 分步部署DG物理备库
部署物理备库是建立DG环境的核心步骤。下面我分享一个经过实战验证的部署流程,这个流程在金融行业多个项目中稳定运行。
2.1 主库准备工作
首先在主库上执行以下操作:
- 启用强制日志记录(Force Logging)
- 创建备库控制文件
- 备份主库数据文件
- 准备初始化参数文件
-- 启用强制日志记录 ALTER DATABASE FORCE LOGGING; -- 创建备库控制文件 ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby_control.ctl'; -- 备份主库(使用RMAN) RMAN> BACKUP AS COPY DATABASE FORMAT '/backup/%U';2.2 备库环境搭建
将主库的备份文件传输到备库服务器后,按照以下步骤操作:
- 创建必要的目录结构(如数据文件目录、归档日志目录等)
- 还原控制文件
- 还原数据文件
- 配置备库参数文件
备库的参数文件需要特别注意以下参数:
*.db_unique_name='STANDBY_DB' *.fal_server='PRIMARY_DB' *.standby_file_management='AUTO' *.log_archive_config='DG_CONFIG=(PRIMARY_DB,STANDBY_DB)'2.3 启动备库并开启同步
完成文件还原和参数配置后,启动备库到mount状态,然后开启Redo Apply进程:
-- 启动备库到mount状态 STARTUP MOUNT; -- 开启Redo Apply ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;此时,备库开始接收并应用主库传输过来的归档日志。可以通过以下命令检查同步状态:
-- 检查备库状态 SELECT database_role, open_mode FROM v$database; -- 检查同步进度 SELECT sequence#, applied FROM v$archived_log ORDER BY sequence# DESC;3. 从DG升级到ADG的配置方法
ADG是DG的增强版,最大的特点是备库可以在只读状态下继续应用日志。下面介绍如何将标准DG环境升级为ADG。
3.1 检查ADG许可
首先确认已购买ADG选件许可:
SELECT * FROM v$option WHERE parameter = 'Active Data Guard';3.2 配置备库为ADG模式
在备库上执行以下操作:
-- 停止Redo Apply ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; -- 以只读方式打开备库 ALTER DATABASE OPEN READ ONLY; -- 重新启动Redo Apply(ADG模式) ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;3.3 验证ADG功能
ADG模式下,备库应该同时满足两个条件:
- 处于OPEN READ ONLY状态
- 正在应用主库传输的redo日志
验证命令:
-- 检查数据库状态 SELECT database_role, open_mode FROM v$database; -- 检查日志应用状态 SELECT process, status FROM v$managed_standby;4. 性能调优实战技巧
DG/ADG环境的性能调优需要从多个维度入手。以下是经过实战验证的优化方法。
4.1 网络传输优化
日志传输是DG的核心环节,网络延迟会直接影响RPO(恢复点目标)。优化建议:
- 使用ASYNC传输模式降低主库压力(适用于非关键业务)
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_2='SERVICE=standby_db LGWR ASYNC COMPRESSION=ENABLE VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';4.2 备库应用性能优化
- 增加应用进程数(19c开始支持)
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE PARALLEL 4;- 调整内存参数
-- 增加SGA大小 ALTER SYSTEM SET sga_target=8G SCOPE=BOTH; -- 调整PGA大小 ALTER SYSTEM SET pga_aggregate_target=4G SCOPE=BOTH;4.3 主库性能保护
- 合理设置保护模式
-- 最大性能模式(默认) ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE; -- 最大可用性模式 ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;- 监控主库影响
-- 检查LGWR进程负载 SELECT event, wait_class, time_waited FROM v$system_event WHERE wait_class != 'Idle' ORDER BY time_waited DESC;5. 常见问题排查与解决方案
在实际运维中,DG/ADG环境可能会遇到各种问题。以下是几个典型问题的解决方法。
5.1 同步延迟问题
当发现备库应用延迟时,可以按照以下步骤排查:
- 检查网络状况
-- 查看传输状态 SELECT dest_name, status, error FROM v$archive_dest_status;- 检查备库应用进程
-- 查看MRP进程状态 SELECT process, status, sequence# FROM v$managed_standby;- 检查归档日志间隔
-- 主库最新日志 SELECT max(sequence#) FROM v$archived_log WHERE applied='YES'; -- 备库最新应用日志 SELECT max(sequence#) FROM v$archived_log WHERE applied='YES';5.2 备库无法打开只读
ADG模式下备库无法打开只读的常见原因:
- 检查是否有活动事务
SELECT count(*) FROM v$transaction;- 检查是否启用了ADG许可
SELECT * FROM v$option WHERE parameter = 'Active Data Guard';- 检查数据库状态
SELECT database_role, open_mode FROM v$database;5.3 角色切换失败处理
角色切换是DG运维中的重要操作,失败时可按以下步骤处理:
- 检查切换前状态
-- 主库检查 SELECT switchover_status FROM v$database; -- 备库检查 SELECT switchover_status FROM v$database;- 处理常见错误
-- 如果有活动会话 ALTER SYSTEM DISCONNECT SESSION 'sid,serial#' IMMEDIATE; -- 如果日志不同步 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;6. 企业级场景最佳实践
根据不同的业务场景,DG/ADG的配置策略也有所不同。以下是两个典型场景的配置建议。
6.1 金融行业异地容灾
金融行业对数据安全要求极高,建议配置:
- 采用最大保护模式
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;- 配置同步传输
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby_db LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db';- 部署Far Sync实例减少延迟
6.2 电商行业读写分离
电商行业读多写少,适合使用ADG实现读写分离:
- 配置多个备库分担读负载
-- 主库配置多个备库 ALTER SYSTEM SET LOG_ARCHIVE_DEST_3='SERVICE=standby_db2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db2';- 使用服务名路由读请求
-- 配置服务 BEGIN DBMS_SERVICE.CREATE_SERVICE( service_name => 'read_only_svc', network_name => 'read_only_svc', aq_ha_notifications => TRUE, failover_method => 'BASIC', failover_type => 'SELECT', failover_retries => 180, failover_delay => 5); END; / -- 将服务绑定到备库 ALTER SYSTEM SET SERVICE_NAMES='read_only_svc' SCOPE=MEMORY SID='standby_db';- 应用层配置读请求路由
7. 监控与维护方案
完善的监控体系是保障DG/ADG稳定运行的关键。以下是推荐的监控方案。
7.1 关键指标监控
- 同步延迟监控
SELECT name, value, time_computed FROM v$dataguard_stats WHERE name IN ('transport lag', 'apply lag');- 归档日志监控
SELECT dest_name, status, gap_status FROM v$archive_dest_status WHERE dest_id IN (SELECT dest_id FROM v$archive_dest WHERE target='STANDBY');7.2 自动化维护脚本
- 定期检查DG状态
#!/bin/bash # DG状态检查脚本 ORACLE_SID=primary_db sqlplus -s / as sysdba <<EOF set pagesize 100 set linesize 120 SELECT database_role, open_mode FROM v\$database; SELECT dest_name, status, error FROM v\$archive_dest_status WHERE target='STANDBY'; SELECT process, status, sequence# FROM v\$managed_standby; exit; EOF- 自动清理过期归档
-- 配置归档删除策略 CONFIGURE ARCHIVELOG DELETION POLICY TO APPLIED ON ALL STANDBY;7.3 定期切换演练
建议每季度执行一次角色切换演练,确保灾难恢复能力:
- 计划内切换步骤
-- 主库执行 ALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY; -- 备库执行 ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; ALTER DATABASE OPEN;- 验证数据一致性
-- 检查数据文件状态 SELECT name, status FROM v$datafile; -- 随机抽样验证数据 SELECT count(*) FROM schema.table SAMPLE(1);在实际项目中,DG/ADG的配置需要根据具体业务需求进行调整。建议先在测试环境验证方案,再应用到生产环境。遇到问题时,Oracle的alert日志和Data Guard Broker日志(如启用)是首要的排查依据。
