60 lines
2.9 KiB
Markdown
60 lines
2.9 KiB
Markdown
<ArticleMetadata />
|
||
|
||
# 一、简介
|
||
  Flyway 是一个开源的数据库版本控制工具,它极大地简化了数据库的迁移和版本管理。它的核心思想是像**用 Git 管理代码一样来管理数据库的结构**。
|
||
|
||
# 二、原理
|
||
  Flyway 通过在数据库中创建一个名为 flyway_schema_history的特殊表来工作
|
||
| 列名 | 含义 |
|
||
| - | - |
|
||
| installed_rank | 执行顺序 |
|
||
| version | 脚本的版本号 |
|
||
| description | 脚本的描述 |
|
||
| type | 脚本类型(通常是 SQL) |
|
||
| script | 脚本文件名 |
|
||
| checksum | 脚本文件的校验和(用于检测篡改) |
|
||
| installed_by | 执行人 |
|
||
| installed_on | 执行时间 |
|
||
| execution_time | 执行耗时(毫秒) |
|
||
| success | 是否成功 |
|
||
|
||
  工作流程:
|
||
1. 应用启动时,Flyway 会检查配置的数据库路径。
|
||
2. 检查目标数据库中的 flyway_schema_history表。
|
||
3. 将数据库路径下的迁移脚本与 flyway_schema_history表中的记录进行对比。
|
||
4. 按照版本号顺序执行那些尚未执行的迁移脚本。
|
||
5. 执行成功后,将记录插入 flyway_schema_history表。
|
||
|
||
## 2.1 校验和计算
|
||
  Flyway 使用 CRC32 算法 计算 SQL 脚本文件的校验和(Checksum)。Javs使用32位有符号整数存储,因此有时会得到负数。可以通过`mvn flyway:info`查看每个脚本的校验和。
|
||
|
||
# 三、与SpringBoot集成
|
||
## 3.1 添加依赖
|
||
```xml
|
||
<dependency>
|
||
<groupId>org.flywaydb</groupId>
|
||
<artifactId>flyway-core</artifactId>
|
||
</dependency>
|
||
```
|
||
|
||
## 3.2 配置数据源
|
||
```yml
|
||
spring:
|
||
flyway:
|
||
enabled: true
|
||
locations: classpath:db/migration
|
||
baseline-on-migrate: true # 如果数据库非空,且无 flyway_schema_history 表,则先创建基线版本
|
||
```
|
||
  `baseline-on-migrate: true`,当数据库已经存在数据,但是没有flyway_schema_history表时,Flyway会插入一条基线数据,并标记为1.0版本,则后续的迁移脚本只会执行比1.0版本更高的数据库文件。
|
||
  **如果设置为false,如果数据库已经存在数据时,Flyway会报错。**
|
||
  因此需要避免这种情况的存在,在**初始发布应用时,要保证数据库为空**。
|
||
|
||
## 3.3 创建数据库脚本
|
||
  在项目的资源目录 src/main/resources下创建文件夹 db/migration。
|
||
  Flyway 的 SQL 脚本文件名有严格的命名规则:`V<Version>__<Description>.sql`
|
||
  例如V1.0.0_001__20251027.sql,表示v1.0.0版本的第一个sql,日期为2025年10月27日。
|
||
  **创建了迁移脚本,一旦应用,就不可修改,否则会导致校验错误。如果确实要修改,请再创建一个脚本。**
|
||
|
||
## 3.4 启动程序
|
||
  启动程序后。Flyway会自动在数据库中创建flyway_schema_history表,然后扫描db/migration目录下的所有脚本,按顺序执行sql文件,并记录到flyway_schema_history表中。
|