@
king666wyx 崩溃的意思是,因为软件 bug 或硬件缺陷,导致程序没按正常逻辑去处理。
这些都不是 innodb_flush_log_at_trx_commit 能够处理的事情。
比如 DB 在 malloc 时没处理 NUMA 的场景,导致 malloc 失败,DB 整体崩溃,而此时恰好 DB 有别的线程在处理日志数据落地到数据文件的逻辑,DB 崩溃造成数据文件的 lock 没处理,且存在脏数据。
再比如内存条是非 ECC / RECC 的,且突然有了坏块,坏块位置刚好是 DB 事务 queue length 位置,由 length 由 1024 突然变成 拷斤锟,于是 queue 后续的 data 读到了内存中的未知区域,这些数据被当成正常数据刷入日志文件,最后日志数据落地到数据文件时,发现数据结构与表结构对不上,报错。
这些还是内部逻辑。
外部的情况会更复杂,比如使用超过物理磁盘容量的稀疏虚拟磁盘文件,当实际数据量超出物理磁盘容量后,如果存储组件有 bug ,会导致超过容量的数据全部存储失败,且无告警。
再比如某些分布式文件系统,内部有 bug ,双副本的独占文件块在被 DB 使用时,其中某个物理节点被管理员强制进入维护状态。此时文件系统,本来应该按业界操作规范,先另寻可用物理节点,然后进行版本记录 -> 版本之前的历史数据同步 -> 版本后的新数据同步 -> 锁上整个分布式文件系统的写操作 -> 同步最后差异数据 -> 解锁写操作。但因为 bug 的存在,当某个物理节点被管理员强制进入维护状态时,另一个可用物理节点的超时等待时间过长,积压数据过多,积压的数据因程序 bug ,没能进入 swap 与 持久存储缓存,导致这唯一可用的节点也因为 oom 而崩了,最终丢失数据。
还有一个不仅是丢失数据,而是直接数据全毁的例子,某知名大牌虚拟化厂商,其快照实现有 bug ,本来多层快照,在 HDD 介质中,导出时,因需要大量 4k rand 操作,来进行多层快照合并,速度贼慢,而且写这块实现的程序员,贪图方便,使用了无缓存无副本的直接对快照文件进行文件内处理的高风险方法;此时,用户态的管理工具,是另一个程序员写的,两人没沟通、没写上处理逻辑,导致管理工具,没有等待与检查快照合并逻辑,而是简单粗暴地直接使用了一个超时时间,超时后就直接中断快照合并逻辑。当快照数量多,数据量大的情况下,前者的合并操作因超时,被后者打断,导致了在用户角度看来,复制整个虚拟磁盘或虚拟机时,超时失败,且原始虚拟机磁盘数据损坏。简单来说,就好比,你复制一个电影,复制失败了,且原始的电影也播放不了。