我在mysql中使用select * into outfile选项将数据备份为制表符分隔格式的文本文件。我在每张桌子上都这样说。
我使用load data infile将数据导入到每个表的mysql中。
我执行此操作时尚未执行任何锁定或禁用键
现在我面临一些问题:
如何改进解决上述问题的方法?
mysqldump是一个选项吗?我看到它使用了insert语句,所以在我尝试之前,我想请求建议。
在每次“加载数据”之前使用锁定和禁用键是否会提高导入速度?
答案 0 :(得分:4)
如果您有很多数据库/表,那么使用mysqldump肯定会更容易,因为您只需要为每个数据库运行一次(如果您对所有数据库执行完全备份,则需要运行一次)你的系统)。此外,它的优势在于它还可以备份您的表结构(仅使用select *不能执行此操作)。
速度可能类似,但最好同时测试两者,看看哪种效果最好。
有人here测试了这些选项,并且mysqldump在他的情况下被证明更快。但是,YMMV。
如果你关心速度,还要看一下mysqldump / mysqlimport组合。如mentioned here,它比单独的mysqldump快。
至于锁和禁用键,我不确定,所以我会让其他人回答那部分:)
答案 1 :(得分:2)
如果您希望数据备份一致,则使用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默认运行insert语句输出要快。只要你有足够的CPU资源,运行带多个线程的mysqlimport也应该更快。
还原时使用锁定无助于提高性能。
禁用密钥旨在推迟创建索引,直到数据完全加载并重新启用密钥为止,但这仅对MyISAM表中的非唯一索引有帮助。但是你不应该使用MyISAM表。
有关详细信息,请阅读: