各個互聯網公司都在用的開源數據庫控制器Flyway

開源的數據庫控制器

在開發中,咱們常常會遇到上線數據庫表的狀況,代碼上咱們有git,svn這樣優秀的版本控制軟件,可是數據庫的迭代咱們不能使用手工的方式迭代吧?或者說每次上線前手工去數據庫執行。這樣帶來的便捷性就會有很大問題,執行者須要跟開發屢次覈對數據庫執行腳本語句確保正確性後才執行。git

爲了更好的管理好各個環境的數據庫版本,咱們能夠在項目中增長Flyway來管理數據表的版本。spring

Flyway是什麼呢?

Flyway是一款開源的數據庫版本管理工具,利用簡單的配置,獨立跟蹤進行數據版本的迭代。sql

Version control for your database.Robust schema evolution across all your environments. With ease, pleasure and plain SQL.docker

簡單的來講,使用Flyway來幫助咱們執行數據庫的腳本,打破原先的腳本執行的規範。數據庫

原先的流程規範

原先部署程序的流程是這樣的。springboot

  1. 開發人員將代碼應用程序,腳本彙總到代碼倉庫上,好比svn或者git上。
  2. DBA或者運維人員根據腳本檢查,備份,執行;先完成數據庫的升級。
  3. 而後再將程序包進行部署安裝升級。

如今的數據執行流程

  1. 開發人員將應用程序,代碼上傳至代碼倉庫上。
  2. 部署人員直接打包程序、或者使用docker打包程序,替換完成升級。開始執行Flyway

這樣的步驟中沒有引入docker的概念,引入docker,部署流程還會存在變更,甚至自動化ci等等都是能夠進行流程方面的優化,也帶來更高的工做效率。微信

Flyway 如何工做

flyway在使用的時候會在一個空的數據庫裏面建立一張表,表名通常是flyway_schema_history,老版本的名字是schema_version.運維

表結構以下: 記錄了表變動的歷史
CREATE TABLE `flyway_schema_history` (
  `installed_rank` int(11) NOT NULL,
  `version` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `type` varchar(20) NOT NULL,
  `script` varchar(1000) NOT NULL,
  `checksum` int(11) DEFAULT NULL,
  `installed_by` varchar(100) NOT NULL,
  `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `execution_time` int(11) NOT NULL,
  `success` tinyint(1) NOT NULL,
  PRIMARY KEY (`installed_rank`),
  KEY `flyway_schema_history_s_idx` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

複製代碼

sql

執行流程:svn

  • 在應用中建立數據庫腳本,flyway中稱之爲migration.
  • 程序啓動,flyway根據表中 的記錄決定是否執行應用中的migration。
  • 執行結果會就算出來checksum,進行對比。版本同樣裏面內容出現變化,migration就會出現問題。因此在線上環境,必定不能修改原先已經完成的migration內容。
  • 插入成功後,會在版本庫中新增一條記錄。

Java中的使用

項目背景

  1. 該使用咱們是創建在Spring boot 1.5.10版本上。在Spring boot 2.0版本後存在不一樣的使用。
  2. 構建項目使用的gradle4.9+。

源碼實現

  • 在項目中引入flyway
compile("org.flywaydb:flyway-core:5.1.3")
複製代碼
  • 建立文件目錄db.migration(默認是這樣的文件目錄結構,能夠更改,看附錄文件)

2019-04-23-23-58-33

  • 注意sql腳本的文件命名 其中的文件名由如下部分組成,除了使用默認配置外,某些部分還可自定義規則。工具

    prefix: 可配置,前綴標識,默認值V表示Versioned,R表示Repeatable version: 標識版本號,由一個或多個數字構成,數字之間的分隔符可用點.或下劃線_ separator: 可配置,用於分隔版本標識與描述信息,默認爲兩個下劃線__ description: 描述信息,文字之間能夠用下劃線或空格分隔 suffix: 可配置,後續標識,默認爲.sql

    2019-04-23-23-59-24

啓動springboot項目

啓動項目以後就會在數據庫中執行腳本中的sql內容。

2019-04-24-00-02-30

更多參數配置列表

在介紹的使用過程當中,有不少參數能夠進行配置,定製屬於本身個性化的flyway內容。注意不一樣的Spring boot 項目有不一樣的配置內容

flyway.baseline-description= # 執行基線時標記已有Schema的描述
flyway.baseline-version=1 # 基線版本默認開始序號 默認爲 1. 
flyway.baseline-on-migrate=false # 針對非空數據庫是否默認調用基線版本 , 這也是咱們上面版本號從 2 開始的緣由
flyway.check-location=false # 是否開啓腳本檢查 檢查腳本是否存在 默認false
flyway.clean-on-validation-error=false # 驗證錯誤時 是否自動清除數據庫 高危操做!!!
flyway.enabled=true # 是否啓用 flyway.
flyway.encoding=UTF-8 # 腳本編碼.
flyway.ignore-failed-future-migration=true # 在讀元數據表時,是否忽略失敗的後續遷移.
flyway.init-sqls= # S獲取鏈接後當即執行初始化的SQL語句
flyway.locations=classpath:db/migration # 腳本位置, 默認爲classpath: db/migration.
flyway.out-of-order=false # 是否容許亂序(out of order)遷移
flyway.placeholder-prefix= # 設置每一個佔位符的前綴。 默認值: ${ 。 
flyway.placeholder-replacement=true # 是否要替換佔位符。 默認值: true 。 
flyway.placeholder-suffix=} # 設置佔位符的後綴。 默認值: } 。 
flyway.placeholders.*= # 設置佔位符的值。
flyway.schemas= # Flyway管理的Schema列表,區分大小寫。默認鏈接對應的默認Schema。
flyway.sql-migration-prefix=V # 遷移腳本的文件名前綴。 默認值: V 。 
flyway.sql-migration-separator=__ # 遷移腳本的分割符 默認雙下劃線
flyway.sql-migration-suffix=.sql # 遷移腳本的後綴 默認 .sql
flyway.table=schema_version # Flyway使用的Schema元數據表名稱 默認schema_version
flyway.url= # 待遷移的數據庫的JDBC URL。若是沒有設置,就使用配置的主數據源。
flyway.user= # 待遷移數據庫的登陸用戶。
flyway.password= # 待遷移數據庫的登陸用戶密碼。
flyway.validate-on-migrate=true # 在運行遷移時是否要自動驗證。 默認值: true 。
複製代碼

總結

使用flyway幫助咱們解決了每次彙總數據庫sql的問題,而且也不須要人工干預數據庫的執行。大大提升效率與工做的流程。

參考資料以下:

blog.waterstrong.me/flyway-in-p… 快速掌握和使用Flyway blog.csdn.net/chenleiking… Flyway簡介

·END·

路雖遠,行則必至

本文原發於 同名微信公衆號「胖琪的升級之路」,回覆「1024」你懂得,給個讚唄。

微信ID:YoungRUIQ

公衆號
相關文章
相關標籤/搜索