Mysql

在本地複制數據庫結構

  • October 15, 2017

在我使用 PHP 和 MySQL 設置 Web 應用程序時,我為每個使用者的私人數據使用單獨的數據庫。所以本質上,每個經過身份驗證的使用者只能訪問兩個不同的數據庫 myappdb_public 和 myappdb_user_###。使用者憑據將保存在單獨的數據庫 myappdb_creds 中。此設置背後的想法是在維護共享數據資源的同時提高私有數據的安全性。

  1. 有沒有辦法從另一個數據庫結構設置的“模板”創建一個新數據庫。
  2. 有沒有辦法在更新模板時更新所有“子”數據庫結構?

我以前使用過複製,但這是一個完全不同的設置,並且不確定是否有一種方法可以僅在同一本地伺服器上的多個數據庫之間複製結構。

複製

“數據庫複製”是指將任何傳入的插入/更新/刪除語句動態復製到另一個相同的數據庫。主數據庫和輔助數據庫被認為是“副本”,因為它們始終包含由相同歷史記錄產生的相同數據,儘管輔助數據庫可能會延遲一小段時間。輔助節點可以代替主節點用於只讀查詢。在故障轉移的情況下,輔助節點可能會轉換為主節點。

移民

您正在尋找的是鬆散地稱為 “數據庫遷移”,也稱為模式遷移。這裡的想法是重現與另一個數據庫相同的結構( DDL )。但是每個生成的數據庫都獨立於其他數據庫,每個數據庫中都儲存了不同的使用者數據。

  • 一個典型的例子是多租戶
  • 另一種用途可能是作為垂直市場應用程序的一部分,該應用程序被許可給各種客戶,在每次新銷售中,您需要按照應用程序預期的特定配置建立一個新數據庫。

遷移工具

開發人員和 DBA 過去常常手動執行此遷移工作,設計自己的臨時解決方案或習慣。幸運的是,我們現在可以選擇工具來幫助完成這項繁瑣但至關重要的工作。

飛路

我最喜歡的工具是Flyway。內置 Java,但包裝為命令行執行檔,因此您可以從腳本或其他工具中使用。

Flyway 執行一系列 SQL 腳本,以及您可以編寫的可選 Java 庫。執行順序由一定的文件命名方案決定。

在數據庫中自動創建一個表來跟踪腳本執行。當遇到新腳本時,Flyway 會檢測到它們並適當地執行那些尚未應用於該特定數據庫的腳本。

Flyway 或其他此類工具不僅在生產中非常有用,而且在測試和開發中也非常有用。您可以自動重新創建一次性數據庫,甚至將其升級到其模式演變歷史中的任何特定點。

任何考慮 Flyway 的人也應該考慮另一個非常相似的產品:Liquibase

其他選擇也存在,例如商業工具Redgate

模板

一些數據庫(例如Postgres )提供了模板,您可以在其中創建一些表和索引等在數據庫中。之後,您可以創建一個全新的數據庫,其初始狀態是從該狀態復製而來的。

事實上,Postgres 總是以這種方式工作,當您在沒有明確指定任何其他模板的情況下請求數據庫時,預設情況下透明地使用wheretemplate0和databases。template1

模板只解決創世問題,入門。您幾乎肯定會在以後發展您的數據庫。您將添加或刪除表、列、索引等。您可能需要執行程式碼來批量轉換或更新現有數據。為此,您將需要使用遷移工具,因為模板在初始生成後無法幫助您。因此,在我看來,我不會為定義模板而煩惱,而是使用遷移腳本進行所有初始設置。

引用自:https://dba.stackexchange.com/questions/188496