首页 / 数据库

MySQL 结构变更怎么管:从裸 SQL 到 Git 化

数据库2026-10-25

早期我做表结构变更,基本是连上生产库直接敲一条 ALTER,改完就忘了。直到有一次本地和线上结构对不上、数据追平出了乱子,我才下决心把数据库变更也纳入工程化管理。

一、每一次变更都写成脚本

现在任何加表、加字段、建索引,都先写成一个带注释的 SQL 脚本,按日期和用途命名,例如:

-- 2026-11-12 增加分享令牌表
CREATE TABLE issue_shares (
  id          BIGINT PRIMARY KEY AUTO_INCREMENT,
  token       VARCHAR(64) NOT NULL,
  issue_id    BIGINT NOT NULL,
  expire_at   DATETIME NOT NULL,
  INDEX idx_token (token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

脚本即文档:半年后回头看,也知道那天到底动了什么。

二、变更前先备份,再动手

这是铁律。任何结构性操作之前,先 mysqldump 整库备份一次,命名带上时间戳。真改坏了,退回去就是一条命令的事。我为此还专门保留了一份“改前备份”目录。

教训:曾经发生过“只把文件落到运行目录、没真正入库”的事故。现在改完必做内容级核对——确认运行态和入库版本逐字节一致,避免“以为上了、其实没上”。

三、用 Git 管理变更,而不是靠记忆

这些 SQL 脚本和后端代码一起进版本库,分 develop(日常)和 main(正式)两个分支。谁、什么时候、为什么改,提交记录一清二楚。正式部署前必须先让客户确认,再合并到 main。

四、同步纪律:本地不是线上

本地工程目录不是 git 工作区,推送服务器要走固定脚本。最坑的一次是:本地还是旧版,一推送把线上的新版本“顶”了回去。所以推送前必须先做内容比对,确认本地确实是最新的再动。

五、大表变更要温柔

几万行以上的表直接 ALTER 会锁表。能用 ALGORITHM=INPLACE 的就用,加索引尽量在线做;实在避免不了的长操作,挑低峰期、先在小表验证语法。

把数据库当代码管之后,最大的收获是“睡得着觉”。下一篇聊聊性能——结构对了,还得跑得快。

← 返回首页