由于工作需要,需要确认IO_CACHE对于mysql binary log的安全性的影响,在系统崩溃的情况下对于存在IO_CACHE是否会影响数据的安全性。本文主要根据mysql 源代码分析mysql binary log 中IO_CACHE的相关原理的应用。
在mysql的源码上MYSQL_BIN_LOG类有2份实例,分别对应mysql binary log和 mysql relay log.本文主要对 mysql binary log 的write方法进行分析,观察在写入是由于缓存的存在是否对系统造成数据不能持久化行为。
相关代码如下:
sql/log.c (暂时去除row based 模式的binary log代码)
由此可见在涉及IO_CACHE时有2个动作值得关注,及在log event 类中的write动作和本类中的flush_and_sync动作。我从客户端出发了一个insert动作,服务器端跟踪 log event中的write动作可以观察到:
在Query_log_event::write 前部为向buffer中放入需要写入的header 和body,最后调用my_b_safe_write 写入。下面为my_b_safe_write函数。
Mf_iocache.c
最后调用宏 my_b_write, 此宏中只是做了IO_CACHE的memory copy动作,数据到此为止并不安全。
而真正的写入是在前面所讲的flush_and_sync动作中
下面是对应的堆栈:
由代码可见,IO_CACHE的存在对于binary log 的数据安全存在一定的隐患,但是相比与innodb中的buffer cache来说,binary log 在写入数据后立即flush和sync动作保证了数据不会大量丢失。