2016-11-17 116 views
1

我已經看到關於FlyWay處理多個數據庫的文章,但它似乎都是獨立的數據庫。據我瞭解,FlyWay每個實例只能處理一個數據庫,因此創建/清理數據庫模式是完全獨立的。FlyWay與相互依賴的數據庫

Multiple datasources migrations using Flyway in a Spring Boot application

我們的問題可能是由壞數據庫設計源於但它是什麼,它不會很快改變。至於背景,這是一個MSSql DB的C#舊式應用程序,我們目前只是使用FlyWay命令行進行評估。

DB(s)是這樣設置的。

  • AppDB
  • AppLogDB
  • AppAuditDB
  • AppArchiveDB
  • ...

我有例子,其中AppDB享有/程序/ etc中引用其他表。還有其他DB訪問AppDB的情況(IE ArchiveDB存儲過程將從AppDB中獲取)。

在不同的數據庫之間存在這種依賴關係,是否有FlyWay可以按需要的順序處理migration/clean?例如

如果我有腳本

  • 這個命令AppDB
    1. V1__Create_table
    2. V2__Create_proc_pointing_to_ArchiveDB
  • ArchiveDB
    1. V1__Create_table
    2. V2__Create_proc_pointing_to_AppDb

這怎麼可能重新做處理它更像是這個

  • AppDB,ArchiveDB
    1. V1__AppDB_Create_table
    2. V2__ArchiveDB_Create_table
    3. V3__AppDB_Create_proc_pointing_to_ArchiveDB
    4. V4__ArchiveDB_Create_proc_pointing_to_AppDb

回答

0

這可能是一個棘手的問題,尤其是與你的ArchiveDB具有循環依賴。

我正在對一個項目進行類似的設置。它們實際上是Oracle數據庫中的不同架構,但我們選擇爲每個架構保留一個單獨的schema_version表(以嘗試使信息顯示易於管理)。我們使用的方法是以主要依賴順序爲我們的目錄編號,並確保我們按照該順序應用。你可能是:

10_AppDB 
20_AppLogDB 
30_AppAuditDB 
40_AppArchiveDB 

循環的依賴關係是有點更多的工作,以確保它們能正確應用到一個乾淨的環境。幸運的是,我們沒有遇到這個問題,但未來這可能會改變。我建議的方法是使部署錯開(使用migrate上的目標選項/屬性),以便按照必要的順序創建對象。然後,當在新環境中從頭創建時,您需要跨所有數據庫應用到第一個合併點,然後在所有數據庫上應用到下一個數據庫,依此類推。以你爲例:

# run flyway -target 2 for all DBs 
10_AppDB___/V1__AppDB_Create_table 
20_AppLogDB/V2__ArchiveDB_Create_table 
# run flyway -target 4 for all DBs 
10_AppDB___/V3__AppDB_Create_proc_pointing_to_ArchiveDB 
20_AppLogDB/V4__ArchiveDB_Create_proc_pointing_to_AppDb