2013-11-03 50 views
0

我有一个非常大的表约1M记录。由于性能不佳,我对查询进行了优化,需要更改索引MySQL的InnoDB引擎重新启动

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

我搜索了一下,发现在MySQL重启的情况下,我需要使用全局变量innodb_fast_shutdown - 当我设置它时会怎么做?如果我不知道该怎么办?这不是很清楚。

我是InnoDB的MySQL领域的新手。任何帮助真的很感激。

回答

2

所以改变它使用ALTER,现在我真的不知道这是如何工作在innodb?

你是说你ALTER TABLE ... ADD INDEX ...添加索引(或ADD KEY - 他们所要求的完全是一回事的两个方面)可能?

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

你完成了,没有必要重新启动服务器。

既然你提到了它,我也会尽力帮助你清楚你对innodb_fast_shutdown的错误理解和InnoDB中的内存/磁盘划分。

InnoDB的使得用于存储块的一次性请求的innodb_buffer_pool_size从操作系统大小时MySQL服务器从我的测试服务器中的一个启动时,在从MySQL错误日志这个例子:

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

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

然而,InnoDBACID兼容 - 如果它只是写在内存中的变化和变化不会持续立即地方之前到内存中的变化甚至正在作出这不可能是真的。 ..“某处”是磁盘上的redo log - 它立即存储要在内存中进行的更改,格式允许此操作比实际更新实际表空间文件本身更快将会。

反过来,innodb_fast_shutdown变量决定的MySQL是否完成了一切关机前写入到重做日志 - 或启动备份后。无论哪种方式,它都能正常工作,但如果您需要更快地关闭服务器,则无论您做了哪些更改,都可以更快速并且安全地让它在以后采取一切行动。

重要的是,我不知道你读到了什么,但是在日常操作中,除非你准备升级到你的MySQL服务器版本,否则你永远不需要混淆innodb_fast_shutdown的值那么这主要是一种安全预防措施)。磁盘上的数据是总是什么是在内存中,要么因为表空间文件已经与数据,的内存表示一致的,因为在表空间文件的待定更改安全地存储在重做一致日志,在服务器重新联机时它们将在那里被正确处理。

ALTER TABLE任何事情之前ALTER表悬而未决的情况下,将已经照顾,因为InnoDB的典型重建整个表以响应命令,所以唯一可能的“待定”的变化将是DML发生在ALTER之后。

+0

嗨迈克尔..这真的很有帮助。非常感谢你提供了这么好的信息。只有一个信息。如果我需要删除旧的日志文件(ib_logfile0和ib_logfile1),因为在这种情况下升级或其他问题,在停止mysql服务器之前,我应该设置innodb_fast_shutdown = 0,然后停止mysql服务器删除/移动上面的日志文件更改my.cnf然后启动服务器,并最终使innodb_fast_shutdown = 1。这些正确的seq。或者我需要在这里做点别的事情,这样一切都会好的。谢谢迈克尔。 – SmartDev

+0

我已经阅读了很多次,并且在我自己以前的时间里重复过它,在调整'ib_logfile *'文件大小之前'innodb_fast_shutdown' = 0是正确的设置,但是我做了额外的研究和[documentation](http ://dev.mysql.com/doc/refman/5.6/en/innodb-data-log-reconfiguration.html)意味着0或1是好的,这是有道理的,因为[change buffer](http:///dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_change_buffer)本身实际上存储在'ibdata1'中,而不是存储在日志文件中......尽管0似乎比1更“安全”,但它不是'显然“需要”。 –

+0

太棒了..非常感谢Michael .. – SmartDev