大家好,欢迎来到IT知识分享网。
一、简介
1.1 Flyway是什么?
1.2 为什么使用Flyway?
1.3 Flyway的工作原理
1.3.1 Flyway的校验版本号算法
1.3.2 Flyway的锁机制
Flyway使用数据库锁机制(locking technology of your database)来协调多个节点,从而保证多套应用程序可同时执migration,而且集群控制也可做配置。基于数据库锁机制实现分布式锁有两种,基于数据库表和基于数据库排他锁,Flyway采用的是基于数据库排他锁。
排他锁(Exclusive Locks,简称X锁),又称为写锁、独占锁,在数据库管理上,是锁的基本类型之一。若 事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放 A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A
源码如下:
@Override public <T> T lock(Table table, Callable<T> callable) {
if (database.isPxcStrict()) {
return super.lock(table, callable); } return new MySQLNamedLockTemplate(jdbcTemplate,table.toString().hashCode()).execute(callable); }
@Override protected void doLock() throws SQLException {
jdbcTemplate.execute("SELECT * FROM " + this + " FOR UPDATE"); }
private boolean tryLock() throws SQLException {
return jdbcTemplate.queryForInt("SELECT GET_LOCK(?,10)", lockName) == 1; }
1.3.3 Flyway连接数据库
flyway使用JDBC连接数据库
private boolean hasUserVariableResetCapability() {
try {
jdbcTemplate.queryForStringList(userVariablesQuery); return true; } catch (SQLException e) {
LOG.debug("Disabled user variable reset as " + (database.isMariaDB() ? USER_VARIABLES_TABLE_MARIADB :USER_VARIABLES_TABLE_MYSQL)+ "cannot be queried (SQL State: " + e.getSQLState() + ",Error Code: " + e.getErrorCode() + ")"); return false; } }
1.3.4 Flyway的启动速度
二、Flyway的使用
2.1 添加依赖
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>6.5.7</version> </dependency>
2.2 添加配置
java spring: flyway: #是否启用 enabled: true # 可以支持多个location, 用','隔开 locations: classpath:db/migration #是否创建元数据表 validate-on-migrate: true # flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。 clean-disabled: true # 如果数据库不是空表,需要设置成 true,否则启动报错 baseline-on-migrate: true # 版本控制日志表,默认flyway_schema_history,不同系统建议修改数据 # table: flyway_schema_history
2.3 创建sql文件
2.4 启动项目即可
三、Flyway详解
3.1 命令行
1.常用命令Migrate, Clean, Info, Validate, Baseline, Repair。
2.Migrate是指把数据库默认数据库迁移到最新版本。
3.Clean这个命令会清除指定库下所有的对象,包括table、view、triggers…,让数据库变成空的状态。
4.info用于打印所有Migrations的详细和状态信息。
5.Validate是指验证已经应用的Migrations是否有变更,Flyway是默认是开启验证的。
6.Baseline针对已经存在表结构的数据库的一种解决方案,即实现在非空数据库中新建Metadata表,并把Migrations应用到该数据库。
7.Repair操作能够修复Metadata表,该操作在Metadata表出现错误时是非常有用的。
3.2 配置行
3.3 执行方式
3.4 sql脚本命名规则
前缀:用于版本控制(可配置)、撤消(可配置)和可重复迁移(可配置)VUR) 版本:带有点或下划线的版本可根据需要分隔任意数量的部分(不适用于可重复的迁移) 分隔符:(两个下划线)(可配置)__) 说明:下划线或空格分隔单词 后缀:(可配置.sql) (可选)版本控制 SQL 迁移还可以省略分隔符和说明
四 开发时注意事项
If you removed this migration intentionally, run repair to mark the migration as deleted.
五、部署上线时注意事项
- 如果不手动创建元数据表,则需要进行以下配置,用于自动创建
validate-on-migrate: true
If you removed this migration intentionally, run repair to mark the migration as
deleted. - 如果数据库不是空表,则需进行以下配置,否则启动报错
baseline-on-migrate: true - clean命令会删除数据库中所有表,包括数据,结构等,这是不合理的,所以需要进行以下配置
clean-disabled: true (该配置由于默认值不合理,所以在V9版本中修改默认值由false为true) - 使用flyway要注意版本兼容问题,springboot与flyway,flyway与数据库版本,否则启动报错
- 如果启动的时候像忽略某些迁移文件,可进行以下参数配置
baseline-version=,以忽略 版本以及之前的所有 migration - 多人开发中,如果一个人提交V2一个人提交V1,而V2先入库执行了,那么V1入库就不会执行,如
果需要执行则需进行如下配置,但是不建议这么做
out-of-order=true
六、 支持的数据库版本
Extract MySQL code to plugin. This will need to be added as a new dependency.
flyway的8.2.1版本移除mysql的解决方案,增加依赖:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-mysql</artifactId> </dependency>
七、总结
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129569.html