【问题标题】:Transfer data between large MySQL tables在大型 MySQL 表之间传输数据
【发布时间】:2011-11-28 11:57:33
【问题描述】:

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

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

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

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

谢谢,

【问题讨论】:

  • 为这个单元任务写一些外部程序怎么样? updt:它在一台服务器和一个数据库中?
  • 您可以尝试使用SQLyog。您可以下载 30 天试用版。 SQLyog 有一个数据同步向导,它可以帮助你做你想做的事情(无需真正编写任何代码)。
  • mysqldump 允许使用 WHERE,看看 --where 选项 - dev.mysql.com/doc/refman/5.1/en/mysqldump.hts.html
  • Devart,链接似乎不起作用,但感谢您的提示,我会自己找到文档页面。
  • 真的,这是错误的链接:(无论如何,这应该工作 - dev.mysql.com/doc/refman/5.5/en/…

标签: mysql database stored-procedures data-migration


【解决方案1】:

你可以使用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

【讨论】:

  • 我正在试一试。那么默认情况下 backup.csv 会位于哪里?
  • 没关系,我在包含相应数据库所有表的文件夹中找到它。
【解决方案2】:

你的更新频率是多少?

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

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

在重型生产服务器中测试,工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2013-05-14
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多