如何使用Flyway为Micronaut双数据源应用实现差异化数据库迁移
Micronaut 多数据源 Flyway 独立迁移配置方法
按以下步骤配置即可实现不同数据源加载独立迁移脚本,不需要自定义扩展:
1. 拆分迁移脚本目录
先把原来单数据源统一放在resources/db/migration下的脚本,按数据源拆分到独立子目录,参考结构:
src/main/resources/ └── db/ └── migration/ ├── common/ # 放两个库都需要执行的公共脚本(可选) ├── biz/ # 第一个业务库专属脚本 │ └── V1__init_biz_table.sql │ └── V2__load_biz_base_data.sql └── log/ # 第二个日志库专属脚本 └── V1__init_log_table.sql └── V2__load_log_init_data.sql
两个独立目录下的脚本版本号不需要全局唯一,Flyway会在每个数据库中维护独立的版本历史表,互不干扰。
2. 按数据源绑定Flyway配置
Micronaut的Flyway配置是和数据源强绑定的,不要把Flyway配置写在全局配置节点,要嵌套在对应数据源的配置下,为每个数据源单独指定脚本扫描路径即可。
以两个数据源名称分别为default(业务库)、log(日志库)为例,application.yml配置参考:
datasources: default: url: jdbc:mysql://127.0.0.1:3306/biz_db driverClassName: com.mysql.cj.jdbc.Driver username: db_user password: db_pwd flyway: enabled: true # 先加载公共脚本,再加载业务库专属脚本 locations: classpath:db/migration/common,classpath:db/migration/biz log: url: jdbc:mysql://127.0.0.1:3306/log_db driverClassName: com.mysql.cj.jdbc.Driver username: db_user password: db_pwd flyway: enabled: true # 先加载公共脚本,再加载日志库专属脚本 locations: classpath:db/migration/common,classpath:db/migration/log
常见踩坑点
- 多数据源场景下必须显式给每个数据源指定
flyway.locations,如果不配置,所有数据源都会默认扫描classpath:db/migration根目录下的脚本,会出现脚本误执行、表不存在的报错 - 不要把Flyway配置写在根级的
flyway.*节点下,该配置仅对单数据源场景生效,多数据源下会出现配置不生效的问题 - 每个数据源启动时会自动在自身库内创建
flyway_schema_history表记录迁移进度,不需要手动建表,也不需要手动指定不同的历史表名 - 配置locations时多个路径用英文逗号分隔,Flyway会按路径书写顺序依次扫描执行脚本,注意把公共依赖的脚本路径写在前面。
内容的提问来源于stack exchange,提问作者user1555190
相关产品推荐
相关产品推荐

