18

我有一个 MySQL 1.5 GB MyISAM 表(1.0 GB 数据,0.5 GB 索引)正在生产中,我即将转换为 InnoDB。

由于该表用于生产,因此我希望尽可能缩短停机时间。

我的问题:

  • 应该调整哪些 MySQL 配置选项以加快速度ALTER TABLE table_name ENGINE=InnoDB;

  • 为了加快生产数据库表从 MyISAM 到 InnoDB 的转换,可以使用哪些其他技巧?

4

4 回答 4

14
  • 设置较大的 innodb_buffer_pool_size(2GB 或更多)
  • 使用 shell 命令预读旧的 myisam 数据/索引文件
  • 增加 innodb_log_file_size (256 MB)
  • 在 X 个并行线程中执行 alter table,其中 X 是服务器上 CPU 内核的数量
  • 其他仅用于转换的小调整 (innodb_doublewrite=0, innodb_flush_log_at_trx_commit=0)

将 innodb_buffer_pool_size 设置得尽可能高是加速 innodb 表创建的典型方法 - 您的数据集看起来可以放入 2GB 的 innodb 缓冲池中,因此任何体面的 64 位服务器都应该允许这样做。alter table type=innodb 也比 dump+reimport 解决方案更快,并且易于并行运行。

还要确保将 innodb_log_file_size 从默认的 5Mb 增加到 128 或 256MB。小心点,它需要彻底关闭 + 擦除旧的 ib_logfile*。

如果您的服务器有 8GB 的​​内存,并且您运行 64 位版本的 mysql,我建议您使用 2GB 的 innodb_buffer_pool,您甚至可以在关闭停机之前预读旧的 MYD 和 MYI 文件,这样它们就可以在实际工作开始时操作系统的页面缓存。

如果您还进行了一些小的调整,请记住,您需要在转换后撤消它们(另一个小的停机时间)以确保您的数据安全,但我怀疑它们对于这么小的数据集是否值得。

祝你好运。

于 2010-01-17T17:21:31.570 回答
3

如果您追求快速(虽然有点低保真)的解决方案,您可以简单地将数据导出到文本文件(通过 mysqldump),在生成的文本文件中将表类型更改为 InnoDB,然后重新导入数据。

也就是说,您需要通过导入不同的数据库来对此进行测试,以确保没有问题。

于 2010-01-17T17:16:14.280 回答
2

使用pt-online-schema-change会使您的问题变得无关紧要。pt-online-schema-change 是Percona (可以说是世界顶级的 MySQL 咨询公司)设计的一个命令行工具来解决这个问题。它允许您在任何表上执行 ALTER 语句而不会阻塞读取或写入,如果您说您正在尝试加快生产中的这种转换,这可能是您的实际目标。

安装 Percona Toolkit 后,您只需在 O/S shell 中运行以下命令:

$ pt-online-schema-change h=your_host.com,t=your_db.your_target_table --alter "ENGINE=InnoDB"
于 2013-12-07T20:50:44.397 回答
2

该表只能写入不可访问;在 ALTER 期间,reads 将继续访问旧的 MyISAM 表。

说真的,重建一个 1.5G 的表应该不会花很长时间,如果你的应用程序不能忍受这么多的停机时间,你应该已经有一些 HA 系统可以用来做这个。大概您的技术支持团队可以发布通知告诉用户停机时间并给予足够的警告,您将在一天/一周的安静时间执行此操作(我们通常认为星期天早上是个好时间,但如果你在穆斯林国家有很多客户)

您可以通过在具有相同配置和规格的非生产系统上运行具有相同大小数据的表来了解需要多长时间,您无疑拥有这些系统来进行性能测试。

于 2010-01-17T22:30:07.510 回答