设置时
innodb_fast_shutdown=0
MySQL 在关闭/崩溃之前丢弃所有不完整的事务。默认值为1
,这对于保留不完整的事务是可以理解的。
然而,在恢复模式(例如,innodb_force_recovery = 6
)中,MySQL 将所有未完成的事务视为已提交。由于事务不完整,这显然会损坏表。
当损坏整个表时保留不完整事务的目的是什么?
如果在某些情况下有必要,为什么不能像保存表innodb_force_recovery
一样简单地删除所有未完成的事务(当它们无法提交时) ?innodb_fast_shutdown=0
还是我错过了什么?
innodb_fast_shutdown
控制更改缓冲区,而不是重做日志。无论是什么值innodb_fast_shutdown
,如果事务在关闭时未提交,它将无法在重新启动时存活。如果事务已提交,那么它是否会持续取决于
innodb_flush_log_at_trx_commit
. 如果它是默认值 1,则事务将持续存在。如果 != 1,可能不会持续存在。现在,
innodb_force_recovery
. 这是可能的。当您在事务中运行 UPDATE 时,新记录将写入页面(在缓冲池中,页面变脏)。稍后,即使事务尚未提交,数据页也可以刷新到磁盘。当你不得不使用innodb_force_recovery
这意味着你已经准备好牺牲数据一致性(这就是你所说的损坏的表吗?)只是为了取回一些数据。innodb_force_recovery=6
InnoDB 试图挽救尽可能多的数据。它无法完成崩溃恢复过程,但新记录已写入页面 - 为什么不将其提供给用户?innodb_force_recovery
在诉诸“6”之前,应该尝试 1 到 5 的值。他们做的“伤害”更少。Change Buffer 是一种用于更新索引块的“写缓存”。
INSERTs/UPDATEs/DELETEs
它通过延迟二级索引块的读取和写入来提供速度。更具体地说,在此类查询期间,非唯一索引不需要进行读取或写入。但它们最终必须完成。在某些情况下,“更改”可以显着“批量”以提高效率。关闭时刷新意味着执行所有读取-修改-写入操作以更新可能数千个索引块。但是启动会更快。
等到重新启动后意味着找出丢失的内容并重建它。
一些人使用的折衷方案是逐渐减少
innodb_change_buffer_max_size
(默认 = 25,表示 buffer_pool 的百分比),以便逐渐刷新更改缓冲区。这使得关机和启动都相对“快速”。不完整事务的丢弃与
innodb_fast_shutdown
. 它仅影响它们是否在关闭之前回滚,或者在启动时恢复。>= 4 的 innodb_force_recovery 在手册中有注释“此值可能永久损坏数据文件” 。一旦你达到这个水平,如果你能得到任何回报,我将不胜感激:-)。