所有表结构变更必须通过带版本号的SQL文件执行禁止直接在生产库运行ALTER命令每个文件仅含一个操作、严格编号、开头注明影响范围。MySQL表结构变更必须走SQL文件不能直接在生产库上ALTER线上表结构改了但没留痕等于没改——下次部署、回滚、新环境初始化全要抓瞎。核心原则所有CREATE、ALTER、DROP操作必须写成可执行的SQL文件按顺序编号存放像V001_add_user_email.sql、V002_alter_user_status.sql。常见错误现象mysql -e ALTER TABLE user ADD COLUMN phone VARCHAR(20)这种命令跑完就丢CI/CD里没法复现DBA查问题时连谁、什么时候、为什么加的字段都搞不清。每个SQL文件只做一件事比如只加一个字段或只改一个索引避免合并多个变更导致失败后难以定位文件名用严格递增版本号推荐V{yyyymmddhhmm}_{desc}.sql或V001_...别用Git commit hash——它不反映执行顺序SQL开头加注释说明影响范围例如-- 影响user表预计执行时间Liquibase vs Flyway选哪个取决于你有没有Java生态依赖两者都靠维护databasechangelog表来记录已执行脚本但集成方式和默认行为差异明显。没用Spring Boot优先看Flyway项目里已经用了spring-boot-starter-jdbc又想少配配置Liquibase对YAML/JSON变更支持更原生。使用场景对比Flyway默认只认V前缀的SQL文件命名规则硬但启动快、冲突少适合纯SQL团队Liquibase支持XML/YAML/JSON格式的逻辑变更如addColumn能跨数据库抽象但运行时多一层解析出错信息更难读都支持undoFlyway CE版不支持Liquibase需手动写rollback块但生产环境慎用——ROLLBACK不是万能的删列、改类型大概率不可逆ALTER TABLE卡住或超时先查information_schema.INNODB_TRX再动手执行ALTER TABLE时连接挂起、应用报Lock wait timeout exceeded八成不是SQL写错了而是有长事务占着表没释放。MySQL 5.7 的INNODB_TRX表能立刻告诉你谁在挡路。 灵办AI 免费一键快速抠图支持下载高清图片