最近,我的 mariadb 崩溃了,这引发了一场噩梦。当我恢复转储时,有时守护进程会在批量插入期间挂起。这种情况只发生在少数“大”innodb 表上(我有许多小型数据库,它们实际上不包含太多数据,而大多数其他数据库仅在少数表中包含大量数据)。数据库通常最终会恢复(有时在几个小时后),但有时会崩溃。我在几分钟之内就在另一台机器上恢复了数据库,没有出现任何问题,然后将数据目录移动到生产机器上。两者之间唯一的严重区别是成功的机器不是虚拟机和运动 SSD 存储。
从那时起,所描述的问题仍然在随机时间发生,并且总是在访问这些大表时发生。一般来说,我会冻结多个查询,但有时只有一个查询就足以触发该行为。
我发现实际上很难相信的是,iotop 报告了一个 mariadb 线程在查询挂起的整个过程中每秒稳定地写入千兆字节。这在物理上是不可能的,因为磁盘的性能甚至无法接近这些数字。我还搜索了互联网以找到可以优化设置的方法,直到几天前,这些设置似乎非常适合我的环境,我调整了一些变量,但没什么大不了的,“导入成功”机器上的默认值也没有太大不同首先。
这个问题与https://jira.mariadb.org/browse/MDEV-30884类似,但是自从我在 Gentoo 上使用 10.6.14(我也测试了 10.6.15)以来,这个问题应该已经得到解决。
我很茫然,这可能是什么原因造成的?机械硬盘存储能否以某种方式证明正在发生的事情是合理的?
似乎 mariadb 默认配置和 qemu 在某些情况下无法相处,目前还不清楚发生了什么。请参阅guest-agent fs-freeze 无法在使用 Debian 11 + MariaDB 10.6 和 10.7 的虚拟机上运行
innodb_flush_method=fsync
自从我设置和以来,我就有了一个正常运行的系统innodb_use_native_aio=0
。