备库开启只读访问前必须确认:主库启用FORCE LOGGING;备库处于MOUNT状态且MRP0进程为APPLYING_LOG;执行ALTER DATABASE OPEN READ ONLY。
备库开启只读访问前必须确认的三件事
active data guard不是装完就能直接分担查询压力的。很多团队在配置完dg后发现select报错ora-16000(database open for read-only access),本质是没完成最关键的启用步骤。
- 主库必须启用
FORCE LOGGING,否则备库可能因日志缺失而中断实时应用 - 备库必须处于
MOUNT状态并已启动REDO APPLY,用SELECT PROCESS, STATUS FROM V$MANAGED_STANDBY;确认MRP0进程为APPLYING_LOG - 必须显式执行
ALTER DATABASE OPEN READ ONLY——物理备库不会自动打开,哪怕启用了ADG许可
连接字符串里写错service_name就绕不开主库
客户端连的是服务名(service_name),不是实例名(instance_name)或数据库名(db_name)。如果TNS配置里还沿用主库的服务名(比如orcl),DNS或负载均衡器会默认路由到主库。
- 备库需单独注册一个只读服务:在备库执行
srvctl add service -d orcl_standby -s report -r orcl_standby -P BASIC(RAC环境)或直接在listener.ora中静态注册 - tnsnames.ora中要区分定义:
REPORT = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=standby1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=report))) - Java应用若用
DataSource,URL必须指向report服务,不能复用oltp的连接池
READ_ONLY_ROUTING_LIST参数只对监听器生效
很多人以为在主库上配了READ_ONLY_ROUTING_LIST,客户端连主库监听器就会自动把只读请求甩给备库——这是误解。这个参数只影响SCAN Listener或Local Listener的内部路由逻辑,前提是客户端明确声明“我要只读”。
- 客户端连接串必须带
ApplicationIntent=ReadOnly(.NET)或oracle.net.READ_ONLY=true(JDBC) - 主库监听器配置中
READ_ONLY_ROUTING_LIST需指定备库服务名和地址,例如:(READ_ONLY_ROUTING_LIST=((PRIMARY_ROLE)(SERVICE_NAME=report)(INSTANCE_NAME=orcl_standby)(SERVER=DEDICATED))) - 该机制依赖Oracle Net Services 12c及以上版本,11g不支持
备库查询性能差?先查这四个隐藏瓶颈
即使连接成功,备库查询慢往往不是SQL本身问题,而是ADG特有的资源争用点。
-
DBWR进程可能被MRP0抢占I/O:检查V$SYSMETRIC中“Physical Reads Per Sec”是否持续高于主库,考虑调大DB_RECOVERY_FILE_DEST_SIZE - 备库SGA中
shared pool碎片化严重:只读查询频繁硬解析时,V$SHARED_POOL_ADVICE建议值可能比主库高30% - 未关闭
STATISTICS_LEVEL=ALL:备库默认继承主库统计级别,但AWR快照无法生成,反而拖慢解析,建议设为TYPICAL - 备库临时表空间不足:报表类查询大量用
TEMP,而CREATE TEMPORARY TABLESPACE语句不会自动同步到备库,需手动创建
READ_ONLY_ROUTING_LIST和客户端intent标识这两处联动失效;以及备库I/O与内存资源未按只读负载特征重配。











