7

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

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

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

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

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

4

7 回答 7

10

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

于 2013-05-23T14:22:23.743 回答
5

mysqldump 在简单性和对所有类型数据的仔细处理方面是一个很棒的工具,但它不如load data infile快

如果你在同一个数据库上复制,我喜欢这个版本的选项 2:

a) 创建表 foo_new LIKE foo;

b) INSERT INTO foo_new SELECT * FROM foo;

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

于 2019-03-14T13:18:16.493 回答
2

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

如果您对至少一列有唯一约束,我会选择第二个选项,因此如果脚本必须多次运行以在服务器超时的情况下完成其任务,则不会创建重复的行。

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

于 2013-05-23T14:38:33.833 回答
1

如果可能,最快的方法是使数据库脱机并简单地将数据文件复制到磁盘上。

当然,这有一些要求:

  • 您可以在复制时停止数据库。
  • 您正在使用将每个表存储在单独文件中的存储引擎,MyISAM 会这样做。
  • 您对数据库服务器具有特权访问权限(root 登录或类似登录)

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

于 2013-05-23T14:26:56.460 回答
1

使用存储过程

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

于 2013-05-23T14:37:02.797 回答
1

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

特别注意转义字符和表示NULLCSV 中的值/二进制数据/等,以避免数据丢失。

于 2018-08-09T00:06:50.590 回答
0

到目前为止我发现的最好的方法是将文件创建为转储文件(.txt),通过使用 outfile 到文本然后在 mysql 中使用 infile 将相同的数据获取到数据库

于 2014-03-15T07:42:48.453 回答