mysqldump与select into outfile的区别

4
我使用mysql中的select * into outfile选项将数据备份到以制表符分隔格式的文本文件中。我针对每个表调用此语句。
然后,我使用load data infile为每个表导入数据。
在执行此操作时,我尚未进行任何锁定或禁用键操作。
现在我面临一些问题:
1. 在备份期间,其他更新和选择变得缓慢。 2. 对于大型表格,导入数据需要太长时间。
如何改进此方法以解决上述问题?
mysqldump是一个选项吗?我看到它使用插入语句,所以在尝试之前,我想请求建议。
在每次“load data”之前使用锁定和禁用键是否会提高导入速度?
2个回答

4
如果你拥有很多数据库/表格,那么使用mysqldump肯定更加方便,因为你只需每个数据库运行它一次(甚至如果你对系统进行完整备份,只需运行它一次即可备份所有数据库)。此外,它的优点还在于它还备份了你的表结构(仅使用select *无法做到这一点)。
速度可能是相似的,但最好测试两者并查看哪一个在你的情况下最有效。有人在这里测试了选项,发现在他的情况下mysqldump更快。但同样地,结果因情况而异。
如果你关注速度,还可以看看mysqldump/mysqlimport组合。正如此处所提到的,它比单独使用mysqldump更快。
至于锁定和禁用键,我不确定,所以我会让其他人回答这部分 :)

4
使用mysqldump非常重要,如果您希望数据备份是一致的。也就是说,从所有表中转储的数据代表同一时刻。
如果您逐个转储表格,则它们不会同步,因此您可能会有一个表格的数据引用了另一个表格中未包含在第二个表格备份中的行。当您恢复时,情况将不太好。
为了提高性能,我正在使用:
mysqldump --single-transaction --tab mydatabase

对于每个表,这会生成一个.sql文件用于定义表结构,以及一个.txt文件用于存储数据。接下来当我导入时,运行.sql文件来定义表结构:
mysqladmin create mydatabase
cat *.sql | mysql mydatabase

然后我导入所有数据文件:
mysqlimport --local --use-threads=4  mydatabase  *.txt

通常情况下,运行mysqlimport比默认由mysqldump输出的插入语句更快。如果您有足够的CPU资源,使用多个线程运行mysqlimport也应该更快。
在恢复时使用锁并不能提高性能。
禁用键旨在推迟索引创建,直到数据完全加载并重新启用键,但这仅适用于MyISAM表中的非唯一索引。但是,您不应使用MyISAM表。
有关更多信息,请阅读:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接