第十三节 使用Flyway管理线上数据库
一、Flyway解决的问题
Flyway用于解决线上数据库的结构问题。一般项目都会分期,一期二期三期。
随着项目的推进,上线后的数据库结构也可能也会有所变动。因此,需要使用Flyway来解决数据库变动的问题。
修改生产上的数据库不可能像我们在开发的时候那么草率,需要明确的数据库变动SQL文件。
Flyway就用于解决上述问题。
Flyway优点:明确数据库变动SQL文件
Flyway缺点:支持MySQL,但是不支持Oracle。如果你的生产库只有MySQL,那么可以使用Flyway。
我再推荐一款数据库工具,名字叫Liquibase,能够支持MySQL与Oracle脚本管理。
二、使用Flyway
第一步:首先导入依赖。
<properties>
<flyway.version>5.2.4</flyway.version>
</properties>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>${flyway.version}</version>
</dependency>
<plugin>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>${flyway.version}</version>
</plugin>
第二步:在yml配置文件中配置Flyway参数。重点是下面的配置中的locations属性,它决定了SQL文件所在路径。
#dev分支配置内容
spring:
flyway:
baseline-on-migrate: true
clean-disabled: true
locations: classpath:/flyway/dev
out-of-order: true
#test分支配置内容
spring:
flyway:
baseline-on-migrate: true
clean-disabled: true
locations: classpath:/flyway/test
out-of-order: true
#pro分支配置内容
spring:
flyway:
baseline-on-migrate: true
clean-disabled: true
locations: classpath:/flyway/pro
out-of-order: true
第三步:根据上述配置的locations指定的位置,创建文件夹。如图所示
第四步:新建脚本。命名规则我推荐为 : V版本号__数据库名称,例如 V1.0.1__basessm.sql。注意,是双下划线。
比如下一个文件V1.0.1__basessm.sql
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of t_student
-- ----------------------------
INSERT INTO `t_student` VALUES ('1', '开发库大宇', '22');
INSERT INTO `t_student` VALUES ('2', '开发库小宇', '20');
启动项目,效果如GIF所示。
第五步:模拟线上修改数据库结构。
假设刚才操作的t_student表在二期要修改结构,增加一列 电话 telephone 列。并且增加一张t_cost费用表.
我们可以定义一个文件叫做 V1.0.2__basessm.sql,版本号增加1。
V1.0.2__basessm.sql文件如下:
ALTER TABLE t_student ADD telephone VARCHAR(255);
DROP TABLE IF EXISTS `t_cost`;
CREATE TABLE `t_cost` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`age` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
如上述效果图所示,在原有的V1.0.1__basessm.sql文件的基础之上,数据库执行了V1.0.2__basessm.sql中变动的SQL语句。这样,我们就能够轻松的修改已经在生产上的数据的结构了。
三、源码下载
本章节项目源码:点我下载源代码