精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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-05-18 07:30:36

開發Spring Boot日志

2021-06-15 15:00:08

Cockpit樹莓派Linux

2023-04-28 15:15:39

數據庫JPA

2022-06-30 15:48:52

rustupRust

2019-08-05 15:38:07

BitwardenPodman密碼管理器

2010-08-26 16:15:25

DB2數據庫管理

2018-03-05 10:18:44

Linux密碼密碼管理器

2010-03-22 16:57:18

密碼文件數據庫密碼安全

2011-03-04 10:30:25

ASP數據庫

2010-07-29 09:14:57

DB2數據庫表

2018-11-06 09:24:55

LinuxLutries命令

2012-05-22 15:19:55

Rex服務器管理

2012-08-09 16:37:45

服務器管理Rex
點贊
收藏

51CTO技術棧公眾號

国内一区二区在线视频观看| 极品中文字幕一区| 精品动漫一区二区| 韩国精品一区二区三区六区色诱| 国产一级做a爱免费视频| 超碰成人在线免费| 欧美日韩国产在线播放| 日韩视频在线播放| 国产视频一区二区三| 午夜电影亚洲| 日韩成人av网| 久久撸在线视频| 97超碰资源站在线观看| 捆绑紧缚一区二区三区视频| 久久99精品久久久久久琪琪| 粉嫩av懂色av蜜臀av分享| 天天综合网站| 亚洲欧美电影一区二区| 久久综合一区二区三区| 在线观看一二三区| 影音先锋久久| 少妇真人直播免费视频| 性xxxx视频| 久久成人精品| 亚洲视频自拍偷拍| 丰满少妇中文字幕| 免费看av不卡| 亚洲一区二区精品视频| 日本成人黄色| 成人免费一级视频| 日韩成人午夜电影| 欧美精品第一页在线播放| 成人无码av片在线观看| 粉嫩av一区二区| 欧美日韩亚洲综合在线 | 亚洲男人av在线| 亚洲制服中文字幕| 久久久久人妻精品一区三寸| 国产精自产拍久久久久久| www.涩涩涩| 日韩免费影院| 亚洲国产精华液网站w| 国产精品久久精品国产| 97在线公开视频| 九色porny视频在线观看| 激情综合网最新| 日本成人在线视频网址| 91视频青青草| 日本一区二区免费高清| 亚洲人成网在线播放| 日本一卡二卡在线| 视频在线亚洲| 911国产精品| 日韩中文字幕1| 欧美激情网址| 亚洲国产人成综合网站| 亚洲色图自拍| 国产高清免费在线播放| 26uuu另类欧美亚洲曰本| 99久热re在线精品996热视频 | 国产一区二区三区亚洲| 欧美日韩在线综合| 北条麻妃视频在线| 天天免费亚洲黑人免费| 精品女厕一区二区三区| 久久av综合网| a级片免费在线观看| 亚洲国产精品视频| 日韩精品一区在线视频| 操喷在线视频| 性做久久久久久免费观看| 在线看成人av电影| 日本a在线播放| 国产精品美女视频| 影音先锋欧美资源| 在线看免费av| 国产精品欧美一区二区三区| 亚洲精品日韩精品| 黄色av网站在线播放| 亚洲欧美日韩在线| 黄色特一级视频| 国产第一页在线视频| 亚洲一二三区不卡| 青青草国产精品视频| 超碰aⅴ人人做人人爽欧美| 色婷婷国产精品久久包臀| 国产午夜福利视频在线观看| 欧美xxx网站| 欧美在线观看视频一区二区三区| 日日噜噜夜夜狠狠| 国产精品一区二区精品| 精品欧美一区二区久久| 亚洲久久久久久| 亚洲综合福利| 日韩在线不卡视频| 久久伊人成人网| 国产手机视频一区二区| 国产精品久久久久免费a∨大胸 | 小视频免费在线观看| 午夜精品123| 男人透女人免费视频| 欧美性www| 欧美成人猛片aaaaaaa| 国产又粗又长又爽| 日韩在线理论| 欧美精品福利视频| 国产字幕在线观看| 国产精品一区久久久久| 精品视频高清无人区区二区三区| 日本韩国精品一区二区| 亚洲欧美在线另类| 91视频最新入口| 91麻豆精品国产综合久久久 | 色小子综合网| 国内偷自视频区视频综合| www.国产com| 国内精品免费在线观看| 蜜桃精品久久久久久久免费影院| 第一福利在线| 亚洲综合一区二区精品导航| 久久久精品在线视频| 95精品视频| 亚洲精品小视频| 一区视频免费观看 | 午夜天堂在线视频| 一区二区三区韩国免费中文网站| 日韩在线观看网站| 中文字幕激情小说| 国产精品白丝jk黑袜喷水| 少妇特黄a一区二区三区| 2020国产在线| 日韩午夜在线观看| 国产欧美小视频| 午夜亚洲性色福利视频| 成人一区二区在线| 黄色的网站在线观看| 欧美无人高清视频在线观看| 制服丝袜在线第一页| 在线一区电影| 成人网欧美在线视频| 成人好色电影| 精品日韩中文字幕| 免费看毛片的网站| 欧美69视频| 91九色蝌蚪国产| 在线激情网站| 欧美午夜性色大片在线观看| 伊人免费视频二| 日韩免费一区| 国产精品69av| 亚洲区一区二区三区| 亚洲三区在线观看| 你懂的视频在线免费| 亚洲一区在线免费观看| 亚洲精品成人在线播放| 国产成人精品三级高清久久91| 欧美激情精品久久久久| 国产99久一区二区三区a片| 成人国产精品免费观看| 中文久久精品| 国产精品久久久久久久第一福利 | 视频一区二区综合| 中文字幕在线高清| 亚洲精品97久久| 色综合五月天导航| 日韩一区二区三区av| av视屏在线播放| 亚洲黄色录像| 欧美最顶级丰满的aⅴ艳星| 日本xxxxwww| 亚洲成在人线免费| 熟妇高潮一区二区| 日韩欧美视频| 精品久久久久久久中文字幕| 午夜影院免费版| 欧美99久久| 国产福利久久精品| 精精国产xxxx视频在线野外| 精品乱码亚洲一区二区不卡| 久久这里只有精品免费| 成人a区在线观看| 成人毛片视频网站| 国产剧情一区| 国产精品自产拍高潮在线观看| 中文字幕日本在线| 欧美一区二区日韩| 豆国产97在线 | 亚洲| av大大超碰在线| 国内精品视频| 国产视频久久久| 日本黄色一级视频| 亚洲欧洲av另类| 青娱乐精品在线| 亚洲区第一页| 日本在线视频不卡| 亚洲爽爆av| zzijzzij亚洲日本成熟少妇| 亚洲欧美中文在线视频| 亚洲精美色品网站| 看高清中日韩色视频| bl视频在线免费观看| 免费国产亚洲视频| 国产一区二区三区高清| 亚洲精华液一区二区三区| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 成人深夜视频在线观看| 妺妺窝人体色www在线小说| 日韩精品1区| 成人有码在线播放| 久久久男人天堂| 中文字幕亚洲综合久久| 亚洲成人av综合| 91福利社在线观看| 黄色一级片中国| 久久久久久久久久久久久久久99| 九九热99视频| 一本色道久久综合一区| 欧美性受xxxx黑人猛交88| 黄色欧美网站| 91精品国产综合久久香蕉922| xxxx在线视频| 久久精品成人一区二区三区| 视频在线观看你懂的| 欧美一卡2卡3卡4卡| 日韩av在线电影| 国产精品久久久久久久久晋中 | 色狠狠久久aa北条麻妃| 黄色片一区二区三区| 欧美日韩亚洲一区| 久久亚洲一级片| 日韩欧美中文字幕精品| 另类视频在线观看| 国产精品一区二区三区免费视频| dy888午夜| 天美一区二区三区| 人妻无码一区二区三区久久99| 日韩美女精品在线| 色噜噜在线观看| 国产美女精品人人做人人爽| 男人操女人免费| 欧美影院一区| 亚洲三区在线观看| 欧洲乱码伦视频免费| 久久本道综合色狠狠五月| 国产激情综合| 国产免费一区视频观看免费 | 久久久久久久久久电影| 特黄特黄一级片| 精品一区二区综合| 久久国产精品国产精品| 日韩在线一区二区三区| 99视频在线免费播放| 99久久www免费| 亚洲一区二区免费视频软件合集| 国产成人精品免费视| 久久大香伊蕉在人线观看热2| 韩国三级成人在线| 国产一区深夜福利| 综合欧美精品| 成人福利视频在线观看| 精品九九久久| 国产精品一香蕉国产线看观看| av有声小说一区二区三区| 欧美激情第一页xxx| 国产91足控脚交在线观看| 久久99久国产精品黄毛片入口| av毛片在线看| 欧美激情精品久久久| 欧美男男video| 欧美精品18videos性欧| 电影k8一区二区三区久久| 久久久亚洲国产| av第一福利在线导航| 高清欧美性猛交xxxx黑人猛交| 99视频免费在线观看| 欧美成人精品在线视频| 97人澡人人添人人爽欧美| 欧美激情高清视频| 日韩美女在线看免费观看| 国产啪精品视频网站| 一区二区三区四区高清视频| 国产区一区二区三区| 国产日产精品_国产精品毛片| 亚洲最大免费| 影院欧美亚洲| 日韩av资源在线| 国产精品白丝jk白祙喷水网站| 美国黄色a级片| 中文字幕中文在线不卡住| 激情综合网五月婷婷| 欧美综合色免费| 黄色av中文字幕| 日韩在线观看精品| 中文在线免费二区三区| 成人激情视频小说免费下载| 国产日韩三级| 伊人久久青草| 亚洲一区欧美二区| 亚洲高清av一区二区三区| 97精品久久久久中文字幕| 肉色超薄丝袜脚交69xx图片| 五月激情综合婷婷| 国产人妖一区二区三区| 亚洲视频精品在线| av丝袜在线| 91久久久久久久久久久| 久久成人av| 日本福利视频一区| 激情深爱一区二区| 人妻体内射精一区二区| 亚洲黄色小视频| 亚洲视频在线免费播放| 日韩av在线播放资源| www.视频在线.com| 一区二区三区精品视频在线观看 | 日韩一区二区三免费高清在线观看| 激情av一区二区| 最新中文字幕免费| 日韩成人高清在线| 污污影院在线观看| 国产欧美精品日韩精品| 日韩大尺度在线观看| 亚洲免费视频在线观看| 在线观看成人av电影| 国产电影一区二区| 日韩久久久久久久| 香蕉久久a毛片| 无码国产69精品久久久久网站 | 国产破处视频在线观看| 精品国产精品三级精品av网址| aaaa一级片| 久久黄色av网站| 欧美韩国日本| 亚洲欧美精品一区| 国产免费av高清在线| 亚州av一区二区| 久久悠悠精品综合网| 国产免费裸体视频| 国产高清亚洲一区| 精品欧美一区二区久久久久| 欧美美女视频在线观看| 日本不卡在线| 成人激情春色网| 婷婷中文字幕一区| 成人免费黄色av| 亚洲欧洲韩国日本视频| 97精品人妻一区二区三区香蕉| 中文字幕九色91在线| 黑人一区二区三区| 亚洲欧美日产图| 日韩中文字幕麻豆| 欧美黑人xxxⅹ高潮交| 欧美成人三级在线播放| 狠狠久久伊人中文字幕| 麻豆成人小视频| 国产精品呻吟| 国产人妻人伦精品1国产丝袜| 五月天视频一区| 深夜福利在线看| 日本午夜在线亚洲.国产| 色综合综合网| 亚洲黄色av网址| 国产精品久线在线观看| 91香蕉视频免费看| bt7086福利一区国产| 精品成人av一区二区在线播放| 亚洲女人天堂网| 日本精品在线中文字幕| 欧美h视频在线观看| 国产成人福利片| 久久久精品福利| 中文字幕亚洲综合久久| 国产欧美日韩电影| 免费看国产一级片| 国产色产综合色产在线视频| 国产又粗又大又爽视频| 久久久久国产视频| 欧美禁忌电影网| 久久久亚洲综合网站| 一级做a爱片久久毛片| 视频一区欧美日韩| 国产精品99久久久久久久久| www.一区| 亚洲av首页在线| 99久久精品国产一区二区三区 | 国产综合视频在线观看| 国内在线观看一区二区三区| 免费激情视频在线观看| 国产精品99久久久久久动医院| 亚洲理论中文字幕| 精品久久久久久| 1769在线观看| 国产精品久久精品视| 青椒成人免费视频| 中文在线观看免费网站| 中文字幕av一区二区| 99国产精品久久一区二区三区| 十八禁视频网站在线观看| 亚洲黄色片在线观看| 成人免费一区二区三区视频网站|