在更新和應用程序的 RPM 時,是否有推薦的方法來更新數據庫架構?
我有一個非常標準的伺服器佈局:
- 2 在 Redhat 上執行 Tomcat 的應用程序伺服器。
- 2 在 Redhat 上執行 Postgres 的數據庫伺服器。一個數據庫是主數據庫並複製到從屬數據庫。
我想在更新網路應用程序時自動升級方案。Web 應用程序是使用 RPM 部署的。我不知道是否有推薦的方法。
除非您使用的工具具有對數據庫模式遷移的內置支持(如 ActiveRecord/Rails 所做的,儘管相當不安全) - 您需要在您的應用程序中自己完成。
通常的技術是在您的數據庫中創建一個表,其中包含有關模式和應用程序的元數據。您可以將其建構為鍵/值形式,或者作為具有多個列的單行;沒關係。無論哪種方式,此表都應儲存模式版本。
當您在應用程序啟動時連接時,在對數據庫執行任何其他操作之前,您應該查詢元數據表以獲取架構版本。如果它低於應用程序中的目前版本,您的應用程序應該將架構更改腳本從舊版本應用到新版本。為此,我使用
@Singleton @Startup
了 EJB3,並使用類載入器從嵌入在應用程序 jar 中的屬性文件中讀取模式更改腳本;您可能正在使用 Spring 或具有類似功能的類似框架。因為您有兩個應用程序伺服器,所以您可能必須
LOCK TABLE your_database_metadata_table
在開始應用更改之前確保兩個伺服器不會嘗試應用相同的數據庫遷移腳本。PostgreSQL 中的 DDL 更改比其他一些數據庫更容易,因為它支持事務性 DDL。您可以
BEGIN
進行事務,一次性應用所有數據庫更改 - DDL、元數據表更新等 - 和COMMIT
. 您不會因為應用了一半的架構更改而著陸。這僅在架構更改不會花費太長時間或者您可以承受延遲時才可行。如果您正在ALTER
處理 1 億行表的數據類型,那麼您不希望在單個大事務中執行此操作,除非其他一切都可以等待。如果您使用內置的流式複制,則會自動處理複製;它沒有區分 DDL 和 DML,就複製系統而言,它們都只是數據庫更改。
如果您使用的是另一個複制引擎,如 Slony-I 或 Bucardo,那麼這取決於複製引擎如何處理模式更改。這是特定於引擎的,因此您需要查看複製引擎的文件。(在 9.3 事件觸發器、邏輯複製和命令解析支持被添加到 PostgreSQL 核心之後,目前與 3rd 方複製和 DDL 更改的混亂應該會顯著改善。其中一些看起來會滑到 9.4。)
現在,如果您想在不中斷應用程序的情況下無中斷地更改 DDL,那將是另一個層面的樂趣。