2011-11-28 30 views
1

我正在尋找將數百萬行表中的一些數據轉移到另一個表中。我面對的問題是:在大型MySQL表之間傳輸數據

  • 我不能用數據轉儲,因爲我需要一個WHERE子句
  • 我不能做一個簡單的INSERT INTO ... SELECT ...因爲把所有的行到一個臨時表崩潰服務器

所以我基本上認爲我應該做一個存儲過程或類似的東西,它一次需要100行,並將它們插入到另一個表中。

關於此問題的解決方案/最佳實踐的任何想法?

感謝,

+1

如何爲本單元任務編寫一些外部程序? updt:它在一臺服務器和一個數據庫中? – triclosan

+0

您可以嘗試使用[SQLyog](http://webyog.com/en/downloads.php)。有一個30天的試用版,你可以下載。 SQLyog有一個數據同步嚮導,它可以幫助你完成你正在嘗試的任務(沒有真正編寫任何代碼)。 –

+1

mysqldump允許使用WHERE,看看--where選項 - http://dev.mysql.com/doc/refman/5.1/en/mysqldump.hts.html – Devart

回答

2

你可以使用SELECT INTO OUTFILE

SELECT * INTO OUTFILE 'backup.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
FROM <tablename> WHERE <conditions> <Other Clause if required> 

然後插入:

LOAD DATA INFILE 'backup.csv' 
INTO TABLE <tablename> 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
(field1,field1,field2) etc 
+0

我試着在我們說話時嘗試。 backup.csv默認位於何處? – evilpenguin

+0

沒關係,我在保存各個數據庫所有表的文件夾中找到它。 – evilpenguin

0

什麼是你的更新頻率。?

如果你不需要跟蹤更新,你可以使用限制。

Function ExecCommandInParts(ByVal sql As String, Optional ByVal Updater As Func(Of Integer, Integer) = Nothing) As Integer 
    Dim limit As Integer = 10000 
    Dim count As Integer = limit 
    While count = limit 
     count = ExecCommandWithTimeout(sql & " limit " & limit) 
     If Updater IsNot Nothing Then Updater(count) 
    End While 
End Function 

SQL = SQL查詢來運行(INSERT ... SELECT,刪除...) 更新=委託更新來電者:我在過去的函數(VB.net)是等到行= 0寫道:對象/用戶命令的狀態是什麼...

ExecCommandWithTimeout =執行SQL的函數,並等待500毫秒。

測試在重型生產服務器,工程。