Flyway 是一个强大的数据库版本控制和迁移工具,主要用于管理数据库结构的变更和演进。
核心作用
1. 数据库版本控制
- 追踪数据库变更:记录每次数据库结构的修改
- 版本管理:为每个变更分配版本号
- 变更历史:完整记录数据库演进过程
2. 自动化数据库迁移
- 脚本执行:自动执行SQL迁移脚本
- 顺序控制:确保迁移脚本按正确顺序执行
- 状态跟踪:记录哪些脚本已执行,哪些待执行
主要功能特点
📁 迁移脚本管理
src/main/resources/db/migration/
├── V1__Create_user_table.sql
├── V2__Add_email_column.sql
├── V3__Create_order_table.sql
└── V4__Add_index_on_user_email.sql
命名规则
- V + 版本号 + 双下划线 + 描述
- 例:
V1.0.1__Create_user_table.sql
🔄 迁移类型
Versioned Migrations(版本迁移)
- 不可逆的结构变更
- 每个版本只执行一次
- 用于:创建表、添加列、修改结构
Repeatable Migrations(可重复迁移)
- 可重复执行的脚本
- 基于校验和判断是否需要重新执行
- 用于:视图、存储过程、函数
🎯 核心优势
1. 环境一致性
- 开发环境 → 测试环境 → 生产环境
- 确保所有环境数据库结构完全一致
- 避免环境差异导致的问题
2. 团队协作
- 多人开发:避免数据库变更冲突
- 代码审查:SQL变更也可进行代码审查
- 版本同步:团队成员数据库保持同步
3. 部署自动化
- CI/CD集成:自动化部署流程
- 零停机部署:支持滚动更新
- 回滚支持:可以回退到指定版本
工作原理
1. 元数据表
Flyway在数据库中创建 flyway_schema_history
表:
-- 记录迁移历史
CREATE TABLE flyway_schema_history (
installed_rank INT NOT NULL,
version VARCHAR(50),
description VARCHAR(200),
type VARCHAR(20) NOT NULL,
script VARCHAR(1000) NOT NULL,
checksum INT,
installed_by VARCHAR(100) NOT NULL,
installed_on TIMESTAMP NOT NULL,
execution_time INT NOT NULL,
success BOOLEAN NOT NULL
);
2. 执行流程
- 扫描迁移脚本目录
- 比较脚本与历史记录
- 执行未执行的脚本
- 记录执行结果到元数据表
使用场景
🏢 企业级应用
- 微服务架构:每个服务独立管理数据库
- 多环境部署:开发、测试、预生产、生产
- 持续集成:自动化测试和部署
📊 数据库演进
- 表结构变更:添加/删除字段、修改类型
- 索引管理:创建/删除索引优化性能
- 数据迁移:历史数据清理和转换
- 权限管理:用户和角色权限调整
🔧 开发流程集成
# application.yml 配置示例
spring:
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true
validate-on-migrate: true
支持的数据库
- PostgreSQL(您项目使用的)
- MySQL/MariaDB
- Oracle
- SQL Server
- SQLite
- DB2
- H2等
与项目的关系
Flyway可以:
1. 管理PostgreSQL结构
- K8s资源管理相关表结构
- 用户权限和配置表
- 日志和监控数据表
2. 支持微服务部署
- 自动化数据库初始化
- 支持容器化部署
- 与Spring Boot完美集成
3. 团队协作效率
- 数据库变更版本化
- 减少环境配置差异
- 简化部署流程
总结:Flyway是现代应用开发中不可或缺的数据库版本控制工具,特别适合企业级和微服务项目,能显著提升开发效率和部署可靠性。