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
相关产品推荐
相关产品推荐

