Flyway 助力數據庫腳本自動化管理攻略

原文地址:梁桂釗的博客html

博客地址:http://blog.720ui.comjava

歡迎關注公衆號:「服務端思惟」。一羣同頻者,一塊兒成長,一塊兒精進,打破認知的侷限性。mysql

今天,探討一個有趣的話題:咱們能夠經過 Git 來實現項目版本控制;經過 Jenkins 進行持續集成,那麼對於數據庫層面,咱們仍然依賴於純手工運行 SQL 腳本,對此,咱們在多環境(開發環境、測試環境、預發環境、生產環境)中如何確保其 SQL 腳本的最新性和正確性?spring

image.png<br />衆所周知,人工的操做很是容易出問題,咱們應該讓程序幫忙自動進行管理和遷移。今天,筆者推薦一款開源的數據庫遷移工具 Flyway。sql

image.png

Flyway 不只能夠支持 MySQL,它也能夠支持很是多其餘的數據庫。<br />image.png數據庫

事實上,Spring Boot 已經完美整合了 Flyway。對此,咱們能夠很是便捷地使用它。首先,咱們引入 Maven 依賴。(注意的是,咱們項目中還須要 spring-boot-starter-jdbc、 mysql-connector-java 依賴)架構

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

此外,咱們在 application.yml 中配置相關選項。Spring Boot 默認在 classpath://db/migration 目錄下掃描Migration。這裏,筆者經過 spring.flyway.locations 將其調整爲 db/sql。app

spring:
  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: [classpath:db/sql]

當系統程序啓動時,它會自動建立 flyway_schema_history 文件。(固然,也能夠本身手動建立)。這張表是 Flyway 的元數據表, 其保存着每次 migration 的記錄, 記錄包含 migration 腳本的版本號和 SQL 腳本的 checksum 值。當一個新的 SQL 腳本被掃描到後, Flyway 解析該 SQL 腳本的版本號, 並和 metadata 表對比, 若是該 SQL 腳本版本更新的話, 將在指定的 DB 上執行該 SQL 文件, 不然跳過該 SQL 文件。spring-boot

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`)
)

而後,咱們在 db/sql 下手動建立一個初始化的 SQL 腳本:V1.1__INIT_DB.sql。工具

DROP TABLE IF EXISTS `tag`;

CREATE TABLE `tag` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `gmtCreate` date DEFAULT NULL,
  `gmtModified` date DEFAULT NULL,
  `title` varchar(32) DEFAULT NULL,
  `parentId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

那麼,在程序再次啓動後,它會將其自動化發佈到數據庫中。   

image.png

這裏,須要補充的知識點:Flyway 的版本比較規則。其採起左對齊原則,缺位用 0 代替。例如 1.1 比 1.0 版本高,1.1.1 比 1.1  版本高,而 1.1.01 和 1.1.1  版本一致。 而且,它們會按照版本排序且順序執行。

image.png

此外,Flyway 不只支持 DDL,也同時支持 DML(insert、update、delete)等。所以,咱們能夠再建立一個 V1.2__INSERT_TAG_DATA.sql 文件來驗證一下。

INSERT tag(title, parentId) values('java', 0);
INSERT tag(title, parentId) values('spring', 0);

最後,咱們在來一塊兒探討下Flyway 支持常見類型的 migration:

  • Versioned migrations:數據庫升級腳本
  • Repeatable migrations:可重複執行,當腳本 checksums 改變時會從新執行。

image.png

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

總結一下,Flyway 經過元數據(flyway_schema_history)幫忙咱們自動化維護和管理數據庫的版本遷移。

寫在末尾

【服務端思惟】:咱們一塊兒聊聊服務端核心技術,探討一線互聯網的項目架構與實戰經驗。讓全部孤軍奮戰的研發人員都找到屬於本身的圈子,一塊兒交流、探討。在這裏,咱們能夠認知升級,鏈接頂級的技術大牛,鏈接優秀的思惟方式,鏈接解決問題的最短路徑,鏈接一切優秀的方法,打破認知的侷限。

更多精彩文章,盡在「服務端思惟」!

本文由博客一文多發平臺 OpenWrite 發佈!

原文出處:https://www.cnblogs.com/lianggzone/p/11729679.html

相關文章
相關標籤/搜索