[心得] 如何利用liquibase進行資料庫版本控制 - 實際練習
透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了!
這篇我們就來做個簡單的版本演練,加深印象吧!
我使用的環境如下
System : Windows 7
Database : SQL Server 2008 R2
而因為liquibase 要連線到SQL Server還需要JDBC的套件,各位如果需要的話,可以到這裡抓取 。 抓取後記得將對應的jar檔放到liquibase\lib資料夾底下 :)
上一篇我們是每次要做一個新的版本就建立一個新的檔案,然後進行版本更新
但其實liquibase是可以讓你集中利用一個檔案進行控管(當然其它版本的檔案是分散的)
這樣做的好處是,每當建立一個新的版本,你只需要在主要的ChangeLog裡面添加本次新版本檔案的路徑。
在還原與更新時,只需要利用主要的ChangeLog檔就可以進行對應的動作
在先前的文章裡,你可能會發現到liquibase 很常用到--changeLogFile這行參數,這行參數其實是用來指定你目前要操作的異動log檔路徑
每次都要打一定會覺得很煩人對吧!(其實還要額外加上連線路徑呢)
所以在這裡介紹一下liquibase.properties的用法
liquibase.properties其實就是將你常用到的一些參數整進一個設定檔中,如此一來你在打指令的時候,就不用再打一些額外的參數啦!
這個檔案只要跟liquibase的cmd放在同一層目錄下,在執行的時候他就會自動去找這個檔案囉!
基本設定的參數如下(這裡以SQL Server為例)
driver: com.microsoft.sqlserver.jdbc.SQLServerDriver
classpath: ./lib/sqljdbc42.jar
url: jdbc:sqlserver://localhost:14333;database=StudentTrace;
username: stu
password: stu123
changeLogFile: MainChangeLog.xml
可以看到我們在最後一行指定了changeLogFile的檔名與路徑(只有指定檔名的話,代表檔案跟liquibase cmd同一層),
不像之前我們都是用.sql檔做為我們的changeLogFile,這裡的MainChangeLog.xml其實就是剛剛提到的「主要」ChangeLogFile檔啦!
透過這個檔我們會將其它的changeLogFile包進來使用。
這個檔的實際內容如下
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<include file="TestDbChangeLog_V1.0.sql"/>
<include file="TestDbChangeLog_V1.1.sql"/>
</databaseChangeLog>
有沒有注意到include這段,我們將我們先前建立的TestDbChangeLog V1.0與V1.1都包進來了。
而這個檔的內容變化其實會有點像下面這個圖

廢話不多說,我們就來實際演練一次
首先我們先建立好我們兩個版本的.sql檔分別為TestDbChangeLog_V1.0與TestDbChangeLog_V1.1
內容如下
TestDbChangeLog_V1.0
--liquibase formatted sql
--changeset author:Jaja tag:ver1.0
CREATE
TABLE Admin
(
ID INTEGER NOT NULL IDENTITY NOT FOR REPLICATION ,
UserID NVARCHAR (50) NOT NULL ,
UserPassword NVARCHAR (50) NOT NULL ,
FK_UserRole INTEGER NOT NULL
)
ON "default"
;
--rollback DROP TABLE Admin
TestDbChangeLog_V1.1
--liquibase formatted sql
--changeset author:Jaja tag:ver1.1
CREATE
TABLE Account
(
ID INTEGER NOT NULL IDENTITY NOT FOR REPLICATION ,
UserID NVARCHAR (50) NOT NULL ,
UserPassword NVARCHAR (50) NOT NULL )
ON "default"
;
--rollback DROP TABLE Account
再來就是建立好我們的MainChangeLog.xml 做為我們統一的版本控制檔 (記得要設定好liquibase.properties唷)
一開始的內容如下
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd"> </databaseChangeLog>
接下來我們就來練習版本推進的過程吧!
假設我們現在要做第一版V1.0的發佈更新,我們要做的動作就是
1.確定第一版V1.0的ChangeLogFile路徑
2.添加路徑到我們的MainChangeLog.xml
3.進行發佈更新
以下就來看看我們動作做的結果
添加路徑到我們的MainChangeLog.xml (這裡因為我ChangeLogFile都直接放在liquibase的根目錄下,所以直接加上檔名就好了)
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<include file="TestDbChangeLog_V1.0.sql"/><!--我們第一個版本檔案位置 --> </databaseChangeLog>
接下來我們就進行版本更新囉!這裡我是用PowerShell ISE方便來看我們指令的流程。你也可以用一般的CMD進行
可以看到我們資料庫在未進行異動更新前,空空如也~~~

