如何在 MySQL 中执行数据库架构迁移(Schema Migration)
在 MySQL 中执行数据库架构迁移(Schema Migration),是指对数据库结构(表、索引、字段、触发器等)进行变更的一系列操作。这在持续交付、版本控制、团队协作和线上系统演进中尤为关键。
一、什么是“架构迁移”?
架构迁移 = 结构变更的可重复、可跟踪、可回滚执行过程。
示例场景:
- 添加字段、索引
- 拆分表结构
- 数据格式重构(如 INT → VARCHAR)
- 初始化系统默认配置
二、常见的架构迁移工具(推荐)
| 工具 | 语言 | 特点 |
|---|---|---|
| Flyway | Java | 简洁、成熟,广泛用于 SpringBoot 项目 |
| Liquibase | Java/XML | 强大、企业级支持,支持回滚 |
| dbmate | 多语言 | 轻量、跨平台 CLI,适合容器环境 |
| Phinx | PHP | Laravel/ThinkPHP 社区常用 |
| Alembic | Python | SQLAlchemy 搭配 Flask/Django |
✅ 自建 migrations 目录 + SQL 脚本 | 所有语言 | 最简单,但需自管版本与执行逻辑 |
三、推荐方法一:使用 Flyway(企业推荐)
1. 安装 Flyway
brew install flyway # macOS
choco install flyway # Windows
2. 初始化项目结构
flyway init
会创建:
flyway.conf
sql/
└─ V1__init_schema.sql
└─ V2__add_user_table.sql
3. 编写 SQL 脚本(命名规范)
-- sql/V1__init_schema.sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
4. 配置连接信息
编辑 flyway.conf:
flyway.url=jdbc:mysql://localhost:3306/mydb
flyway.user=root
flyway.password=secret
5. 执行迁移
flyway migrate
迁移记录会自动写入 flyway_schema_history 表中。
方法二:Laravel / Yii / ThinkPHP 内置迁移(PHP 项目推荐)
如 Laravel:
php artisan make:migration create_users_table
php artisan migrate
php artisan migrate:rollback
每个迁移都是一个 PHP 类,结构清晰。
方法三:自建 SQL 脚本 + Shell 执行
结构:
migrations/
001_init.sql
002_add_index.sql
003_alter_users_add_phone.sql
执行方式:
mysql -u root -p mydb < migrations/001_init.sql
建议记录“当前执行到第几步”至 schema_version 表,避免重复执行。
四、数据库迁移中的回滚策略
| 场景 | 回滚方法 |
|---|---|
| 添加列 | ALTER TABLE DROP COLUMN(需谨慎) |
| 改字段类型 | 先新建字段 → 数据迁移 → 替换原字段 |
| 删除表 | 建议备份为 .sql 文件或使用逻辑删除 |
| 使用 Flyway / Liquibase | 可定义 undo 脚本或 rollback 标签 |
五、部署环境推荐流程
- 所有架构迁移脚本纳入 Git 版本控制
- 所有变更通过 CI/CD 在测试环境验证
- PR 合并后,由 CD 流水线执行
flyway migrate(或等效) - 设置备份 & 审计策略
- 回滚策略明确(DDL 慎用)
六、注意事项(MySQL 特有)
| 建议 | 说明 |
|---|---|
避免大表直接 ALTER | 推荐 pt-online-schema-change 在线变更 |
| 保持 schema + data 解耦 | 架构迁移脚本只包含结构变更 |
| 禁止手动修改数据库 | 所有变更必须脚本化、版本化 |
| 考虑字段命名兼容性 | 避免 order 等保留字冲突 |
七、参考文档链接
- Flyway 官网文档
- Liquibase 官方文档
- Phinx 使用手册(PHP)
- pt-online-schema-change 在线变更工具(Percona)
- MySQL 官方 ALTER TABLE 文档
更多详细内容请关注其他相关文章!