2015-09-03 26 views
0

場景:我想將MySQL表從一個數據庫複製到其他數據庫。使用mysqldump從實時站點的其他數據庫導入MySQL表可能會導致麻煩?

可能的最佳解決方案:可能是使用MySQL複製功能。 目前我正在作爲解決方法(mysqldump)工作的解決方案,因爲無法花時間瞭解當前最後期限的複製。

所以我目前使用的命令是這樣的:

mysqldump -u user1 -ppassword1 --single-transaction SourceDb TblName | mysql -u user2 -ppassword2 DestinationDB 

基於一些測試,它似乎是工作的罰款。 在執行上述命令時,我運行了ab命令,並在目標站點上發出了1000個請求,並嘗試從瀏覽器訪問該站點。

我關心的是我們用整個表導入數據的目標實況站點(它將在內部刪除現有的表格並使用新數據創建新的表格)。

我可以肯定,活動網站不會中斷,而這個過程中還是有任何風險因素? 如果是,那麼可以解決?

+0

您的意思是在討論數據庫時在同一臺服務器上的模式,還是指的是不同的MySQL服務器? – Gruber

+0

現在,我看到了相同的MySQL服務器。將來,我可能會有更多的服務器。 –

+0

如果數據位於同一臺服務器上,則可以直接從一個模式引用它們到另一個模式。那麼,爲什麼你想模仿複製?如果您使用多臺服務器,則可以使用'FEDERATED'數據引擎來避免重複數據。 – Gruber

回答

0

因此,您已經承認複製是最好的解決方案,我同意這一點。

你說你在「目的地」一邊有1000個請求?這1000個目的地連接是隻讀的嗎? 對於活動連接而言,正確刪除和重新創建表格不是正確的選擇。

可以提示一個改進。而不是直接加載到表,加載到不同的數據庫和交換表。就目標數據庫/表的連接而言,這應該更快。

  • 創建新表不同的數據庫

mysqldump -u user1 -ppassword1 --single-transaction -hSOURCE_HOST SourceDb TblName | mysql -uuser2 -ppassword2 -hDESTINATION_HOST DB_New

(你確定你沒有 「-H」 在這裏?)

  • 交換表

rename table DB.TblName to DB.old_TblName, DB_New.new_TblName to DestinationDB.TblName;

如果你在同一個主機上(我不這麼認爲),你可能想使用pt-online-schema-change和swap表!

+0

- 「這1000個目標連接是隻讀嗎?」 你的意思是隻讀連接?我想,這就像模仿真正的用戶從瀏覽器發出請求一樣。 - 交換表是很好的選擇。我也準備了這個解決方案。謝謝!但在我的測試中,我發現沒有交換也能正常工作。所以想要確保mysqldump實用程序在內部管理這種情況。 - 數據庫現在在同一主機上。我不知道pt-online-schema-change,但我們不打算改變模式,只會改變數據。 –