mysqldump vs select into outfile



我在mysql中使用select * into outfile选项将数据备份到制表符分隔格式的文本文件中。我对每个表调用这个语句。

和我使用load data infile导入数据到mysql的每个表

当我执行此操作时,我还没有执行任何锁或禁用密钥

现在我面临一些问题:

  1. 当它正在备份另一个时,更新和选择变得很慢。
  2. 对于大型表,导入数据需要花费太多时间。

我该如何改进方法来解决上述问题?

mysqldump是一个选项吗?我看到它使用了插入语句,所以在我尝试之前,我想请求建议。

在每次"加载数据"之前使用锁和禁用键是否提高了导入速度?

如果你有很多数据库/表,使用mysqldump对你来说肯定会容易得多,因为你只需要为每个数据库运行一次(如果你对系统做了一个完整的备份,甚至可以为所有数据库运行一次)。此外,它还具有备份表结构的优点(仅使用select *无法做到这一点)。

速度可能是相似的,但最好测试一下,看看哪一个最适合您的情况。

这里有人测试了这些选项,在他的情况下,mysqldump被证明更快。但是,再一次,YMMV。

如果你关心速度,也看看mysqldump/mysqlimport组合。如前所述,它比单独使用mysqldump要快。

至于锁和禁用钥匙,我不确定,所以我会让别人回答这个部分:)

如果你希望你的数据备份一致,使用mysqldump是很重要的。也就是说,从所有表中转储的数据表示同一时刻。

如果你一个一个地转储表,它们不是同步的,所以你可能有一个表的数据引用了另一个表的行,而另一个表的备份中没有包含这些行。当你恢复时,它不会很漂亮。

为了性能,我使用:

mysqldump --single-transaction --tab mydatabase

dump每个表,一个.sql文件用于表定义,一个.txt文件用于数据。

然后当我导入时,我运行.sql文件来定义表:

mysqladmin create mydatabase
cat *.sql | mysql mydatabase

然后导入所有数据文件:

mysqlimport --local --use-threads=4  mydatabase  *.txt

一般来说,运行mysqlimport比运行mysqldump默认输出的insert语句要快。如果你有空闲的CPU资源,在多线程下运行mysqlimport应该会更快。

在恢复时使用锁对性能没有帮助。

disable键旨在延迟索引创建,直到数据完全加载并且键被重新启用之后,但这只对MyISAM表中的非唯一索引有帮助。但是你不应该使用MyISAM表。

更多信息,请阅读:

  • https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html
  • https://dev.mysql.com/doc/refman/5.7/en/mysqlimport.html

最新更新