接下來就執行我們異動更新的指令(因為我們已經設定了liquibase.properties,所以直接打指令就行了)
這裡用到的指令是liquibase update
確定更新成功後再回頭來看看我們的資料庫 (這裡因為是用PowerShell會有錯誤的提示,但這不會影響我們執行的內容)
可以看到我們資料庫有根據我們TestDbChangeLog_V1.0.sql內容,建立了一張資料表。此外還多出了兩張資料表,這兩張資料表其實是liquibase用來做更新追蹤使用的

下一步我們做一樣的動作,這次把TestDbChangeLog_V1.1.sql 加入到我們的MainChangeLog.xml
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<include file="TestDbChangeLog_V1.0.sql"/> <!--我們第一個版本檔案位置 -->
<include file="TestDbChangeLog_V1.1.sql"/> <!--我們第二個版本檔案位置 -->
</databaseChangeLog>
加入新的版本後記得執行liquibase update 進行異動更新
到這裡我們的資料庫一共會有四張資料表,其中兩張資料表分別是版本V1.0 (Admin) 與V1.1 (Account) 建立的

再來我們就要練習rollback (退版的過程)
rollback退版的動作,其實是依照你changeLog裡面寫的動作來執行,所以如果指令太龐大的話,還是利用一些工具進行產生比較好。
而退版的流程其實就像下圖

這裡的執行「TestDbChangeLogVer1.1.sql裡面的rollback 區段語法」是什麼意思?
我們回頭來看看這個檔裡面我們寫了些什麼
--liquibase formatted sql
--changeset author:Jaja tag:ver1.1
CREATE
TABLE Account
(
ID INTEGER NOT NULL IDENTITY NOT FOR REPLICATION ,
UserID NVARCHAR (50) NOT NULL ,
UserPassword NVARCHAR (50) NOT NULL )
ON "default"
;
--rollback DROP TABLE Account
要注意到的是所謂的rollback區段,也就是最後一行--rollback DROP TABLE Account
這一行就會是當我們要從V1.1回到V1.0時,在資料庫上會執行的對應語法
實際的概念其實很簡單,每次當我們建立一個新的版本的時候,我們就要在rollback區段裡面,寫下如何還原到上一個版本的語法
聽起來是不是霧裡看花...
以我們V1.1的內容為例的話,我們在V1.1這個版本,多「建立」了一個新的資料表叫Account,所以對應的rollback語法,就會是「移除」這個Account資料表
所以反過來思考,如果是新增欄位的話,rollback就要寫移除欄位。其它的對應就要靠DBA您來想了!
這裡我們一樣來練習一下Rollback語法使用
我們可以先查一下liquibase替我們建立好的版本歷程資料表,可以看到我們目前是有兩個版本

接下來就是要做Rollback的動作了,根據上圖。我們可以知道我們目前是在V1.1這個版本(可以看到他有一個ORDEREXECUTED執行順序)
所以我們要回到上一版的話,可以下這樣的指令
liquibase rollbackCount 1 (意思是我們往回退「一個」版本)
執行結果如下

再次查看記錄表與重整資料庫後會發現,版本少了一個。而資料庫也確實將Account資料表移除了


到這裡不曉得各位有沒有什麼問題呢?
其實liquibase已經出來一段時間了,網路上的教學資源也蠻多的,如果可以利用這個做小小的版本控制
在目前Agile當道的情況下,DBA也能跟著一起Agile也不錯呢!
不過你可能會覺得疑惑,如果我目前已經有資料庫了或是正要建資料庫,要怎麼結合使用呢?
如果你已經有資料庫了,liquibase也有一道指令,可以讓你把目前資料庫的內容導出來變成changeLog格式。
指令是 liquibase --changeLogFile {你想要的changeLogFileName} generateChangeLog (這裡要注意的是,凡是有用到--changeLogFile這個參數呀!一定都要加在最前面,不然就會無法正常執行唷!)
而如果你是正要建資料庫呢?這裡其實也很容易,一般我們在建資料庫前都會利用ER Model進行建模,最後再轉成實際的資料庫內容
其實就直接利用ER Model工具,將第一版的changeLogFile利用SQL format建立起來就好了唷!
以上就是這次的liquibase介紹,咱們下次見 :D
參考資料 :
http://blog.ctp.com/2014/09/02/database-migrations-with-liquibase/
http://blog.kent-chiu.com/2014/08/30/liquibase-101.html#section-2
https://blog.synyx.de/2012/08/migrating-data-with-liquibase/
http://www.neevtech.com/blog/2013/08/28/liquibase-a-time-machine-for-your-data/
https://pyrseas.wordpress.com/2011/03/01/sql-database-version-control-%E2%80%93-liquibase/
[心得] 如何利用liquibase進行資料庫版本控制 - 實際練習的更多相关文章
- [心得] 如何利用liquibase進行資料庫版本控制 - 基礎觀念
前言 - 會寫這篇除了是要記錄一下使用的過程之外,也是發現到網路上找來的教學幾乎都是跟其它環境做結合 比較沒有單純利用command進行的流程.也沒有整體觀念的介紹,所以將我所理解的整理分享給大家. ...
- Active Record: 資料庫遷移(Migration) (转)
Active Record: 資料庫遷移(Migration) Programming today is a race between software engineers striving to b ...
- Delphi APP 開發入門(八)SQLite資料庫
Delphi APP 開發入門(八)SQLite資料庫 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次 ...
- 如何將 MySQL 資料庫轉移到 Microsoft SQL Server 與 Azure SQL Database
MySQL 是相當常用之資料庫伺服器,而微軟雲端服務 Microsoft Azure 上 Azure SQL Database 是一個功能強大且經濟實惠的選擇,透過本篇文章,使用 SQL Server ...
- vb.net 水晶報表CrystalReport 動態設定資料庫來源
沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.confi ...
- [转]SQL Server 安全性概論與無法刪除資料庫使用者的解決辦法
經常有人來問我特定 SQL Server 資料庫裡的使用者無法刪除的問題,這問題其實跟 SQL Server 的安全性架構有很大關係,解決這個問題當然還是瞭解觀念的重要性大於知道如何解決問題.除了講解 ...
- 安卓初級教程(4):sqlite建立資料庫
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ...
- [MVC4-基礎] 從資料庫取值顯示在DropDownList中
剛開始學MVC4,以下是一些基礎的學習筆記! 完成效果像下面這樣,資料來源是既有的Database. 1.Controller public ActionResult Index() { SqlCon ...
- VB.Net DataSet 填充資料庫內容
'導入命名空間Imports System.Data.OleDb '定義變量 Dim ds As DataSet = New DataSet() Dim i, cn As Integer Dim Sq ...
随机推荐
- 《SpringMVC从入门到放肆》八、SpringMVC注解式开发(基本配置)
上一篇我们结束了配置式开发,配置式开发目前在企业中用的并不是很多,大部分企业都在使用注解式开发,所以今天我们就来学习注解式开发.所谓SpringMVC注解式开发是指,处理器是基于注解的类的开发方式.对 ...
- laravel-神奇的服务容器(转)
原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器 ...
- docker 数据卷管理
在生产环境中使用docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这涉及到容器对数据管理的操作 容器对数据的管理主要有两种方式: 数据卷(Data Volumes): 容器内 ...
- 【原创】.Net WebForm Calendar 日历控件常用方法
微软官方地址 https://msdn.microsoft.com/en-us/library/add3s294.aspx 1.设置日历控件单个日期Table Cell样式 颜色/外观/边距 prot ...
- vue 值的更新
用了vue开发了一段时间,基本上感觉都是比较好用的一个框架,刚开始还是会存在一些小坑的东西,这里先浅谈下值的更新问题. 1.本组件的一些变量,或者是主view(路由页面)一些值,是通过vuex 中st ...
- 2003server r2 + sql 2000 sp4 环境配置
由于工作需求需要配置一个windows 2003 server r2 + sql 2000 sp4的环境: 一.2003server准备系统: msdn 下载 分清x86还是x64 一共有两个cd准备 ...
- Document APIs
本节首先简要介绍Elasticsearch的数据复制模型,然后详细描述以下CRUD API: Single document APIs Index API Get API Delete API Upd ...
- 欢迎访问我的独立博客 tracefact.net (2019.1.30)
欢迎访问我的独立博客 tracefact.net 长期以来,我都同时维护着两个博客,博客园和 tracefact.net,感觉有点分散精力,所以博客园以后不再每篇文章都同步更新了. 我会挑个别比较好的 ...
- [译文]Domain Driven Design Reference(六)—— 提炼战略设计
本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 其它本系列其它文章 ...
- 深入理解JVM(七)——性能监控工具
前言 工欲善其事必先利其器,性能优化和故障排查在我们大都数人眼里是件比较棘手的事情,一是需要具备一定的原理知识作为基础,二是需要掌握排查问题和解决问题的流程.方法.本文就将介绍利用性能监控工具,帮助开 ...