上一篇
场景引入
凌晨三点,你正睡得迷迷糊糊,突然被一阵急促的警报声惊醒,摸过手机一看,监控系统提示生产库出现ORA-32586错误,同步程序已经卡了半小时,你一边骂骂咧咧地爬起来开电脑,一边回忆:"昨天明明只加了最小补充日志啊,怎么突然冲突了?"
别慌,这种因重复配置补充日志导致的报错很常见,下面我们就来拆解这个磨人的小妖精。
错误信息
ORA-32586: 补充日志属性重复指定
触发场景
当执行以下操作时容易踩坑:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA
本质原因
Oracle不允许对同一日志属性重复定义,比如已经设置了全表补充日志,又试图为特定表添加相同的日志类型。
-- 查看现有补充日志配置 SELECT supplemental_log_data_min min_log, supplemental_log_data_pk pk_log, supplemental_log_data_ui ui_log, supplemental_log_data_fk fk_log, supplemental_log_data_all all_log FROM v$database;
如果报错出现在执行类似以下语句时:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS; -- 冲突示例
说明已经存在PRIMARY KEY
级别的补充日志。
需要覆盖原有配置
先删除原有配置再重新添加:
-- 移除冲突配置 ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS; -- 重新添加(如需) ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
误操作导致的多余配置
-- 清理所有补充日志(慎用!会影响同步服务) ALTER DATABASE DROP SUPPLEMENTAL LOG DATA ALL; -- 按需重新配置最小日志(推荐基础配置) ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
当需要通过跳板机操作时,注意这些细节:
v$database
视图 SPOOL /tmp/log_fix_32586.log -- 你的操作语句 SPOOL OFF
标准化脚本:团队统一使用以下模板
-- 先检查再操作 DECLARE v_count NUMBER; BEGIN SELECT COUNT(*) INTO v_count FROM v$database WHERE supplemental_log_data_pk = 'YES'; IF v_count = 0 THEN EXECUTE IMMEDIATE 'ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS'; END IF; END; /
变更窗口原则
这个报错实际是Oracle的保护机制,补充日志会显著增加redo量,重复配置可能导致:
最后提醒
遇到32586报错时,先喝口水冷静下,这错误看起来吓人,其实就像衣服穿反了——脱下来重新穿就好,记得操作前备份控制文件,祝大家永远不被凌晨告警吵醒!
(本文操作验证环境:Oracle 19c,更新时间参考2025年8月)
本文由 苌正文 于2025-08-01发表在【云服务器提供商】,文中图片由(苌正文)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/508497.html
发表评论