mail_go 部署在 MySQL 库上升级到含 P4 安全修复(BanEntry.IPAddress 升级为 uniqueIndex)的版本后启动即崩溃循环:
Error 1061 (42000): Duplicate key name 'idx_ban_entries_ip_address'
CREATE UNIQUE INDEX `idx_ban_entries_ip_address` ON `ban_entries`(`ip_address`)
数据库初始化失败: 数据库迁移失败
根因
旧模型 BanEntry.IPAddress 为普通 index 标签,AutoMigrate 在 ban_entries 上建成同名非唯一索引;
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
问题
mail_go部署在 MySQL 库上升级到含 P4 安全修复(BanEntry.IPAddress升级为uniqueIndex)的版本后启动即崩溃循环:根因
BanEntry.IPAddress为普通index标签,AutoMigrate 在ban_entries上建成同名非唯一索引;uniqueIndex后,gorm mysql 驱动(v1.5.7)MigrateColumnUnique对非唯一列无条件执行CREATE UNIQUE INDEX(该路径不检查HasIndex),与同名旧索引冲突报 Error 1061;AutoMigrate末尾按索引名查HasIndex的保护永远执行不到(逐列阶段先失败返回);dedupeBanEntries只清理重复行,不处理同名旧索引,因此从旧库升级的部署必然失败。修复
新增
dropLegacyBanIndex:在dedupeBanEntries之后、AutoMigrate之前,检测information_schema.statistics中idx_ban_entries_ip_address的non_unique=1并删除,由 AutoMigrate 重建为唯一索引。dedupeBanEntries风格一致,幂等。验证
生产库实测(服务停机 → 复现旧现场:删除唯一索引、重建同名非唯一索引 → 运行含补丁的迁移 → 索引重建为 UNIQUE、全部迁移完成),并已在生产部署观察运行正常。