MySQL:修改系统时钟会导致数据库hang住吗?
作者简介:高鹏,笔名八怪。《深入理解MySQL主从原理》图书作者,同时运营个人公众号“MySQL学习”,持续分享遇到的有趣case以及代码解析!
水平有限,有误请谅解
约定:
- page rwlock:控制page frame本生的读写锁,这个通常再进行对page的读取和修改的时候会涉及到,比如对page的修改需要上x类型的锁。
- page mutex:主要控制page的io状态等信息的mutex,本文不涉及。
- MTR:最小日志单元,对于写操作而言,其中包含了redo信息和page rwlock信息,MTR提交的时候会释放page rw lock,并且将本次MTR的redo信息写到redo buffer。
一、问题展示
最近遇到2次这个比较奇葩得问题,一次是8.0.16/一次是8.0.18,主要是信号量监控线程发现读写锁超时自杀重启数据库。问题现象如下:
- 读写锁超时crash
主要的等待在如下的rwlock上,如下:
- 某线程 --Thread 140571742508800 has waited at buf0flu.cc line 1357 for 830 seconds the semaphore
- 某线程 --Thread 140579717510912 has waited at btr0pcur.h line 656 for 613 seconds the semaphore
当然不是上面这么少,肯定很多,但是类型大概就是这两种。
- 日志系统完全停止
这个问题主要在于整个信号量超时期间,从第一个信息输出到最后一个信息输出都不会变比如如下:
Log sequence number 20600471237
Log buffer assigned up to 20600471237
Log buffer completed up to 20600471237
Log written up to 20600471237
Log flushed up to 20600471237
Added dirty pages up to 20598368792
Pages flushed up to 20598368792
Last checkpoint at 20598368792
...
Pending writes: LRU 0, flush list 2, single page 0