ORA-03135超时源于DBLINK刷新时远程会话中断,主因是SQLNET.EXPIRE_TIME探测或收发超时触发断连;须调大服务器端sqlnet.ora中EXPIRE_TIME、SEND/RECV_TIMEOUT参数并重启监听器,或改用COMPLETE刷新兜底。

DBLINK刷新失败时,ORA-03135 是最常见超时信号
看到 ORA-03135: connection lost contact 或 ORA-12170: TNS: Connect timeout occurred,基本可确认是远程连接在刷新过程中中断,而非物化视图逻辑错误。这类问题不会触发 ORA-12008,但会导致刷新直接中止、STALENESS 长期为 'STALE',且 DBA_MVIEWS.LAST_REFRESH_DATE 停滞不更新。
根本原因不是“网络不稳定”,而是 Oracle 在执行跨 DBLINK 的 FAST 刷新时,会持续持有一个远程会话并拉取日志变更(如通过 MLOG$_ 表),一旦单次 RPC 超过 SQLNET.EXPIRE_TIME 或远程库响应延迟波动,连接就被底层协议强制断开。
- 不要依赖客户端重试:DBMS_MVIEW.REFRESH 默认不重连,失败即停,不会自动续传中断的增量
- DBLINK 本身连得通 ≠ 刷新能跑通:用
SELECT * FROM dual@remote_db只验证基础连通性,无法模拟物化视图刷新时的长事务+多轮查询行为 - 远程库版本差异会放大超时风险:例如本地 19c 向 10.2.0.5 拉数据时,协议协商和日志解析更耗时,更容易触达超时阈值
必须调大 SQLNET.ORA 的两个超时参数
仅改应用侧连接串或 DBLINK 定义无效,真正起作用的是数据库服务器端的 sqlnet.ora 文件(位于 $ORACLE_HOME/network/admin/)。需同步修改两处:
-
SQLNET.EXPIRE_TIME = 0:禁用死连接探测。设为非零值(如 10)会让 Oracle 每 10 分钟发一个 probe 包,而跨 DBLINK 刷新期间若无数据交互,probe 失败即断连 -
SQLNET.SEND_TIMEOUT = 0和SQLNET.RECV_TIMEOUT = 0:关闭发送/接收级超时。Oracle 12c+ 支持设为 0(无限等待),旧版本最低设为 600(10 分钟)
改完必须重启监听器:lsnrctl stop && lsnrctl start;仅 reload 不生效。注意:这些参数影响所有经该监听器的连接,需评估对其他业务的影响。
用 REFRESH COMPLETE 替代 FAST 是最稳的兜底方案
跨 DBLINK 场景下,FAST 刷新本质不可靠——它要求远程库实时提供精确的变更记录(snaptime$$、sequence$$),而网络抖动、远程库负载高、甚至远程日志表统计信息过期,都会让本地端读不到完整增量,最终超时或报 ORA-02063(preceding line from xxx)。
- 显式指定
method => 'C':避免默认走 FAST 导致静默失败,EXEC DBMS_MVIEW.REFRESH('SCOTT.MV_REMOTE_SALES', method => 'C') - 配合
atomic_refresh => FALSE:防止大刷新卡在远程事务提交环节,本地先TRUNCATE再分批INSERT /*+ APPEND */,降低单次网络交互压力 - 若远程表极大,考虑加
parallelism => 2:并行拉取数据,但需确保远程库未限制并行度(查PARALLEL_MAX_SERVERS)
代价是刷新窗口变长、远程库负载升高,但胜在确定性高——只要连接不断,就能刷完。
监控与主动降级:别等超时才响应
生产环境不能靠“刷着看”。应在定时任务中嵌入超时检测和自动降级逻辑:
- 用
V$SESSION_LONGOPS监控刷新进度:执行前记下SID,之后每 30 秒查一次TIME_REMAINING > 300(超 5 分钟未完成),就主动中止并切到 COMPLETE - 捕获
ORA-03135后立即 purge 远程日志:运行EXEC DBMS_MVIEW.PURGE_LOG@remote_db('SALES', 1),清掉已失效的旧快照点,避免下次刷新再从头拉 - 定期检查远程日志索引:远程库上必须有
CREATE INDEX idx_mlog_snap_seq ON MLOG$_SALES (snaptime$$, sequence$$),否则本地端全表扫描日志表极易超时
真正难处理的不是超时本身,而是远程库不可控——你没法强制对方升级、调参或建索引。所以设计之初就要把跨 DBLINK 刷新当作“弱一致性通道”,接受一定延迟,并预留手工补刷机制。


















