复制大型MySQL表的最快方法?

时间:2013-05-23 14:20:38

标签: mysql copy

使用速度内存来复制大型MySQL表的最佳方法是什么?

选项1。使用PHP,从旧表中选择X行并将其插入新表中。继续执行select / insert的下一次迭代,直到复制完所有条目。

选项2。使用没有行限制的MySQL INSERT INTO ... SELECT

选项3。使用MySQL INSERT INTO ... SELECT,每次运行时复制的行数有限。

编辑:我不打算使用mysqldump。我的问题的目的是找到编写数据库转换程序的最佳方法。有些表已经改变,有些表没有改变。我需要自动执行整个复制/转换过程,而不必担心手动转储任何表。因此,如果您能够回答上述哪个选项最佳,那将会很有帮助。

7 个答案:

答案 0 :(得分:8)

有一个专门为此任务编写的程序名为mysqldump

答案 1 :(得分:2)

关闭上面列出的三个选项。

我会选择第二个选项如果您对至少一个列有唯一约束,因此如果脚本必须多次运行才能实现其任务,则不会创建重复行服务器超时。

否则,您的第三个选项将是可行的方法,同时手动考虑任何服务器超时以确定您的插入选择限制。

答案 2 :(得分:1)

如果可能,最快的方法是使数据库脱机,只需将数据文件复制到磁盘上即可。

当然,这有一些要求:

  • 您可以在复制时停止数据库。
  • 您正在使用存储引擎将每个表存储在单个文件中,MyISAM会执行此操作。
  • 您有权访问数据库服务器(root登录或类似)

啊,我看到你编辑了你的帖子,然后我认为这种DBA-from-hell方法不是一种选择......但是,它仍然很快!

答案 3 :(得分:1)

使用存储过程

选项二必须是最快的,但它将是一个强大的长期交易。您应该考虑使存储过程执行复制。这样你就可以从MySQL引擎中卸载一些数据解析/处理。

答案 4 :(得分:0)

我到目前为止找到的最好的方法是将文件创建为转储文件(.txt),将outfile用于文本,然后在mysql中使用infile将相同的数据提供给数据库

答案 5 :(得分:0)

MySQL的load data查询比几乎所有其他查询都快,但是它需要将每个表导出到CSV文件。

要特别注意转义字符,并在CSV中表示NULL值/二进制数据/等,以避免数据丢失。

答案 6 :(得分:0)

mysqldump就简单性和精心处理所有类型的数据而言是一个很好的工具,但是它不如 load data infile

如果要在同一数据库上进行复制,则我喜欢此版本的选项2:

a)创建表foo_new就像foo;

b)插入foo_new SELECT * FROM foo;

我有很多带有亿万行的表(例如1 / 2B)和InnoDB以及几个键和约束。从MySQL转储读取它们需要花费很多时间,而通过 load data infile 只需一个小时左右。脱机复制原始文件更快,这是正确的。正确处理非ASCII字符,二进制数据和NULL在CSV(或制表符分隔的文件)中也是正确的,但是幸运的是,我已经有了很多数字和文本:-)。我可能花点时间看一下上述步骤a)和b)需要花费多长时间,但是我认为它们比加载数据文件慢...这可能是由于事务。