在大型MySQL表之间传输数据

时间:2011-11-28 11:57:34

标签: mysql database stored-procedures data-migration

我希望将数百万行表中的一些数据传输到另一个表中。我面临的问题是:

  • 我不能使用数据转储,因为我需要一个WHERE子句
  • 我不能做一个简单的INSERT INTO ... SELECT ...,因为将所有这些行放入临时表会导致服务器崩溃

所以我基本上认为我应该做一个存储过程或类似的东西,一次需要100行,然后将它们插入到另一个表中。

关于这个问题的解决方案/最佳实践的任何想法?

谢谢,

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的更新频率是多少?

如果您不需要跟踪更新,则可以使用限制。我在过去的函数(VB.net)中写过,等到行= 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,DELETE ...) Updater = delegate更新调用者对象/用户命令的状态是什么......

ExecCommandWithTimeout =执行SQL的函数,等待500毫秒。

在繁重的生产服务器中测试,有效。