簡體   English   中英

如何使用命令行將新的MySQL數據庫結構從開發人員遷移到生產網站?

[英]How do I migrate new MySQL database structure from dev to production website using the command line?

我有兩個網站環境(單獨的服務器,Media Temple DV):開發和生產。

我們開始在Production上構建網站,然后獲得了Dev服務器,所以我最初使用以下命令將Production數據庫移動到Dev:

$ mysqldump -a -u USERNAME -p DATABASE > OUTPUT.mysql
$ gzip OUTPUT.mysql

然后我創建了Dev服務器網站和數據庫,移動OUTPUT.mysql並在Dev上設置MySQL環境以進行導入:

$ mysql -u USERNAME -p DATABASE

set up environment for large data import: 
mysql> set global net_buffer_length=1000000; 
mysql> set global max_allowed_packet=1000000000;
mysql> exit

並使用以下命令將數據和架構導入Dev:

$ gunzip -f OUTPUT.mysql.gz
$ mysql -u USERNAME -p TARGET_DATABASE_NAME < OUTPUT.sql

現在我已經對Dev MySQL數據庫的結構進行了更改,例如在現有表中添加/刪除字段,以及添加表,我想將我的更改遷移到Production。

如何從Dev數據庫遷移更新的結構並使用命令行導入到Production中,類似於我最初的操作,但是沒有覆蓋實時數據? (我的所有實時數據都在生產中,因此無需從Dev中提取數據。)

使用phpMyAdmin,數據庫已經變得太大了(此外,命令行似乎更快更容易使用)。 最好遠離第三方工具或開源軟件,這似乎應該是一個簡單的過程,我可以扔進腳本。 或者我錯了,有什么更好的我錯過了?

更新 :所以,根據以下答案和附加閱讀,我最終編寫了一個PHP腳本,檢查實時數據庫和我的本地數據庫(包括一些更改)並比較表之間的差異。

該腳本使用兩個數據庫上的MySQL“SHOW TABLES”函數並比較,查找實時數據庫與本地數據庫中缺少哪些表。 對於缺少的這些表,我使用SHOW CREATE TABLE來獲取用於創建表的MySQL語句。

類似地,腳本通過在每個數據庫中的每個表上使用SHOW COLUMNS FROM $ table來查找缺少哪些列。 這個MySQL命令返回列名和屬性,因此我可以自動為缺少的列構建ALTER TABLE語句。

最后,PHP腳本將所有內容輸出為用於創建和更改表的SQL腳本,我在phpMyAdmin中運行。

你有兩個選擇:

  1. 手動檢查每個表並確定要執行的ALTER命令,以對生產環境進行與生產相同的更改

  2. 使用mysqldump備份生產服務器中的所有數據,並告訴它跳過DROP / CREATE TABLE語句(通過--help查看命令行選項)。 然后僅從開發服務器轉儲模式,將其導入生產服務器,並導入備份以重新獲取行。這要求您沒有刪除任何列。

將來,您需要開始跟蹤架構更改。 像Doctrine,ActiveRecord這樣的現代ORM有一些稱為“遷移”的東西,它可以幫助您管理這些並通過跟蹤模式版本將它們應用到數據庫中。

您需要生成一些SQL語句來升級數據庫的結構。

至少,您可以使用mysqldump轉儲沒有數據的數據庫,只轉儲結構,並使用diff來查看已更改的內容。 這樣,您可以包含新表的create table語句,並為alter table編寫alter table語句以升級它們。

也許有一個可以生成那些alter table命令的免費腳本,它聽起來肯定是一個有趣的小項目。

或者,您可以重命名舊表,導入開發數據庫,​​再次沒有數據,並將舊表中的數據插入到新表中

insert into mytable (col1, col2) select (col1, col2) from oldmytable;

其中“col1,col2”等是舊表中的列。

同樣,可以查詢數據庫中每個表具有哪些列,以便您可以輕松編寫腳本來生成這些插入語句。

對於第二種方法,數據庫必須離線一段時間(或者很長一段時間,具體取決於數據庫的大小)。

如果您不想刪除那些令人痛苦的生產數據,我擔心。

  • 您可以使用的一個工具是mysql工作台 通過逆向工程開發數據庫創建EER模式,並嘗試與生產服務器同步。 您必須查看mysql-workbench將要執行的所有查詢,因為它可能很危險。 我建議你在開始之前做一個備份。

  • 第二個可能性是您比較每個表並為每個不同的表寫一些ALTER table查詢,例如當您刪除/更改/添加一些字段到該表時。

我認為你應該在下次啟動一些數據庫遷移工具,比如rake 如果您不想使用工具,則應該使用所有alter創建一些SQL腳本,以便輕松升級DB方案。 mysql workbench也很安靜很好,可以完成這些任務,但仍然有點兒麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM