一尘不染

MySQL 有什么方法可以更快地导入一个巨大的(32 GB)sql 转储?

mysql

我有这个巨大的 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。我需要增加这些吗?

阅读 68

收藏
2022-10-21

共1个答案

一尘不染

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

为什么要进行这些设置?

  • innodb_buffer_pool_size会缓存频繁读取的数据
  • innodb_log_buffer_size:更大的缓冲区减少了对事务日志的写入 I/O
  • innodb_log_file_size:更大的日志文件减少检查点和写入 I/O
  • innodb_write_io_threads.ibd :对文件的服务写入操作。根据MySQL 上的文档Configuring the Number of Background InnoDB I/O Threads,每个线程最多可以处理 256 个挂起的 I/O 请求。MySQL 的默认值为 4,Percona Server 的默认值为 8。最大是 64。
  • innodb_flush_log_at_trx_commit
  • 如果发生崩溃,0 和 2 都可能丢失一秒钟的数据。
  • 权衡是 0 和 2 都提高了写入性能。
  • 我选择 0 而不是 2,因为 0 每秒一次将 InnoDB 日志缓冲区刷新到事务日志(ib_logfile0、ib_logfile1),无论是否提交。设置 2 仅在提交时刷新 InnoDB 日志缓冲区。

像这样重启mysql

service mysql restart --innodb-doublewrite=0

这将禁用 InnoDB 双写缓冲区

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

service mysql restart

这将重新启用 InnoDB 双写缓冲区

试试看 !!!

2022-10-21