备库开启只读访问前必须确认的三件事 Active Data Guard可不是配置完就能立刻分担查询压力的。不少团队在搭建好DG环境后,兴冲冲地连上备库执行SELECT,结果却碰上了ORA-16000错误(database open for read-only access)。这背后的症结,往往是最关
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),而不是实例名(instance_name)或数据库名(db_name)。如果在TNS配置里,你仍然沿用主库的服务名(比如orcl),那么DNS或者负载均衡器会默认将所有连接请求都路由到主库,备库就形同虚设了。
srvctl add service -d orcl_standby -s report -r orcl_standby -P BASIC的命令;对于单实例,则可以直接在listener.ora中进行静态注册。tnsnames.ora文件里,必须清晰地区分定义。例如:REPORT = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=standby1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=report)))。DataSource,连接URL必须明确指向report这个服务,切忌图省事复用面向oltp业务的连接池配置。很多人存在一个误解:以为在主库上配置了READ_ONLY_ROUTING_LIST参数后,客户端只要连接主库的监听器,所有只读请求就会被自动转发到备库。其实不然,这个参数只影响SCAN Listener或Local Listener的内部路由逻辑,而且有一个重要前提:客户端必须明确声明自己的连接意图是“只读”。
ApplicationIntent=ReadOnly,而JDBC驱动则需要设置oracle.net.READ_ONLY=true。READ_ONLY_ROUTING_LIST需要正确指定备库的服务名和地址。一个典型的配置示例如下:(READ_ONLY_ROUTING_LIST=((PRIMARY_ROLE)(SERVICE_NAME=report)(INSTANCE_NAME=orcl_standby)(SERVER=DEDICATED)))。即便连接配置正确,成功连上了备库,查询性能不佳也是常遇到的问题。这时候,问题往往不在于SQL语句本身,而是ADG环境下特有的几个资源争用点。
DBWR(数据库写进程)可能会被负责日志应用的MRP0进程抢占I/O带宽。可以检查V$SYSMETRIC视图中“Physical Reads Per Sec”的指标,如果持续高于主库,可能需要考虑调大DB_RECOVERY_FILE_DEST_SIZE,或者优化存储性能。shared pool区域碎片化严重。观察V$SHARED_POOL_ADVICE给出的建议值,备库所需的共享池大小可能比主库高出30%甚至更多。STATISTICS_LEVEL参数设置。但如果设置为ALL,在备库上却无法生成AWR快照,这些额外的统计开销反而会拖慢SQL解析。经验表明,将其调整为TYPICAL通常是更合适的选择。CREATE TEMPORARY TABLESPACE语句不会通过日志同步到备库。这意味着,备库上的临时表空间可能需要手动创建和扩容。说到底,真正阻碍80%查询分流效果的,往往不是某个配置命令的语法错误。关键在于两处联动是否生效:一是READ_ONLY_ROUTING_LIST与客户端只读意图标识的配合;二是备库的I/O、内存等资源是否根据其“只读”的负载特征进行了重新规划和配置。忽略了这些,备库就难以发挥其应有的价值。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述