MySQL以任何方式导入巨大的(32 GB)sql转储更快?


67

我有一个巨大的32 GB SQL转储,需要导入MySQL。我以前不必导入这么大的SQL转储。我照常做:

mysql -uroot dbname < dbname.sql

花费的时间太长了。一张桌子大约有3亿行,大约3个小时就达到了150万行。因此,似乎整个过程将花费600个小时(即24天),并且是不切实际的。所以我的问题是,有没有更快的方法可以做到这一点?

进一步的信息/发现

  1. 这些表都是InnoDB,并且没有定义外键。但是,有很多索引。
  2. 我没有访问原始服务器和数据库的权限,因此无法进行新备份或进行“热”复制等。
  3. 此处innodb_flush_log_at_trx_commit = 2建议的设置似乎并没有(明显可见/指数)改善。
  4. 导入期间(从MySQL Workbench)的服务器统计信息:https : //imgflip.com/gif/ed0c8
  5. MySQL版本是5.6.20社区。
  6. innodb_buffer_pool_size = 16M和innodb_log_buffer_size = 8M。我需要增加这些吗?

您可以向服务器添加更快的组件,即更多的RAM和SSD存储吗?

@Bert服务器具有8 GB的RAM,其中大部分未使用。也无法添加更多存储空间。那有什么帮助?真的写操作这么慢吗?

有什么瓶颈?是否固定了CPU核心?
克里斯·S

@ChrisS不,CPU使用率为3%到4%。我不确定瓶颈是什么。我在想那是索引。一个人如何发现/确认瓶颈?

1
如果您有sql,可以编辑出create index语句,看看它运行得更快吗?导入数据后,您需要重新创建它们

Answers:


84

Percona的Vadim Tkachenko对InnoDB进行了精美的图形表示

InnoDB架构

您肯定需要更改以下内容

innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 256M
innodb_log_file_size = 1G
innodb_write_io_threads = 16
innodb_flush_log_at_trx_commit = 0

为什么要进行这些设置?

像这样重启mysql

service mysql restart --innodb-doublewrite=0

这将禁用InnoDB双重写入缓冲区

导入数据。完成后,正常重启mysql

service mysql restart

这将重新启用InnoDB Double Write Buffer

试试看 !!!

旁注:您应该升级到5.6.21,以获取最新的安全补丁


我做了一个linux bash脚本吧,降低一些值里面流浪的工作与低内存gist.github.com/OZZlE/57d550c3cc1c1ff17481e465e4f6d674
OZZIE

9

您是否真的需要还原整个数据库?如果没有,我的2c:

您可以提取特定的表以对“块”进行还原。像这样:

zcat your-dump.gz.sql | sed -n -e '/DROP TABLE.*`TABLE_NAME`/,/UNLOCK TABLES/p' > table_name-dump.sql

我做了一次,花了大约10分钟的时间来提取我需要的表-我的完整还原花费了13〜14个小时,并转储了35GB(压缩)。

/pattern/,/pattern/p-n参数,使“模式之间的”片-包括他们。

无论如何,要还原35GB,我使用了一台AWS EC2机器(c3.8xlarge),通过yum(Centos)安装了Percona,并在以下行中添加/更改了以下行my.cnf

max_allowed_packet=256M
wait_timeout=30000

我认为这个数字太高了,但对于我的设置却有用。


5

导入数据库的最快方法是将MyISAM文件(.frm,.MYD,.MYI)直接复制到/ var / lib / mysql /“数据库名称”中。

否则,您可以尝试: mysql > use database_name; \. /path/to/file.sql

那是导入数据的另一种方法。


1

一种有助于加快导入速度的方法是在导入时锁定表。在mysqldump中使用--add-locks选项。

mysqldump --add-drop-table --add-locks --database db > db.sql

或者,您可以使用--opt打开一些有用的参数,从而为转储打开许多有用的东西。

mysqldump --opt --database db > db.sql

如果服务器上有另一台存储设备,请使用该设备-从一台设备复制到另一台设备可以加快传输速度。

您还可以过滤掉--ignore-table不需要的表

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.