[ERROR] [FATAL] InnoDB: Over 95 percent of the buffer pool is occupied by lock heaps or the adaptive。
这个问题是发生在mysql 5.7系列5.7.20及之前的版本,8.0系列8.0.3及之前的版本的bug,在5.7.21/8.0.4上已修复。在这个错误发生时,可以通过select * from performance_schema.memory_summary_global_by_event_name where EVENT_NAME like 'memory/innodb%' order by CURRENT_NUMBER_OF_BYTES_USED desc 观察到大量的内存使用。
问题的原因是mysql在处理包含外键约束的update/delete语句时,使用了迭代的方式来处理外键约束关联的表,对更新的每一行都创建一个update node,并从innodb buffer pool内存池堆中分配内存。但是在删除操作结束后并没有将内存释放回操作系统。最后的这句解释了我长久以来的一个问题,当初有一个库,整个库的大小并不大,但是在最终崩溃后的日志里发现,外键相关的锁,锁住了大约1500w记录,这个记录数超过了库中所有表合起来的大小(因为内存没有释放回操作系统?),当日苦思不解,今时豁然开朗。
具体的可以看这里:https://github.com/mysql/mysql-server/commit/7b26dc98a624d5cdf79cd5eee455cb03e3bccb5a
Bug #26191879 FOREIGN KEY CASCA