MySQL InnoDB引擎重启

时间:2013-11-03 04:50:17

标签: mysql sql innodb

我有一个非常大的表,大约有1M条记录。由于性能不佳,我优化了查询并需要更改索引

我使用ALTER更改了它,现在我真的不确定它在InnoDB中是如何工作的。我需要重启MySQL服务器吗?如果我需要重启MySQL服务器,如何保持表之间的数据完整性(这样我就不会错过内存中没有写入数据的数据)?

我用Google搜索并发现在MySQL重新启动的情况下,我需要使用全局变量innodb_fast_shutdown - 当我设置它时它会做什么,如果我不这样做呢?现在还不是很清楚。

我是InnoDB的MySQL新手。任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:2)

  

所以使用ALTER更改了它,现在我真的不确定它在innodb中是如何工作的?

你是说你用ALTER TABLE ... ADD INDEX ...(或ADD KEY - 它们是两种要求完全相同的东西的方式)添加了索引?大概是?

一旦ALTER TABLE完成执行并且您的mysql>提示返回,则不需要其他任何内容。此时,表具有新索引,索引已完全填充。

您已完成,无需重新启动服务器。

既然你提到了它,我也会尝试帮助澄清你对InnoDB中innodb_fast_shutdown和内存/磁盘划分的误解。

当MySQL服务器启动时,InnoDB从操作系统一次性请求一个大小为innodb_buffer_pool_size的内存块,在本例中来自我的一个测试服务器的MySQL错误日志:

130829 11:27:30 InnoDB: Initializing buffer pool, size = 4.0G

这是InnoDB在内存中存储表和索引数据的地方,最佳性能是当此池足够大以容纳所有数据和索引时。读取行时,首先将表空间文件中的页面读入缓冲池,然后从中提取数据。如果进行了更改,则更改将写入缓冲池中的表数据和索引的内存中副本,并最终刷新到磁盘。池中的页面要么“干净” - 这意味着它们与磁盘上的页面相同,因为它们在加载后没有更改,或者如果更改,则更改已经写入磁盘 - 或“脏”这意味着它们与磁盘上的内容不匹配。

但是,InnoDB符合ACID - 如果它只在内存中写入更改并且更改未持续立即某处< em>事先甚至在内存中进行了更改......并且“某处”是磁盘上的redo log - 它可以立即存储在内存中进行的更改一种格式,允许此操作比实时更新实际表空间文件本身快得多。

反过来,innodb_fast_shutdown变量确定MySQL是否在关闭之前完成写入重做日志的所有内容 - 或在它开始备份之后。无论哪种方式,它都可以正常工作,但如果您需要更快地关闭服务器,那么无论您做出哪些更改,都可以更快,更安全地让它在以后选择所有内容。

重要的是,我不知道你读了什么,但在日常操作中,你永远不需要弄乱innodb_fast_shutdown的值,除非你正在关闭以准备升级你的MySQL版本服务器(然后它主要是一个安全预防措施)。磁盘上的数据始终与内存中的数据一致 ,因为表空间文件已经与数据的内存表示形式一致,因为表空间文件的挂起更改安全地存储在重做日志中,当服务器重新联机时,它们将被正确处理。

如果ALTER TABLE ALTER之前的ALTER表的任何待处理事件已经处理完毕,因为InnoDB通常会重建整个表以响应此命令,因此唯一可能“待定”更改将是{{1}}之后发生的DML。