數(shù)據(jù)庫(kù)物理隔離 (schema級(jí)別) 之 Liquibase入門實(shí)踐

目錄

[toc]

背景

由于SaaS項(xiàng)目需要提供多租戶之間物理隔離的數(shù)據(jù)庫(kù)實(shí)現(xiàn)方案, 為了標(biāo)準(zhǔn)化操作, 所以采用了Liquibase這樣一款數(shù)據(jù)庫(kù)同步備份工具, 從一個(gè)模板文件中動(dòng)態(tài)的在一個(gè)新schema中創(chuàng)建與模板庫(kù)中相同的表結(jié)構(gòu)以及數(shù)據(jù)的初始化操作


思考

  • 如何有效的管理schema與數(shù)據(jù)庫(kù)賬戶, 特別是防止數(shù)據(jù)泄露?
  • 如何在服務(wù)運(yùn)行期間卸載和裝載數(shù)據(jù)源?
  • 如何在項(xiàng)目中有效的完成動(dòng)態(tài)數(shù)據(jù)源功能, 數(shù)據(jù)源加載太多是否有坑?

實(shí)踐

前言: 我也是首次使用Liquibase, 如果有使用不對(duì)的地方還請(qǐng)留言指正, 網(wǎng)絡(luò)上能參考的文章實(shí)在有限, 我也是問(wèn)了之前實(shí)踐過(guò)的同事, 才慢慢整理出一個(gè)使用實(shí)踐. 記錄一下為了以防自己在將來(lái)忘記的時(shí)候可以回過(guò)來(lái)看看, 另外也希望能幫助到新入坑的小伙伴


官方文檔

官方文檔
在看官方文檔的時(shí)候也有很多不明白的地方, 都是一點(diǎn)一點(diǎn)慢慢摸索過(guò)來(lái)的


項(xiàng)目選型

  • JDK8
  • SpringBoot
  • Bootstrap
  • mysql

Maven依賴與pom配置

由于我的目標(biāo)是完成一個(gè)web項(xiàng)目, 所以我的pom文件里面至少會(huì)引入如下幾個(gè)依賴 (由于直接貼全部pom內(nèi)容太長(zhǎng). 為了不影響閱讀, 我只貼出關(guān)鍵的幾個(gè)依賴):

  • druid
  • mysql-connector-java
  • spring-boot-starter-web
  • mybatis-plus
  • guava
<liquibase.version>3.6.3</liquibase.version>
<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
    <configuration>
        <!--引用配置文件-->
        <propertyFile>${basedir}/src/main/resources/liquibase.properties</propertyFile>
    </configuration>
</plugin>

上面配置文件的屬性在哪里看呢? 請(qǐng)看下面
官方文檔 -> documentation -> maven
傳送門, 雖然很有創(chuàng)造力. 但是告訴你進(jìn)入路徑也許比直接給你要更好

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>${liquibase.version}</version>
</dependency>

配置文件編寫

屬性編寫來(lái)源:
官方文檔 -> documentation -> maven -> liquibase:generateChangeLog
傳送門

outputChangeLogFile=src/main/resources/changeLog.xml
url=jdbc:mysql://host:port/schema?useUnicode=true&characterEncoding=UTF-8&useSSL=true
driver=com.mysql.jdbc.Driver
username=root
password=root
# 默認(rèn)沒(méi)有最后的data, 看需求, 我們需要導(dǎo)出默認(rèn)數(shù)據(jù), 如果僅僅要表結(jié)構(gòu), 注釋掉即可
diffTypes=tables,views,columns,indexes,foreignkeys,primarykeys,uniqueconstraints,data
# 輸出默認(rèn)的schema名稱關(guān)閉掉
outputDefaultCatalog=false

mvn命令生成changeLog

一般我們都是用IDEA, 所以我就直接從idea中執(zhí)行mvn命令了:


image.png

結(jié)果:


image.png

在代碼中完成changeLog.xml的使用

如果不是必要, 改一下配置文件, 使用update命令即可. 但是為了演示一下項(xiàng)目中的使用方法. 所以在寫一個(gè)簡(jiǎn)單的Demo參考:

public static void main(String[] args) throws Exception {
        ClassLoaderResourceAccessor classLoaderResourceAccessor = new ClassLoaderResourceAccessor(MainClass.class.getClassLoader());
        String changeLogFilePath = "changeLog.xml";
        String username = "root";
        String password = "root";
        String url = "jdbc:mysql://host:port/schema?useUnicode=true&characterEncoding=UTF-8&useSSL=true";
        Properties properties = new Properties();
        properties.setProperty("username", username);
        properties.setProperty("password", password);
        properties.setProperty("url", url);
        Connection connection = DruidDataSourceFactory.createDataSource(properties).getConnection();
        JdbcConnection jdbcConnection = new JdbcConnection(connection);
        Liquibase liquibase = new Liquibase(changeLogFilePath, classLoaderResourceAccessor, jdbcConnection);
        liquibase.update(new Contexts());
    }

執(zhí)行結(jié)果:

...
02:20:30.747 [main] INFO liquibase.executor.jvm.JdbcExecutor - INSERT INTO pw_test.DATABASECHANGELOG (ID, AUTHOR, FILENAME, DATEEXECUTED, ORDEREXECUTED, MD5SUM, `DESCRIPTION`, COMMENTS, EXECTYPE, CONTEXTS, LABELS, LIQUIBASE, DEPLOYMENT_ID) VALUES ('1573236305687-36', 'wuyujia (generated)', 'changeLog.xml', NOW(), 36, '8:c810b4f042f26f841b90130d43f54642', 'createIndex indexName=idx_user_id, tableName=t_task', '', 'EXECUTED', NULL, NULL, '3.6.3', '3237223574')
02:20:30.765 [main] DEBUG liquibase.executor.jvm.JdbcExecutor - 1 row(s) affected
02:20:30.785 [main] DEBUG liquibase.executor.jvm.JdbcExecutor - Release Database Lock
02:20:30.791 [main] DEBUG liquibase.executor.jvm.JdbcExecutor - UPDATE pw_test.DATABASECHANGELOGLOCK SET `LOCKED` = 0, LOCKEDBY = NULL, LOCKGRANTED = NULL WHERE ID = 1
02:20:30.823 [main] INFO liquibase.lockservice.StandardLockService - Successfully released change log lock
...

到數(shù)據(jù)庫(kù)中查看, 可以看到數(shù)據(jù)表以及數(shù)據(jù)已經(jīng)被完整的遷移完成


后續(xù)待完善設(shè)計(jì)思考

  1. 后續(xù)會(huì)和SpringBoot項(xiàng)目進(jìn)行完整的的結(jié)合, 預(yù)計(jì)為通過(guò)接口傳入?yún)?shù)即可完成schema的創(chuàng)建. 并維護(hù)數(shù)據(jù)庫(kù)連接信息.
  2. 業(yè)務(wù)項(xiàng)目初始化時(shí)通過(guò)接口來(lái)獲取數(shù)據(jù)庫(kù)連接信息
  3. 在業(yè)務(wù)項(xiàng)目中集成動(dòng)態(tài)數(shù)據(jù)源模塊. 由此來(lái)完成動(dòng)態(tài)數(shù)據(jù)源的加載, 卸載, 以及訪問(wèn)數(shù)據(jù)庫(kù)時(shí)的動(dòng)態(tài)路由
  4. 給一張大致的設(shè)計(jì)圖.


    image.png

結(jié)語(yǔ)

目前項(xiàng)目剛開始, 我也是剛剛接到要做的任務(wù). 所以先自己實(shí)踐一下. 為后面的項(xiàng)目開發(fā)做好準(zhǔn)備.
希望本文能簡(jiǎn)單的幫助到入坑同學(xué). 若本文有誤請(qǐng)幫忙指正.
愿我們?cè)絹?lái)越棒
本文為原創(chuàng), 轉(zhuǎn)贊請(qǐng)注明出處.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子行拢,更是在濱河造成了極大的恐慌誉简,老刑警劉巖葡盗,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钙姊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)夺刑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人隅熙,你說(shuō)我怎么就攤上這事『搜浚” “怎么了囚戚?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)轧简。 經(jīng)常有香客問(wèn)我驰坊,道長(zhǎng),這世上最難降的妖魔是什么吉懊? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任庐橙,我火速辦了婚禮,結(jié)果婚禮上借嗽,老公的妹妹穿的比我還像新娘态鳖。我一直安慰自己,他們只是感情好恶导,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布浆竭。 她就那樣靜靜地躺著,像睡著了一般惨寿。 火紅的嫁衣襯著肌膚如雪邦泄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天裂垦,我揣著相機(jī)與錄音顺囊,去河邊找鬼。 笑死蕉拢,一個(gè)胖子當(dāng)著我的面吹牛特碳,可吹牛的內(nèi)容都是我干的诚亚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼午乓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼站宗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起益愈,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梢灭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蒸其,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敏释,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年枣接,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了颂暇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡但惶,死狀恐怖耳鸯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膀曾,我是刑警寧澤县爬,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站添谊,受9級(jí)特大地震影響财喳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜斩狱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一耳高、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧所踊,春花似錦泌枪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至继薛,卻和暖如春修壕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背遏考。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工慈鸠, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灌具。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓青团,卻偏偏與公主長(zhǎng)得像像棘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子壶冒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 0. 前言 本文參考的主要是Spring Boot 1.5.8官方文檔,寫這篇文章的原因是截歉,在做Spring Bo...
    SYFHEHE閱讀 22,463評(píng)論 0 13
  • 前言 在Java項(xiàng)目開發(fā)中胖腾,項(xiàng)目的編譯、測(cè)試瘪松、打包等是比較繁瑣的咸作,屬于重復(fù)勞動(dòng)的工作,浪費(fèi)人力和時(shí)間成本宵睦。以往開發(fā)...
    JourWon閱讀 1,121評(píng)論 0 1
  • Cayenne 是一個(gè) Apache 下的持久層框架項(xiàng)目, 作用與 Hibernate / iBATIS 之類的持...
    Bailey_25a0閱讀 2,568評(píng)論 0 0
  • 陪著女兒一起到銀基影城來(lái)看電影记罚,先在家中貓眼電影上選,時(shí)間點(diǎn)壳嚎、位置桐智,都合適了,出發(fā)烟馅! 可我真的是瞌睡呀说庭,架不住女兒...
    頓悟而立且行且珍惜閱讀 466評(píng)論 0 1
  • 這兩天,上海女孩到江西男友老家過(guò)年郑趁,一頓飯導(dǎo)致分手的事引發(fā)熱議刊驴。對(duì)于此事,男女主角或許都有苦衷寡润,不可妄評(píng)功過(guò)捆憎。同為...
    花花世界213閱讀 343評(píng)論 0 0