2014-02-23 34 views
6

我想更好地瞭解Liquibase如何執行更改集。更好地理解Liquibase如何執行更改集

1)

一個)例如我有一個更改日誌與4分變更集和我執行updateDatabase(http://www.liquibase.org/documentation/ant/updatedatabase_ant_task.html)。 Liquibase將執行4個更改集。

b)如果我再次運行相同的更改日誌Liquibase不執行任何設置。

c)如果我將添加一個新的更改集到更改日誌中並運行更改日誌,Liquibase將僅執行新的更改集。

問題:

  • Liquibase如何知道什麼樣的變化將要執行?

  • Liquibase如何知道已執行的更改集?

2)變更集ID的重要性如何?我可以在更改日誌執行後更改它嗎?

3)變更集作者是如何重要的?我可以在更改日誌執行後更改它嗎?

4)如果我將執行回滾數據庫(http://www.liquibase.org/documentation/ant/rollbackdatabase_ant_task.html),會發生什麼? Liquibase如何知道更改設置爲回滾?

a)如果我將在a)之後執行回滾會發生什麼情況。 Liquibase會調用位於每個更改集(4個回滾元素)中的回滾元素嗎? b)如果我在1 b)後執行回滾會發生什麼情況。 Liquibase如何知道不會調用任何回滾元素?

c)如果我將在1 c)後執行回滾會發生什麼情況。 Liquibase會調用只有新變更集的回滾元素嗎?

回答

8

我可以回答幾個問題,也許不是全部。

  1. c。 - 當您執行第一次更新時,Liquibase會在數據庫中創建2個新表。主表是DATABASECHANGELOG,用於跟蹤哪些更改集已應用於數據庫。 Liquibase使用多種方法來識別每個變更集 - id,作者和路徑被用作組合鍵。 Liquibase還會生成每個變更集的校驗和,用於確定變更集是否在應用到數據庫後發生了變化。

  2. 和3.因爲更改集id和作者被用作主鍵的一部分,所以如果您部署了,然後更改其中之一,則可能會在後續部署中遇到意外的行爲。我認爲ID和作者也是校驗和計算的一部分,所以也可能會影響事物。我建議您在部署後不要更改這些內容。

  3. 回滾使用相同的機制來知道要回滾的更改集。當你回滾你必須以某種方式有什麼變化撤消指定 - 看到這個頁面瞭解更多信息:http://www.liquibase.org/documentation/rollback.html

回滾識別機制是由標籤(這意味着你必須在部署應用標籤) ,按日期(Liquibase跟蹤每個變更集的部署時間),還是按數字(隱式使用每個變更集部署時的日期/時間)。

+0

謝謝! Liquibase創建的第二張表是什麼? 另外,你能回答這個問題嗎? http://stackoverflow.com/questions/21847482/does-liquibase-support-dry-run – Michael

+0

第二個是DATABASECHANGELOGLOCK表,它只是用來確保對DATABASECHANGELOG的操作已成功完成。基本上,每次應用liquibase獲取鎖的更改,進行更改,然後釋放鎖。 – SteveDonie

+1

DATABASECHANGELOGLOCK用於確保在多臺機器共享相同數據庫的分佈式環境中,只有一臺機器試圖同時更新數據庫。 –