溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flyway怎么對數(shù)據(jù)庫腳本自動化管理

發(fā)布時間:2021-06-25 09:26:21 來源:億速云 閱讀:207 作者:chen 欄目:大數(shù)據(jù)

本篇內容介紹了“Flyway怎么對數(shù)據(jù)庫腳本自動化管理”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!


今天,探討一個有趣的話題:我們可以通過 Git 來實現(xiàn)項目版本控制;通過 Jenkins 進行持續(xù)集成,那么對于數(shù)據(jù)庫層面,我們仍然依賴于純手工運行 SQL 腳本,對此,我們在多環(huán)境(開發(fā)環(huán)境、測試環(huán)境、預發(fā)環(huán)境、生產(chǎn)環(huán)境)中如何確保其 SQL 腳本的最新性和正確性?

眾所周知,人工的操作非常容易出問題,我們應該讓程序幫忙自動進行管理和遷移。今天,筆者推薦一款開源的數(shù)據(jù)庫遷移工具 Flyway。

Flyway怎么對數(shù)據(jù)庫腳本自動化管理

Flyway 不僅可以支持 MySQL,它也可以支持非常多其他的數(shù)據(jù)庫。Flyway怎么對數(shù)據(jù)庫腳本自動化管理

事實上,Spring Boot 已經(jīng)完美整合了 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。

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

當系統(tǒng)程序啟動時,它會自動創(chuàng)建 flyway_schema_history 文件。(當然,也可以自己手動創(chuàng)建)。這張表是 Flyway 的元數(shù)據(jù)表, 其保存著每次 migration 的記錄, 記錄包含 migration 腳本的版本號和 SQL 腳本的 checksum 值。當一個新的 SQL 腳本被掃描到后, Flyway 解析該 SQL 腳本的版本號, 并和 metadata 表對比, 如果該 SQL 腳本版本更新的話, 將在指定的 DB 上執(zhí)行該 SQL 文件, 否則跳過該 SQL 文件。

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 下手動創(chuàng)建一個初始化的 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;

那么,在程序再次啟動后,它會將其自動化發(fā)布到數(shù)據(jù)庫中。   

Flyway怎么對數(shù)據(jù)庫腳本自動化管理

這里,需要補充的知識點:Flyway 的版本比較規(guī)則。其采取左對齊原則,缺位用 0 代替。例如 1.1 比 1.0 版本高,1.1.1 比 1.1  版本高,而 1.1.01 和 1.1.1  版本一致。 并且,它們會按照版本排序且順序執(zhí)行。

Flyway怎么對數(shù)據(jù)庫腳本自動化管理

此外,F(xiàn)lyway 不僅支持 DDL,也同時支持 DML(insert、update、delete)等。因此,我們可以再創(chuàng)建一個 V1.2__INSERT_TAG_DATA.sql 文件來驗證一下。

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

最后,我們在來一起探討下Flyway 支持常見類型的 migration:

  • Versioned migrations:數(shù)據(jù)庫升級腳本

  • Repeatable migrations:可重復執(zhí)行,當腳本 checksums 改變時會重新執(zhí)行。

Flyway怎么對數(shù)據(jù)庫腳本自動化管理

  • prefix: 前綴標識,默認值 V 表示 Versioned, R 表示 Repeatable

  • version: 標識版本號, 由一個或多個數(shù)字構成, 數(shù)字之間的分隔符可用點.或下劃線_

  • separator: 用于分隔版本標識與描述信息, 默認為兩個下劃線__

  • description: 描述信息, 文字之間可以用下劃線或空格分隔

  • suffix: 后續(xù)標識, 默認為.sql

總結一下,F(xiàn)lyway 通過元數(shù)據(jù)(flyway_schema_history)幫忙我們自動化維護和管理數(shù)據(jù)庫的版本遷移。

“Flyway怎么對數(shù)據(jù)庫腳本自動化管理”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI