上一篇
场景还原:
凌晨2点,你正喝着第三杯咖啡准备切换数据库容灾环境,突然发现Data Guard的SQL Apply进程像卡死的电梯一样——STOP APPLY
命令敲了七八遍,日志里反复刷着刺眼的ORA-16761: unable to stop SQL Apply
,更糟的是,服务器在海外机房,物理接触?不存在的。
别慌,这份实战指南能帮你远程"撬开"这个顽固的SQL Apply。
根据2025年8月Oracle官方文档更新,ORA-16761本质是协调进程(Coordinator Process)与控制进程(Reader/Applier)通讯异常,常见诱因:
事务追赶陷阱
资源死锁
元数据冲突
DBA_*
表) -- 1. 先尝试官方推荐操作(可能失败但必须试) ALTER DATABASE STOP LOGICAL STANDBY APPLY IMMEDIATE; -- 2. 如果卡住,另开会话强杀协调进程 SELECT sid, serial# FROM v$session WHERE program LIKE '%LSP%'; ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; -- 3. 终极手段:重启Logminer服务(11g及以上版本有效) ALTER DATABASE STOP LOGICAL STANDBY APPLY FORCE;
💡 小技巧:用
nohup
后台执行避免SSH超时中断
通过备库执行:
-- 检查残留进程(重点观察状态为KILLED的进程) SELECT program, status FROM v$session WHERE program LIKE '%LSP%' OR program LIKE '%ORA%APPLIER%'; -- 手动清理(需sysdba权限) BEGIN FOR p IN (SELECT sid, serial# FROM v$session WHERE status='KILLED') LOOP EXECUTE IMMEDIATE 'ALTER SYSTEM KILL SESSION '''||p.sid||','||p.serial#||''' IMMEDIATE'; END LOOP; END; /
在主库执行:
-- 找出阻塞事务(重点关注持续时间>1小时的事务) SELECT l.session_id, s.program, s.machine, (SYSDATE - s.LOGON_TIME)*24*60 "Minutes", l.used_ublk FROM v$transaction t, v$session s, v$locked_object l WHERE t.ses_addr = s.saddr AND t.xidusn = l.xidusn ORDER BY "Minutes" DESC; -- 联系业务方提交/回滚,或DBA强制处理 ALTER SYSTEM KILL SESSION '阻塞会话ID,SERIAL#' IMMEDIATE;
确认无残留进程后:
-- 先启动Logminer服务(11g+) ALTER DATABASE START LOGMINER; -- 再启动应用(建议指定延迟分钟数) ALTER DATABASE START LOGICAL STANDBY APPLY NEW PRIMARY 10;
监控策略
V$LOGSTDBY_STATE
中的APPLY_LAG
资源管控
-- 限制SQL Apply内存使用(根据备库配置调整) ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR ASYNC MAX_FAILURE=3 REOPEN=300 MEMORY_MAX=4G MEMORY_TARGET=2G';
版本纪律
最后的忠告:如果反复出现ORA-16761,建议主库开启SUPPLEMENTAL LOGGING
减少事务冲突:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;
SQL Apply不是真的无赖——它只是比你更执着于数据一致性。
本文由 弭丹彤 于2025-08-02发表在【云服务器提供商】,文中图片由(弭丹彤)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/518177.html
发表评论