1. 前言:表结构不同步,生产事故反复上演
今天是第九天写博客了。
之前好几次生产环境升级,踩过不少数据库表结构同步的坑。每次只要业务版本变动大、SQL变更多,测试环境和生产环境的表结构就容易出现差异。最常见的情况就是:
- 测试环境加了新字段、建了新表
- 但上线时没把SQL同步到生产
- 结果生产一跑新代码就报错:“找不到字段”
- 排查起来又慢又累,最后还得被测试同事“刷绩效”,心里苦哈哈哈……
其实,这种问题本质上是数据库变更流程不规范、变更不可追溯导致的。
有没有办法能让表结构变更自动化、可视化、可回滚、可追溯?
于是我开始调研并尝试Flyway这样的数据库迁移管理工具。
2. Flyway是什么?
Flyway是一个开源的数据库版本管理工具(Database Migration Tool)。它可以帮助开发团队将所有的数据库变更(比如建表、改字段、加索引等)都以脚本的方式管理,并且自动执行、自动记录、自动回滚。
核心理念
- 所有变更都用SQL脚本管理
- 每个脚本都有唯一的版本号
- 每次项目启动或部署时,Flyway自动检测并执行尚未应用的脚本
- 数据库中的
flyway_schema_history表会记录所有已执行过的脚本和状态
支持多种数据库
MySQL、PostgreSQL、Oracle、SQL Server、SQLite 等主流数据库都支持。
3. 为什么Flyway能解决我的痛点?
3.1 不再漏同步
- 每一次表结构变更,都写成一个新的迁移脚本,比如
V1__init.sql、V2__add_user_email.sql - 无论多少环境(开发/测试/预发/生产),Flyway都会自动比对哪些脚本还没执行,逐一补齐
- 再也不会出现“测试有新字段,生产没同步”的情况
3.2 自动化、可追溯
- 每个变更脚本都有历史记录,谁加的、什么时候加的,一清二楚
- 可以随时回滚到某个历史版本
3.3 上线流程集成
- Flyway可以集成到SpringBoot等主流框架,每次应用启动时自动迁移
- 也可以在CI/CD流水线或独立命令行中运行
3.4 团队协作更规范
- 所有DDL/DML都统一写在
sql目录下,代码和数据结构一体化管理 - 新人入职拉下代码,一键迁移,环境一致性有保障
4. Flyway如何使用?(以SpringBoot+MySQL为例)
4.1 添加依赖
Maven项目:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>
Gradle项目:
implementation 'org.flywaydb:flyway-core'
4.2 配置数据源
在application.yml或application.properties中配置数据库信息:
spring: datasource: url: jdbc:mysql://localhost:3306/yourdb?useUnicode=true&characterEncoding=utf8 username: youruser password: yourpwd flyway: enabled: true locations: classpath:db/migration baseline-on-migrate: true
4.3 编写迁移脚本
在src/main/resources/db/migration目录下新建SQL文件:
V1__init.sql-- 初始化表结构V2__add_column.sql-- 增加字段V3__update_index.sql-- 修改索引
文件命名规则:
V[版本号]__[描述].sql
如:V2__add_user_email.sql
4.4 启动项目,自动迁移
每次启动SpringBoot项目时,Flyway会自动扫描所有未执行过的脚本,并顺序执行。
4.5 日志与回溯
- Flyway会在数据库里生成一张
flyway_schema_history表,记录所有已执行过的脚本和状态。 - 如果某个脚本出错,会自动中断,避免“半成功半失败”。
2万+

被折叠的 条评论
为什么被折叠?



