1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Springboot集成flyway實(shí)現(xiàn)數(shù)據(jù)庫自動(dòng)遷徙

        共 4380字,需瀏覽 9分鐘

         ·

        2021-03-29 04:27

        點(diǎn)擊藍(lán)色字關(guān)注我們!




        一個(gè)努力中的公眾號(hào)

        長(zhǎng)的好看的人都關(guān)注了

        前言

            Flyway是一款管理并跟蹤數(shù)據(jù)庫遷移(migrate)的數(shù)據(jù)庫版本管理工具。它可以像SVN管理不同人的代碼那樣,管理不同人的sql腳本,從而做到數(shù)據(jù)庫同步。

            它可以幫助我們?cè)诓煌h(huán)境保持?jǐn)?shù)據(jù)庫的同步,減少手工操作,同時(shí)也減少了遺漏的機(jī)會(huì)。

            Flyway可以集成在項(xiàng)目中,可以與Spring 框結(jié)合。在項(xiàng)目發(fā)版時(shí),自動(dòng)執(zhí)行數(shù)據(jù)庫腳本,無需人為執(zhí)行數(shù)據(jù)庫同步操作。

        1.添加flywaymaven添加依賴

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

        將上面的依賴添加到主項(xiàng)目的pom.xml中

        2. 在application.yml 配置文件中配置flyway相關(guān)配置

        需要注意的是,flyway配置放在spring配置下、根據(jù)自己實(shí)際情況配置相關(guān)參數(shù)

        # flyway 配置
        flyway:
        # 執(zhí)行基線時(shí)用來標(biāo)記已有Schema的版本.(默認(rèn)值:1)
        baseline-version: 1
        # 開啟Flyway(默認(rèn)true)
        enabled: true
        # SQL遷移的文件名前綴(默認(rèn)值為V 可以不設(shè)置)
        sql-migration-prefix: V
        # 遷移sql腳本文件名稱的分隔符(默認(rèn)2個(gè)下劃線__)
        sqlMigrationSeparator: __
        # SQL遷移的文件名后綴(默認(rèn)值:.sql 可以不設(shè)置)
        sql-migration-suffixes: .sql
        # 遷移時(shí)是否進(jìn)行校驗(yàn),默認(rèn)true
        validateOnMigrate: true
        # 在沒有元數(shù)據(jù)表的情況下,針對(duì)非空Schema執(zhí)行遷移時(shí)是否自動(dòng)調(diào)用基線。
        baseline-on-migrate: true
        # 遷移腳本的位置(默認(rèn)為classpath:db/migration)
        locations: classpath:db/migration
        # 數(shù)據(jù)庫連接配置
        url: ${spring.datasource.dynamic.datasource.master.url}
        user: ${spring.datasource.dynamic.datasource.master.username}
        password: ${spring.datasource.dynamic.datasource.master.password}
        # 需要升級(jí)的數(shù)據(jù)庫實(shí)例名
        schemas: jeecg-boot
        # 編碼格式
        encoding: UTF-8
        # 忽略腳本順序:開發(fā)環(huán)境應(yīng)該設(shè)置trueflyway將能加載漏掉的老版本SQL文件 生成環(huán)境需要設(shè)置false
        out-of-order: true
        # 發(fā)生驗(yàn)證的錯(cuò)誤時(shí)是否執(zhí)行clean操作(如SQL執(zhí)行失?。J(rèn)false,生產(chǎn)中必須使用false。
        clean-on-validation-error: true
        # 是否禁用clean操作,默認(rèn)false,生產(chǎn)中必須使用true
        clean-disabled: false

        Springboot flyway配置說明

        -- spring boot flyway 配置說明
        flyway.baseline-description對(duì)執(zhí)行遷移時(shí)基準(zhǔn)版本的描述.
        flyway.baseline-on-migrate當(dāng)遷移時(shí)發(fā)現(xiàn)目標(biāo)schema非空,而且?guī)в袥]有元數(shù)據(jù)的表時(shí),是否自動(dòng)執(zhí)行基準(zhǔn)遷移,默認(rèn)false.
        flyway.baseline-version開始執(zhí)行基準(zhǔn)遷移時(shí)對(duì)現(xiàn)有的schema的版本打標(biāo)簽,默認(rèn)值為1.
        flyway.check-location檢查遷移腳本的位置是否存在,默認(rèn)false.
        flyway.clean-on-validation-error當(dāng)發(fā)現(xiàn)校驗(yàn)錯(cuò)誤時(shí)是否自動(dòng)調(diào)用clean,默認(rèn)false.
        flyway.enabled是否開啟flywary,默認(rèn)true.
        flyway.encoding設(shè)置遷移時(shí)的編碼,默認(rèn)UTF-8.
        flyway.ignore-failed-future-migration當(dāng)讀取元數(shù)據(jù)表時(shí)是否忽略錯(cuò)誤的遷移,默認(rèn)false.
        flyway.init-sqls當(dāng)初始化好連接時(shí)要執(zhí)行的SQL.
        flyway.locations遷移腳本的位置,默認(rèn)db/migration.
        flyway.out-of-order是否允許無序的遷移,默認(rèn)false.
        flyway.password目標(biāo)數(shù)據(jù)庫的密碼.
        flyway.placeholder-prefix設(shè)置每個(gè)placeholder的前綴,默認(rèn)${.
        flyway.placeholder-replacementplaceholders是否要被替換,默認(rèn)true.
        flyway.placeholder-suffix設(shè)置每個(gè)placeholder的后綴,默認(rèn)}.
        flyway.placeholders.[placeholder name]設(shè)置placeholdervalue
        flyway.schemas設(shè)定需要flywary遷移的schema,大小寫敏感,默認(rèn)為連接默認(rèn)的schema.
        flyway.sql-migration-prefix遷移文件的前綴,默認(rèn)為V.
        flyway.sql-migration-separator遷移腳本的文件名分隔符,默認(rèn)__
        flyway.sql-migration-suffix遷移腳本的后綴,默認(rèn)為.sql
        flyway.tableflyway使用的元數(shù)據(jù)表名,默認(rèn)為schema_version
        flyway.target遷移時(shí)使用的目標(biāo)版本,默認(rèn)為latest version
        flyway.url遷移時(shí)使用的JDBC URL,如果沒有指定的話,將使用配置的主數(shù)據(jù)源
        flyway.user遷移數(shù)據(jù)庫的用戶名
        flyway.validate-on-migrate遷移時(shí)是否校驗(yàn),默認(rèn)為true.
        -- spring boot flyway 配置說明


        3.在遷移腳本的文件夾中創(chuàng)建對(duì)應(yīng)sql腳本


        寫入相關(guān)sql語句


          SpringBoot應(yīng)用運(yùn)行時(shí)flyway會(huì)根據(jù)腳本進(jìn)行數(shù)據(jù)庫的初始化,執(zhí)行的順序會(huì)根據(jù)腳本版本號(hào)由低到高按順序執(zhí)行(1.0 -> 1.0.1 -> 1.0.2),每執(zhí)行完一個(gè)版本腳本都會(huì)向記錄表flyway_history_schema插入一條數(shù)據(jù)。

         若添加了新的版本腳本,應(yīng)用啟動(dòng)時(shí)flyway會(huì)根據(jù)腳本文件版本到記錄表flyway_history_schema查詢是否有對(duì)應(yīng)的版本腳本被執(zhí)行了,如果沒有相應(yīng)的版本腳本記錄才會(huì)執(zhí)行腳本。
         
        不過需要注意:flyway不支持版本回滾。(需手動(dòng),比較悲劇的一點(diǎn))、所以需要準(zhǔn)備兩份sql,如果遷移的sql執(zhí)行成功后需要回滾,就執(zhí)行對(duì)應(yīng)的回滾sql,如果遷移失敗,flyway可以通過注解執(zhí)行回滾。


        4.啟動(dòng)了SpringBoot項(xiàng)目后,就會(huì)自動(dòng)幫你執(zhí)行SQL文件

         執(zhí)行歷史可以在 flyway_schema_history 表中查看、已經(jīng)執(zhí)行過的遷移sql就不會(huì)再執(zhí)行,主要是在這個(gè)歷史表中控制,如果需要重新執(zhí)行,那么刪除對(duì)應(yīng)版本及以后的執(zhí)行歷史重啟項(xiàng)目就會(huì)重新執(zhí)行對(duì)應(yīng)腳本

        刷新對(duì)應(yīng)數(shù)據(jù)庫,就可以看到通過遷移腳本生成的表結(jié)構(gòu)。


        使用總結(jié)


            我們是在中途嘗試使用flyway,所以開發(fā)環(huán)境會(huì)有一個(gè)已存在的數(shù)據(jù)庫。我們需要從開發(fā)環(huán)境中導(dǎo)出數(shù)據(jù)庫腳本,并對(duì)開發(fā)環(huán)境數(shù)據(jù)庫進(jìn)行baseline標(biāo)記。導(dǎo)出的腳本可用于新環(huán)境的部署。

            如果我們已經(jīng)有了生產(chǎn)環(huán)境,而且生產(chǎn)環(huán)境和開發(fā)環(huán)境的數(shù)據(jù)庫已經(jīng)有了較大的差異。暫時(shí)可以想到的方案大概有2個(gè)方案:

        方案一:

           在生產(chǎn)環(huán)境備份數(shù)據(jù)庫,然后創(chuàng)建一個(gè)全新的數(shù)據(jù)庫,手動(dòng)將備份庫里的數(shù)據(jù)導(dǎo)入到新的數(shù)據(jù)庫。

        方案二:

           基于生產(chǎn)環(huán)境的數(shù)據(jù)庫,創(chuàng)建V1版本的腳本;基于開發(fā)庫相對(duì)于生產(chǎn)庫的變更,創(chuàng)建V2版本的腳本。在開發(fā)環(huán)境baseline,然后修改版本記錄,改為2。在生產(chǎn)環(huán)境中baseline,然后migrate使其升級(jí)到2。

        方案一:
           需要更多的人工介入,但是比較穩(wěn)妥;
        方案二:
           難點(diǎn)在于溯源出正確的差異,編制V2腳本。



        本次的學(xué)習(xí)到這里就結(jié)束了,因?yàn)閳D圖也是第一次接觸這種數(shù)據(jù)遷移軟件,所以總結(jié)不是很到位,如果有問題可以加圖圖微信,大家一起學(xué)習(xí)、一起來解決。

        如果對(duì)您有幫助 請(qǐng)點(diǎn)個(gè)關(guān)注,萬分感謝
                  

                                        (QQ招聘群  710566091
                                         微信招聘群 請(qǐng)加圖圖微信)

        
                        
        瀏覽 88
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人免费无码大片A毛片 | 精品久久久久久久久久岛国gif | 爱爱视频天天看 | 97香蕉久久国产超碰青草软件 | 日本泡妞xxxxxxxxx78 | 超碰入口 | h视频国产 | 免费成年人| 久久亚洲精品成人777 | 女人扒开腿秘 免费网站中国 |