2012-02-17 56 views
2

這裏的情況:轉儲在MySQL從一個數據庫中選擇數據到另一個

我有一個遠程服務器上的MySQL數據庫。我需要來自其中4個表格的數據。有時候,這些表格的模式會改變(添加新的字段,但不會被刪除)。目前,這些表格有> 300,000條記錄。

該數據需要導入到localhost mySQL實例中。這些相同的4個表(具有相同的名稱)存在,但所需的字段是遠程數據庫表中字段的子集。這些本地表中的數據被認爲是隻讀的,永遠不會寫入。一切都需要在一個事務中運行,所以本地表中總是有一些數據,即使它已經過時了。本地主機表由活動網站使用,因此整個過程需要儘快完成,以最大限度地減少停機時間。

此過程每天運行一次。

的選項,因爲我看到他們:

  1. 獲取結構的mysqldump /遠程表的數據,並保存到文件。刪除localhost表,並運行轉儲的sql腳本。然後重新創建4個表中所需的索引。

  2. 截斷localhost表。在PHP中的遠程數據庫上運行SELECT查詢,並僅檢索所需的字段而不是整行。然後遍歷結果並從這些數據創建INSERT語句。

我的問題:

  • 明智的性能,這是我最好的選擇?
  • 哪一個會完成最快?
  • 任一人是否會在服務器上承受較重的負載?
  • 索引 表將在兩個選項中花費相同的時間?
+0

如果它是一個選項,使用mysql來查看活動鏡像,甚至是沿着redis的路線 - 值得研究。 – damianb 2012-02-17 23:26:40

+0

@damianb - 我不熟悉主動鏡像。你能詳細說明一下嗎? – deckerdev 2012-02-17 23:35:33

+0

我應該說數據庫複製,道歉。 :) – damianb 2012-02-18 23:37:51

回答

0

如果沒有充分理由讓本地d/b成爲遠程子集的一部分,則使結構相同,並在需要的表上啓用database replication。主站跟蹤所做的所有更改,並將每個從站d/b的指針管理到更改中。每個奴隸說給我所有自上次請求以來的所有變化。對於一個相當大的數據庫來說,這比你選擇的任何替代方法都要高效得多。它只有適度的成本。

至於模式更改,我認爲alter信息由主站記錄,所以從站也可以複製這些信息。該機制肯定複製drop table ... if existscreate table ... select,所以alter邏輯上應遵循,但我沒有嘗試過。


它在這裏:confirmation that alter is properly replicated

+0

本地數據庫實際上是一個Drupal數據庫,這4個表格正在被自定義的Drupal模塊使用。所以除非複製支持這種類型的場景,否則你的建議是行不通的。 – deckerdev 2012-02-21 23:57:24

+0

那麼,在問題的措辭說*導入到localhost mySQL實例*,並沒有提到Drupal。毫無疑問,Drupal可以被定製爲與主動複製數據一起工作,但根據具體情況,這可能從微不足道到幾乎不可能。 – wallyk 2012-02-22 00:15:56

相關問題