使用 mysqldump 和 USE .. SOURCE 进行缓慢的 MySQL 数据库导入

Kir*_*met 9 mysql mysqldump backup

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

我用这个命令来备份:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz
Run Code Online (Sandbox Code Playgroud)

此命令用于在新服务器上导入内容:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

我可以做些什么来加快速度?我的 mysqldump 命令有问题吗?

Cra*_*ein 5

对于您的转储命令,您可以使用以下内容

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz
Run Code Online (Sandbox Code Playgroud)

扩展插入更好。

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/en/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,或者仅将导入时间最长的表更改为 ENGINE=MEMORY,将转储文件导入回您的数据库然后将引擎改回innodb。

ALTER TABLE name_of_table ENGINE=InnoDB;

mysqlimport 命令

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

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

使用 mysqldump 转储数据库

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

将数据导入您的数据库。

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


Rol*_*DBA 5

如果您没有正确调整 InnoDB,批量加载 InnoDB 可能会非常令人生畏。

以下是您需要关注的设置:

多达一半的缓冲池可用于批量插入。这会推出缓存数据。在将 mysqldump 重新加载到 InnoDB 表期间,缓冲池成为新加载的 InnoDB 数据和二级索引更改之间的开放战区。有鉴于此,增加innodb_buffer_pool_size并且innodb_log_file_size是至关重要的和势在必行的。

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

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)

您可以head -20在 mysqldump 文件上使用简单的方法进行检查。

还有一个重要的方面:innodb_change_buffering

根据MySQL 文档,您可以指定在任何 DML 操作期间缓冲的内容。有关这方面的完整说明,请参阅Controlling InnoDB Change Buffering

我推荐以下设置:

[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
Run Code Online (Sandbox Code Playgroud)