You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS RDS MySQL数据库重启后新增表列丢失问题咨询

问题背景

在AWS RDS MySQL Community版环境中,对业务表新增字段适配新功能时出现异常:每次数据库重启后,之前新增的列都会丢失,直接导致应用崩溃。
当前已知操作与现象:

  • 新增列通过两种方式执行:通过IntelliJ内置数据库工具执行、直接运行ALTER SQL脚本执行
  • 新增列使用的示例SQL:
alter table visit
    add isVisited tinyint default 0 not null;
  • 执行修改后,IntelliJ自动生成的visit表DDL如下:
-- auto-generated definition by intellij
create table visit
(
    id        int auto_increment primary key,
    date      datetime          not null,
    viewed    tinyint           not null,
    visitorId int               null,
    visitedId int               null,
    isVisited tinyint default 0 not null,
    constraint FK_18daeb99ad85ecca82a004588c5
        foreign key (visitorId) references users (id)
            on delete cascade,
    constraint FK_93cd362609c51b64018127a1048
        foreign key (visitedId) references users (id)
            on delete cascade
);
  • 数据库由其他开发人员完成初始创建与配置,初步排查未发现明显配置异常。
根因排查方向(按出现概率从高到低排序)
  • 连接对象错误,操作打到了只读副本
    执行SELECT @@read_only, @@super_read_only;查看当前实例的只读状态,如果两个参数返回值均为1,说明你连的是只读副本而非主实例。只读副本的表结构完全通过主库binlog同步维护,你在副本上手动执行的DDL不会同步到主库,一旦副本重启、或者主从同步触发表级结构重放,你手动加的字段就会被主库的原始表结构覆盖,直接消失。这种情况直接切换到主实例的可写端点执行DDL即可解决。
  • IDE本地缓存误导,DDL实际未执行成功
    不要完全信任IntelliJ数据库面板展示的表结构,这类GUI工具普遍存在本地元数据缓存。很多时候ALTER操作因为元数据锁等待、权限不足、外键约束冲突执行失败,IDE没有正确捕获抛出错误,反而展示本地缓存的修改后结构,让你误以为修改已经落库,实际上数据库里根本没有新增字段。重启实例后IDE缓存清空,就会展示真实的表结构。
    验证方式很简单:执行完DDL后,直接通过mysql命令行连接实例,执行SHOW CREATE TABLE visit;确认字段是否真实存在即可。
  • 实例配置了启动时自动执行的初始化脚本
    到RDS控制台检查当前实例绑定的参数组、选项组,排查是否配置了实例启动时自动执行的自定义SQL脚本。如果之前的开发人员在脚本中写了表结构重建、恢复初始库表的逻辑,每次实例重启都会把表还原到初始状态,新增的列自然会丢失。
  • 表使用了非持久化存储引擎
    执行SHOW TABLE STATUS WHERE Name='visit';查看visit表使用的存储引擎,如果是配置异常的第三方非持久化引擎,可能出现元数据修改无法落盘的问题,标准InnoDB、MyISAM引擎不会存在这类问题。

内容的提问来源于stack exchange,提问作者Tim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:45:35