迁移数据库可以说是日常工作中的家常便饭,但是万一不小心把数据库炸了,那就麻烦大了(不做,你将不得不承担责任)。随着数据量的逐渐增加和表结构的变化,数据库的各种迁移和升级势在必行。因此,拥有一个好的迁移工具可以极大地提高工作效率,并且可以在很大程度上避免人工操作造成的错误或数据损坏和丢失的风险。今天,移民哥就给大家介绍这样一款数据库迁移神器。Flyway简介flyway是一款敏捷的数据库迁移工具。它使用Java开发,支持所有与JDBC兼容的数据库。主要用于在你的应用版本不断升级的同时升级你的数据库结构和里面的数据。Flyway特点简单:简单易学,通过不同版本的SQL脚本实现数据库迁移。专业:专注于数据库迁移功能,您无需担心任何问题。功能强大:支持多种数据库,拥有大量第三方工具,支持CI/DI。工作平台Windows、macOS、Linux、Docker、Java和Android支持的构建工具Maven和Gradle支持的数据库Oracle、SQLServer、DB2、MySQL、AuroraMySQL、MariaDB、PerconaXtraDBCluster、PostgreSQL、AuroraPostgreSQL、Redshift、CockroachDB、SAPHANA,SybaseASE,Informix,H2,HSQLDB,Derby,SQLite,FirebirdFlyway工作原理一开始,你将Flyway指向一个空数据库:它会搜索schema历史表,如果此时数据库为空,FlyWAY会自动创建一个历史表,现在你有一个只包含空表flyway_schema_history(默认)的数据库。flyway_schema_history该表用于跟踪数据库的状态。数据库的迁移是按照版本号依次执行的:每次执行迁移后,schema_history表都会根据记录进行更新。如果后面再次迁移,Flyway会扫描应用的文件系统和类路径,并再次查看历史表。如果版本号低于或等于当前版本号,迁移操作将被忽略。增量迁移依然是按版本号进行:schema_history历史表会相应更新,记录整个过程。就是这样!每次需要修改数据库时,无论是结构(DDL)还是参考数据(DML),只需创建一个版本号高于当前版本的新迁移即可。下次Flyway启动时,它会找到它并相应地升级数据库。参考地址:https://flywaydb.org/documentation/getstarted/howDownload下载地址:https://flywaydb.org/download有免费版和付费版可供选择,当然我们选择最好的免费版,哈哈哈哈。...Linux系统wget-qO-https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/7.11.0/flyway-commandline-7.11.0-linux-x64.tar.gz|tarxvz&&ln-s`pwd`/flyway-7.11.0/flyway/usr/local/binDockersh-c'echo"dockerrun--rmflyway/flyway:7.11.0$*">/usr/local/bin/flyway&&chmod+x/usr/local/bin/flyway'目录结构[root@centos7~]#tree-L1./flyway-7.11.0./flyway-7.11.0├──conf#配置文件├──drivers#JDBD驱动├──flyway#macOS/Linux可执行文件├──flyway.cmd#Windows可执行文件├──jars#基于Java的迁移(作为jars)├──jre├──lib├──licenses├──README.txt└──sql#SQL迁移7directories,3files使用version之前需要了解的一些概念:数据库的每一次改变都可以称为一次版本迁移:Flyway将数据库结构从一个版本更新到另一个版本称为迁移可用的迁移:Flyway标识的迁移版本已应用文件系统:Flyway对数据库执行的迁移命令行使用>flyway[options]commandflyway主要基于6条基本命令migrate#migratedatabaseclean#clearallconfigurationinfo#printmigrationrelated详细信息和状态信息validate#验证迁移baseline的可用性#为现有数据库创建一个baseline版本,并且高于基线版本会执行迁移动作repair#修改schemahistory表,修改配置文件[root@centos7~]#cd./flyway-7.11.0/conf/[root@centos7conf]#lltotal24-rw-r--r--1rootroot22943Jul12021flyway.conf[root@centos7conf]#vimflyway.conflyway.url=jdbc:mysql://localhost:3306/mingongge?useUnicode=trueflyway.user=rootflyway.password=123456准备测试sql这里的script不得不提到命令规范的问题,否则后面的sql脚本无法执行。Prefix(前缀):V用于数据库迁移的版本号,U用于数据库回滚的版本号,R表示可重现的数据库MigrationVersion(版本号):Flyway会按顺序执行数据库迁移脚本ofversionnumberSeparator(分隔符):使用双下划线分隔符Description(描述):用于描述迁移脚本的描述性文字Suffix(后缀):.sql文件在sql目录下添加一个测试sql脚本,这里是一个简单的创建表的语句。[root@centos7sql]#pwd/root/flyway-7.11.0/sql[root@centos7sql]#catV1.0__Create_test_table.sqlCREATETABLE`test_table`(`id`bigint(10)NOTNULL,`username`varchar(64)DEFAULTNULL,`password`varchar(64)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='testtable';开始迁移[root@centos7~]#flywaymigrateFlywayTeamsEdition7.11.0byRedgateDatabase:jdbc:mysql://localhost:3306/mingongge(MySQL5.7)------------------------------------------FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams----------------------------------------成功验证0migrations(executiontime00:00.028s)警告:Nomigrationsfound.Areyourlocationssetupcorrectly?错误:Foundnon-emptyschema(s)`mingongge`但没有schemahistory表。使用baseline()或将baselineOnMigrate设置为true以初始化schemahistory表,创造一个颂歌。[root@centos7~]#flywaybaselineFlywayTeamsEdition7.11.0byRedgateDatabase:jdbc:mysql://localhost:3306/mingongge(MySQL5.7)------------------------------------------FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams--------------------------------------CreatingSchemaHistorytable`mingongge`.`flyway_schema_history`withbaseline...Successfullybaselinedschemawithversion:1再执行[root@centos7sql]#flywaymigrateFlywayTeamsEdition7.11.0byRedgateDatabase:jdbc:mysql://localhost:3306/mingongge(MySQL5.7)----------------------------------------FlywayTeams功能在接下来的27天默认启用。在https://flywaydb.org/?ref=v7.11.0_teams上了解更多信息--------------------------------------Successfullyvalidated1migration(executiontime00:00.225s)Migratingschema`mingongge`toversion"1.0-Createtesttable"Successfullyapplied1migrationtoschema`mingongge`,nowatversionv1.0(executiontime00:00.356s)添加数据进行迁移测试。或者在sql中创建脚本V1.0.1__add_data.sql[root@centos7~]#catflyway-7.11.0/sql/V1.0.1__add_data.sqlINSERTINTTOtest_table(id,username,PASSWORD)VALUES('001','test1'目录,'123456');INSERTITOtest_table(id,username,PASSWORD)VALUES('002','test2','123456');查看此时的状态信息,可以发现如下:执行迁移动作[root@centos7~]#flywaymigrateFlywayTeamsEdition7.11.0byRedgateDatabase:jdbc:mysql://localhost:3306/mingongge(MySQL5.7)--------------------------------------FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams------------------------------------成功验证2次迁移(执行时间00:00.042秒)Currentversionofschema`mingongge`:1.0Migratingschema`mingongge`toversion"1.0.1-adddata"Successfullyapplied1migrationtoschema`mingongge`,nowatversionv1.0.1(executiontime00:00.170s)查看状态信息回滚首先创建一个回滚脚本,注意命名规范,这个会让很多人踩坑。...记住!!!![root@centos7sql]#catU1.0.1__delete_data.sqlDELETEFROMtest_table;注意:这里的回滚必须回滚到已有的版本号,所以命名时要注意版本号。如果这里写成1.0,会出现错误:ERROR:Unabletoundomigrationtoversion1.0.1asnocorrespondingundomigrationhasbeenfound.Executerollback[root@centos7~]#flywayundoFlywayTeamsEdition7.11.0byRedgateDatabase:jdbc:mysql://localhost:3306/mingongge(MySQL5.7)------------------------------------FlywayTeamsfeaturesareenabledbydefaultforthenext27days.Learnmoreathttps://flywaydb.org/?ref=v7.11.0_teams---------------------------------------当前版本模式`mingongge`:1.0.1Undoingmigrationofschema`mingongge`toversion1.0.1-deletedataSuccessfullyundid1migrationtoschema`mingongge`,nowatversionv1.0(executiontime00:00.256s)查看状态从上图我们也可以看到V1.0.1的脚本现在处于Pending状态.其他集成Flyway还提供了Maven插件,你也可以在Maven中使用这个工具在pom.xml文件中添加maven依赖和配置连接数据信息。
