如何在 MySQL 中执行数据库架构迁移(Schema Migration)
                           
天天向上
发布: 2025-07-06 13:40:43

原创
108 人浏览过

在 MySQL 中执行数据库架构迁移(Schema Migration),是指对数据库结构(表、索引、字段、触发器等)进行变更的一系列操作。这在持续交付、版本控制、团队协作和线上系统演进中尤为关键。


一、什么是“架构迁移”?

架构迁移 = 结构变更的可重复、可跟踪、可回滚执行过程。

示例场景:

  • 添加字段、索引
  • 拆分表结构
  • 数据格式重构(如 INT → VARCHAR)
  • 初始化系统默认配置

二、常见的架构迁移工具(推荐)

工具语言特点
FlywayJava简洁、成熟,广泛用于 SpringBoot 项目
LiquibaseJava/XML强大、企业级支持,支持回滚
dbmate多语言轻量、跨平台 CLI,适合容器环境
PhinxPHPLaravel/ThinkPHP 社区常用
AlembicPythonSQLAlchemy 搭配 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 标签

五、部署环境推荐流程

  1. 所有架构迁移脚本纳入 Git 版本控制
  2. 所有变更通过 CI/CD 在测试环境验证
  3. PR 合并后,由 CD 流水线执行 flyway migrate(或等效)
  4. 设置备份 & 审计策略
  5. 回滚策略明确(DDL 慎用)

六、注意事项(MySQL 特有)

建议说明
避免大表直接 ALTER推荐 pt-online-schema-change 在线变更
保持 schema + data 解耦架构迁移脚本只包含结构变更
禁止手动修改数据库所有变更必须脚本化、版本化
考虑字段命名兼容性避免 order 等保留字冲突

七、参考文档链接


更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *