国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Spring Boot 2實戰:使用Flyway管理你數據庫的版本變更

開發 后端 數據庫運維
如何能做到像 Git 之類的版本控制工具來管理數據庫?Java 項目中常用 Flyway 和 Liquibase 來管理數據庫版本。其中 Flyway 相對來說比較受歡迎。

 

1. 前言

隨著項目的不斷迭代,數據庫表結構、數據都在發生著變化。甚至有的業務在多環境版本并行運行。數據為王的時代,管理好數據庫的版本也成為了迫切的需要。如何能做到像 Git 之類的版本控制工具來管理數據庫?Java 項目中常用 Flyway 和 Liquibase 來管理數據庫版本。其中 Flyway 相對來說比較受歡迎。

2. Flyway 的特點

Flyway 大受歡迎是因為它具有以下優點:

  •  簡單 非常容易安裝和學習,同時遷移的方式也很容易被開發者接受。
  •  專一 Flyway 專注于搞數據庫遷移、版本控制而并沒有其它副作用。
  •  強大 專為連續交付而設計。讓Flyway在應用程序啟動時遷移數據庫。

3. Flyway 的工作機制

Flyway 需要在 DB 中先創建一個 metadata 表 (缺省表名為 flyway_schema_history), 在該表中保存著每次 migration (遷移)的記錄, 記錄包含 migration 腳本的版本號和 SQL 腳本的 checksum 值。下圖表示了多個數據庫版本。

對應的 metadata 表記錄:

installed_rank version description type script checksum installed_by installed_on execution_time success
1 1 Initial Setup SQL V1__Initial_Setup.sql 1996767037 axel 2016-02-04 22:23:00.0 546 true
2 2 First Changes SQL V2__First_Changes.sql 1279644856 axel 2016-02-06 09:18:00.0 127 true

Flyway 掃描文件系統或應用程序的類路徑讀取 DDL 和 DML 以進行遷移。根據metadata 表進行檢查遷移。如果腳本聲明的版本號小于或等于標記為當前版本的版本號之一,將忽略它們。其余遷移是待處理遷移:可用,但未應用。最后按版本號對它們進行排序并按順序執行 并將執行結果寫入 metadata 表。

對應的 metadata 表記錄:

installed_rank version description type script checksum installed_by installed_on execution_time success
1 1 Initial Setup SQL V1__Initial_Setup.sql 1996767037 axel 2016-02-04 22:23:00.0 546 true
2 2 First Changes SQL V2__First_Changes.sql 1279644856 axel 2016-02-06 09:18:00.0 127 true

Flyway 支持命令行(需要下載命令行工具)和 Java Api ,也支持構建工具 Maven 和 Gradle 。這里我們將目光放在 Java Api 上。

3. Flyway 的規則

Flyway 是如何比較兩個 SQL 文件的先后順序呢?它采用 采用左對齊原則, 缺位用 0 代替 。舉幾個例子:

1.0.1.1 比 1.0.1 版本高。

1.0.10 比 1.0.9.4 版本高。

1.0.10 和 1.0.010 版本號一樣高, 每個版本號部分的前導 0 會被忽略。

Flyway 將 SQL 文件分為 Versioned 、Repeatable 和 Undo 三種:

  •  Versioned 用于版本升級, 每個版本有唯一的版本號并只能執行一次.
  •  Repeatable 可重復執行, 當 Flyway檢測到 Repeatable 類型的 SQL 腳本的 checksum 有變動, Flyway 就會重新應用該腳本. 它并不用于版本更新, 這類的 migration 總是在 Versioned 執行之后才被執行。
  •  Undo 用于撤銷具有相同版本的版本化遷移帶來的影響。但是該回滾過于粗暴,過于機械化,一般不推薦使用。一般建議使用 Versioned 模式來解決。

這三種的命名規則如下圖:

  •  Prefix 可配置,前綴標識,默認值 V 表示 Versioned, R 表示 Repeatable, U 表示 Undo
  •  Version 標識版本號, 由一個或多個數字構成, 數字之間的分隔符可用點 . 或下劃線 _
  •  Separator 可配置, 用于分隔版本標識與描述信息, 默認為兩個下劃線 __
  •  Description 描述信息, 文字之間可以用下劃線 _ 或空格 分隔
  •  Suffix 可配置, 后續標識, 默認為 .sql

4. Spring Boot 集成 Flyway

Spring Boot 提供了對 Flyway 的自動配置 。使我們可以開箱即用 Flyway 進行數據庫版本控制。

4.1 Flyway 依賴

你只需要引入依賴:     

  1. <!-- 無需版本號 -->  
  2.  <dependency>  
  3.       <groupId>org.flywaydb</groupId>  
  4.       <artifactId>flyway-core</artifactId>  
  5.  </dependency>       

當然你要集成你的相關數據庫環境。這里我們采用 H2 數據庫來演示,其它數據庫同理只不過方言不同。不熟悉 H2 數據庫的可參閱我的專題文章 Spring Boot 2 實戰:H2數據庫集成以及使用 。

4.2 Flyway 配置

為了直觀的講解配置,首先在 Spring Boot 配置文件 application.yml 我們配置 H2 數據庫為: 

  1. spring:  
  2.    datasource:  
  3.      #  h2 驅動  
  4.      driver-class-name: org.h2.Driver  
  5.      # h2  數據庫 持久化到磁盤D:/h2 庫名: flyway  mysql模式  
  6.      url: jdbc:h2:file:D:/h2/flyway;MODE=MySQL;DATABASE_TO_LOWER=TRUE  
  7.    h2:  
  8.      #    開啟console 訪問 默認false  
  9.      console:  
  10.        enabled: true  
  11.        settings:  
  12.          #      開啟h2 console 跟蹤 方便調試  默認 false  
  13.          trace: true  
  14.          #      允許console 遠程訪問 默認false  
  15.          web-allow-others: true  
  16.        #  h2 訪問路徑上下文  
  17.        path: /h2-console 

對應Flyway的配置為: 

  1. # flyway 配置  
  2. spring:  
  3.   flyway:  
  4.     # 啟用或禁用 flyway  
  5.     enabled: true  
  6.     # flyway 的 clean 命令會刪除指定 schema 下的所有 table, 生產務必禁掉。這個默認值是 false 理論上作為默認配置是不科學的。  
  7.     clean-disabled: true  
  8.     # SQL 腳本的目錄,多個路徑使用逗號分隔 默認值 classpath:db/migration  
  9.     locations: classpath:db/migration  
  10.     #  metadata 版本控制信息表 默認 flyway_schema_history  
  11.     table: flyway_schema_history  
  12.     # 如果沒有 flyway_schema_history 這個 metadata 表, 在執行 flyway migrate 命令之前, 必須先執行 flyway baseline 命令  
  13.     # 設置為 true 后 flyway 將在需要 baseline 的時候, 自動執行一次 baseline。  
  14.     baseline-on-migrate: true  
  15.     # 指定 baseline 的版本號,默認值為 1, 低于該版本號的 SQL 文件, migrate 時會被忽略  
  16.     baseline-version: 1  
  17.     # 字符編碼 默認 UTF-8  
  18.     encoding: UTF-8  
  19.     # 是否允許不按順序遷移 開發建議 true  生產建議 false  
  20.     out-of-order: false  
  21.     # 需要 flyway 管控的 schema list,這里我們配置為flyway  缺省的話, 使用spring.datasource.url 配置的那個 schema,  
  22.     # 可以指定多個schema, 但僅會在第一個schema下建立 metadata 表, 也僅在第一個schema應用migration sql 腳本.  
  23.     # 但flyway Clean 命令會依次在這些schema下都執行一遍. 所以 確保生產 spring.flyway.clean-disabled 為 true  
  24.     schemas: flyway  
  25.     # 執行遷移時是否自動調用驗證   當你的 版本不符合邏輯 比如 你先執行了 DML 而沒有 對應的DDL 會拋出異常  
  26.     validate-on-migrate: true 

請務必仔細閱讀 Flyway 相關配置的說明。

4.3 編寫 SQL 初始化腳本

我們先編寫一個初始化 SQL 文件,向 H2 數據庫已經自動初始化的 schema flyway 添加一張 sys_user 表。請注意命名規則。腳本名稱為 V1.0.1__Add_table_user.sql 。SQL 腳本的位置在配置的 spring.flyway.locations 下。內容為: 

  1. use `flyway`;  
  2. CREATE TABLE `sys_user`  
  3.  
  4.     `user_id`         int(10) unsigned NOT NULL AUTO_INCREMENT,  
  5.     `username`        varchar(1024)    NOT NULL unique ,  
  6.     `encode_password` varchar(1024)       NOT NULL,  
  7.     `age`             int(3)           NOT NULL,  
  8.     PRIMARY KEY (`user_id`)  
  9. ENGINE = InnoDB  
  10.   DEFAULT CHARSET = utf8mb4 
  11. insert into  flyway.sys_user values (1,'Felordcn','{noop}12345',18); 

啟動 Spring Boot 應用 。打開 H2 數據庫控制臺 http://localhost:8080/h2-console ,在 JDBC URL 一欄粘貼 jdbc:h2:file:D:/h2/flyway;MODE=MySQL;DATABASE_TO_LOWER=TRUE 并點擊 Connect 按鈕會進入以下界面:

這里 -1 是因為我們缺省了 Flyway 需要的 flyway_schema_history 表 。0 是因為 H2 數據庫自動初始化了 Schema flyway ,其它數據庫可能需要你手動來建立。

4.4 編寫 SQL 變更腳本

我們編寫一個 V1.0.0__Delete_sysuser_felordcn.sql 來刪除 V1.0.1__Add_table_user.sql 中初始化的用戶。你會發現啟動報錯了,因為我們開啟了校驗,所以對于邏輯錯誤的版本會拋出異常。我們將版本號更改為 V1.0.2__Delete_sysuser_felordcn.sql 再次啟動。通過 H2 數據庫控制臺我們會發現多了一條變更記錄:

同時 sys_user 表的數據也沒有了,符合預期。

5. Flyway 最佳實踐

通過上面的介紹相信你很快就會使用 Flyway 進行數據庫版本控制了。這里總結了一些在實際開發中的使用經驗:

  1.  生產務必禁 spring.flyway.cleanDisabled=false 。
  2.  盡量避免使用 Undo 模式。
  3.  開發版本號盡量根據團隊來進行多層次的命名避免混亂。比如 V1.0.1__ProjectName_{Feature|fix}_Developer_Description.sql ,這種命名同時也可以獲取更多腳本的開發者和相關功能的信息。
  4.  spring.flyway.outOfOrder 取值 生產上使用 true,開發中使用 false。
  5.  多個系統公用一個 數據庫 schema 時配置spring.flyway.table 為不同的系統設置不同的 metadata 表名而不使用缺省值 flyway_schema_history 。

6. 總結

今天我們對 Flyway 數據庫版本遷移管理工具進行了介紹并將之與 Spring Boot 相結合。這將大大規范我們的數據庫管理,提高生產效率。同時也分享了一些相當有用的生產實踐經驗。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2017-12-27 15:16:35

Spring BootFlyway數據庫

2025-01-26 00:00:35

2021-06-29 17:19:44

Spring Boot集成Flyway

2021-03-09 17:11:09

數據庫腳手架開發

2020-08-13 07:42:15

數據庫Flyway代碼

2012-06-06 10:09:31

iPad數據中心

2010-08-10 09:37:29

DB2 9.7

2021-06-15 15:00:08

Cockpit樹莓派Linux

2021-05-18 07:30:36

開發Spring Boot日志

2023-04-28 15:15:39

數據庫JPA

2019-08-05 15:38:07

BitwardenPodman密碼管理器

2022-06-30 15:48:52

rustupRust

2018-03-05 10:18:44

Linux密碼密碼管理器

2010-08-26 16:15:25

DB2數據庫管理

2010-03-22 16:57:18

密碼文件數據庫密碼安全

2011-03-04 10:30:25

ASP數據庫

2010-07-29 09:14:57

DB2數據庫表

2012-08-09 16:37:45

服務器管理Rex

2012-05-22 15:19:55

Rex服務器管理

2018-11-06 09:24:55

LinuxLutries命令
點贊
收藏

51CTO技術棧公眾號

僵尸世界大战2 在线播放| jzzjzzjzz亚洲成熟少妇| 色中色综合网| 久久精品国产一区二区电影| 2020国产在线| 欧美日韩一区二区三区四区五区| 成视频年人免费看黄网站| 高清在线不卡av| 欧美一区国产一区| 亚洲第一黄网| 亚洲综合中文字幕在线观看| 欧美日韩国产在线观看网站| 国内免费精品永久在线视频| 日韩av黄色| 中文字幕日本欧美| 欧美日韩精品免费观看视欧美高清免费大片| 欧美剧情电影在线观看完整版免费励志电影| 国产一级粉嫩xxxx| 1区2区3区国产精品| 男人女人黄一级| 久久网这里都是精品| 国产精品无码一区二区在线| 国产精品综合av一区二区国产馆| 亚洲春色在线| 美女网站色91| 男女在线视频| 日韩中文av| 91亚洲精品一区二区乱码| 日韩一区二区三区在线| 亚洲国产精品久久精品怡红院| 欧美丝袜一区二区| 日韩护士脚交太爽了| 欧美视频一区在线| 免费在线高清av| 在线视频你懂得一区| av影片免费在线观看| 欧美亚洲国产一区二区三区va| 欧美女子与性| 91精品婷婷国产综合久久竹菊| 黄色片网站在线| 亚洲第一免费播放区| 在线精品亚洲欧美日韩国产| 久久精品人人爽| 亚洲国产欧美日韩在线观看第一区| 日韩免费观看高清| 小说区亚洲自拍另类图片专区| 国产精品二区在线| 男男成人高潮片免费网站| 欧美大黑帍在线播放| 国产精品毛片久久久久久久| 在线看片线路1| 欧美久久久久久久久中文字幕| 免费在线观看的电影网站| 中文在线不卡视频| 九九视频精品全部免费播放| 国产精品免费一区二区三区| 国产一区二区毛片| 涩涩视频免费网站| 色欧美片视频在线观看| 国内小视频在线看| 色综合色综合久久综合频道88| 欧美精品系列| 欧美一区二区三区成人久久片 | 国产网站在线| 欧美国产日韩视频| 亚洲视频中文| 黄色影院一级片| 欧美午夜激情小视频| 正在播放日韩精品| 国产精品美女视频网站| 久久9热精品视频| 国产视频一二| 亚洲电影av在线| 亚洲欧洲免费| 正在播放91九色| 一区二区三区在线观看动漫 | 蜜桃视频在线观看成人| 99久久久久免费精品国产| 在线观看av中文| 亚洲无av在线中文字幕| 久久一区二区三区电影| 免费观看国产视频在线| 亚洲成人一区二区在线观看| 国产极品在线观看| 国产欧美在线视频| 99久久婷婷国产综合精品电影| 国产精品一区二区婷婷| 欧美成人高清视频| 日韩精品成人一区二区在线| 男女激情视频网站| 国产亚洲激情在线| 亚洲午夜精品久久久久久app| 日本一极黄色片| 亚洲国产精品va在线观看黑人| 欧美成免费一区二区视频| 欧美成人免费高清视频| 亚洲国产日韩一区| 无码一区二区三区视频| 久久久噜噜噜www成人网| 日韩一级成人av| 日韩av有码| 黄色国产精品视频| 日韩精品黄色网| 一区二区国产在线观看| 开心丁香婷婷深爱五月| 中文欧美在线视频| 免费欧美日韩国产三级电影| 奇米影视888狠狠狠777不卡| 日本欧美中文字幕| 欧美国产一区二区| 国精产品一区一区三区四川| 精品无人乱码一区二区三区的优势| 亚洲理论在线观看| 天堂精品久久久久| 日日摸日日碰夜夜爽av| 国产视频精品久久久| 国产偷自视频区视频一区二区| 调教视频在线观看| 97超级碰碰碰| 国产午夜精品一区二区三区嫩草| 浪潮色综合久久天堂| 亚洲 国产 日韩 综合一区| 欧美午夜理伦三级在线观看| 国产精品黑丝在线播放| 一级特黄视频| 国产91在线高潮白浆在线观看| 中文字幕一区二区三区四区| 高潮久久久久久久久久久久久久| 国产精品一区二区免费在线观看| 亚洲香蕉av在线一区二区三区| 久久国产视频网| 亚洲欧美se| 男人添女人下部视频免费| 国产视频一区在线| 国产成人在线观看免费网站| 久久国内精品| 免费日韩视频在线观看| 欧美黑人性视频| 亚洲视频每日更新| 国产精品一区二区av交换| 亚州福利视频| 久久久久久com| 国产精品区一区二区三| 午夜视黄欧洲亚洲| 国模吧精品视频| 中文字幕毛片| 国产精品久久久久久久久久久新郎| 久久精品国产亚洲blacked| 青娱乐极品盛宴一区二区| 美女黄色片网站| 亚洲欧美日本精品| 成人动漫视频在线| 日韩在线亚洲| 成视频年人免费看黄网站| 国产精品视频区| 欧美综合天天夜夜久久| 日韩和的一区二区| 成人国产精选| 黄p免费网站| 成人av网站在线观看免费| 黑人巨大精品欧美一区二区桃花岛| 91精品国产毛片武则天| 日韩视频欧美视频| 亚洲欧美一区二区久久| 午夜日韩在线| 久草在线资源福利站| 日韩 欧美 高清| 国产精品久久在线观看| 欧美三级三级三级| 国产精品白丝jk白祙喷水网站| 玖玖玖视频精品| 中文字幕高清在线观看| 深夜福利成人| 国内精品久久久久久| 狠狠色噜噜狠狠狠狠97| 美女视频黄免费的久久| 精品一区二区三区免费看| 午夜在线免费视频| 久久久久久九九| 久久精品电影网| 福利视频一区二区| 国产精品18久久久久久vr| 日韩欧美中文字幕电影| 免费黄色电影在线观看| 97在线国产视频| 国产精品日韩久久久久| 精品美女被调教视频大全网站| 国产日韩欧美在线一区| 伊人久久亚洲热| 祥仔av免费一区二区三区四区| 美女露隐私免费网站| 久久久久久久有限公司| 久久久999精品免费| 在线视频一区二区免费| 91色porny| 亚洲女人av| 国产欧美日韩免费观看| av日韩亚洲| 黄色在线网站| 欧美日韩在线免费播放|