标签:导致 password init 赋值 数据库 组件 config location 报错
flyway是一个数据库版本管理工具,集成进springboot后,每次系统升级启动时自动执行sql语句升级数据库,避免手动操作数据库。
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>
## 开启,默认开启 flyway.enabled=true ## sql 脚本的位置,默认为 classpath:db/migration。可手动指定 flyway.locations=classpath:db/sqlVersion ## 指定数据源,如果没有指定的话,将使用配置的主数据源 flyway.url=jdbc:mysql://10.0.192.10:3306/demo?useUnicode=true&useSSL=false&characterEncoding=utf8 flyway.user=repl flyway.password=root flyway.check-location=true # 如果数据库不是空表,需要设置成 true,否则启动报错 flyway.baseline-on-migrate=true #默认初始版本号为1 flyway.baseline-version=0
命名规则:源码默认初始版本号为V1,sql脚本版本号需大于1, sql脚本命名 :V版本号__名称.sql,
注:版本号后面为两条下划线,后续脚本版本号需大于当前最大版本号;
springboot启动时,加载flyway组件,执行sql脚本。
首次使用flyway,springboot启动时,会自动创建schema_version表,维护历史sql版本变更信息。
sql脚本执行顺序为:按版本号从小到大;
历史sql脚本一旦随springboot启动升级,无论脚本执行成功还是失败,后续开发不能再做修改,否则,springboot启动时由于校验到脚本文件有变更而导致报错,无法启动成功。
若同时升级多个版本,中间某个版本的脚本执行失败,则执行失败的脚本内操作会回滚,同时,后面的版本不会执行,而且springboot启动失败。
若脚本执行失败,需要及时处理解决,以下两种解决方式:
1:删除失败的版本记录,修改脚本,重新打包部署;
2:更新失败的版本信息字段 success为“1”即成功,新增正确的sql脚本,并赋值新的版本号,然后重新启动springboot, 启动时会忽略失败的版本,继续执行后面的版本;
schema_version表:
若同一个项目中有多个数据源需要进行版本管理,则需要放弃application.properties中的配置,
并且配置flyway.enabled=false,禁止springboot自动的调用flyway.migrate()方法。然后增加配置类,手动调用migrate()方法即可。
1 package cn.demo.test.config; 2 3 import javax.annotation.PostConstruct; 4 import javax.annotation.Resource; 5 import javax.sql.DataSource; 6 7 import org.flywaydb.core.Flyway; 8 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.context.annotation.Configuration; 10 11 @Configuration 12 public class FlywayDbInitializer { 13 14 @Resource 15 private DataSource dataSource;//系统中已经注入的数据源 16 17 @Resource 18 private DataSource dmDataSource;//多个数据源 19 20 @PostConstruct 21 public void migrateFlyway() { 22 23 Flyway alertFlyway = new Flyway(); 24 alertFlyway.setBaselineOnMigrate(true); 25 alertFlyway.setDataSource(dataSource); 26 alertFlyway.setSchemas("alert"); 27 alertFlyway.setLocations("db/alertVersion"); 28 alertFlyway.setValidateOnMigrate(false);//是否校验checksum值 29 alertFlyway.setIgnoreFailedFutureMigration(false); 30 // alertFlyway.setBaselineVersionAsString("1.1");//基准版本,<=1.1不会执行。 31 alertFlyway.migrate(); 32 Flyway dmFlyway = new Flyway(); 33 dmFlyway.setDataSource(dmDataSource); 34 dmFlyway.setBaselineOnMigrate(true); 35 dmFlyway.setSchemas("data_devops"); 36 dmFlyway.setLocations("db/dataDevopsVersion"); 37 dmFlyway.migrate(); 38 } 39 }
标签:导致 password init 赋值 数据库 组件 config location 报错
原文地址:https://www.cnblogs.com/itfeng813/p/14657415.html