gpt4 book ai didi

MySQL InnoDB 引擎重启

转载 作者:行者123 更新时间:2023-11-29 08:19:45 25 4
gpt4 key购买 nike

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

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

我Google了一下,发现在MySQL重启的情况下,我需要使用全局变量innodb_fast_shutdown——设置它会做什么,如果不设置会怎么样?不是很清楚。

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

最佳答案

So changed it using ALTER, now i am really not sure about how this works in innodb?

您是说您使用 ALTER TABLE ... ADD INDEX ... (或 ADD KEY)添加了索引 - 它们是询问确切的索引的两种方式同样的事情)大概?

一旦 ALTER TABLE 完成执行并且 mysql> 提示符返回,则无需执行任何其他操作。此时,表就有了新的索引,并且索引已完全填充。

大功告成,无需重新启动服务器。

既然你提到了这一点,我也会尽力帮助你澄清对 innodb_fast_shutdown 以及 InnoDB 中内存/磁盘划分的误解。

当 MySQL 服务器启动时,InnoDB 会向操作系统一次性请求一 block 大小为 innodb_buffer_pool_size 的内存块,在本例中是来 self 的一台测试服务器的 MySQL 错误日志:

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

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

但是,InnoDBACID -兼容——如果它只将更改写入内存,并且这些更改没有在内存中的更改发生之前立即保存在某处,那么这不可能是真的...而那个“某处”就是 redo log - 在磁盘上 - 立即存储要在内存中进行的更改,其格式允许此操作比实时更新实际表空间文件本身快得多。

反过来,innodb_fast_shutdown 变量决定 MySQL 是在关闭之前还是在启动备份之后完成写入重做日志的所有内容。无论哪种方式,它都可以正常工作,但如果您需要更快地关闭服务器,那么无论您做了什么更改,让它稍后恢复所有内容都会更快且完全安全。

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

ALTER TABLE 的情况下,在 ALTER 之前表的任何待处理内容都已被处理,因为 InnoDB 通常会重建整个表以响应此命令,因此唯一可能的“待处理”更改是 ALTER 之后发生的 DML。

关于MySQL InnoDB 引擎重启,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com