用mysqldump和USE ..缓慢的MySQL数据库导入


8

我在MySQL innoDB中大约有12个表,其中一个表中有1100万条记录。

我使用此命令来备份内容:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

然后使用以下命令在新服务器上导入内容:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

这是我的痛苦(每个查询的时间都在增加!):

在此处输入图片说明

我该怎么做才能加快速度?我的mysqldump命令出问题了吗?

Answers:


5

对于转储命令,可以使用以下命令

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

加长刀片更好。

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction Single Transaction选项更适合于转储InnoDB表。

在您的my.cnf文件中,暂时进行以下更改

http://dev.mysql.com/doc/refman/5.0/zh-TW/innodb-parameters.html#sysvar_innodb_doublewrite

innodb_doublewrite = 0

并且

http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 2

重新启动MySQL,然后在导入后删除这些选项,然后再次重新启动MySQL。

内存表

如果整个数据库都可以容纳到内存中,则可以将转储sql文件中的每个表或仅导入时间最长的表的ENGINE = InnoDB更改为ENGINE = MEMORY,然后将转储文件重新导入数据库然后将引擎改回innodb。

ALTER TABLE name_of_table ENGINE = InnoDB;

mysqlimport命令

http://linux.die.net/man/1/mysqlimport

我已经使用mysqlimport导入使用mysqldump中的tab格式选项备份的数据。它已被证明比通过mysql命令导入更快。

使用mysqldump转储数据库

mysqldump --tab = / some_directory / -u [USERNAME] -p [DBNAME] [TABLENAME]

将数据导入数据库。

mysqlimport -u [用户名] -p [数据库名] /some_directory/tablename.sql


5

如果您没有正确调整InnoDB,则批量加载InnoDB可能会非常艰巨。

这是您需要关注的设置:

多达一半的缓冲池可用于批量插入。这将推出缓存的数据。在将mysqldump重新加载到InnoDB表中的过程中,缓冲池成为新加载的InnoDB数据与二级索引更改之间的开放式战区。鉴于此,增加innodb_buffer_pool_sizeinnodb_log_file_size至关重要。

另外,请确保已将其关闭。mysqldump应该将这些变量设置为0。

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

您可以通过简单head -20的mysqldump文件来检查。

还有一个导入方面:innodb_change_buffering

根据MySQL文档,您可以指定在任何DML操作期间要缓冲的内容。有关此内容的完整说明,请参见控制InnoDB更改缓冲

我建议以下设置:

[mysqld]
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000
innodb_thread_concurrency=0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.