由于二进制日志是公共资源,所有线程都要写二进制日志,所以一定要避免两个线程同时更新二进制日志。因此,在事件组写二进制日志时,二进制日志将获得一个互斥锁LOCK_log,然后在事件组写完后释放,由于服务器所有的会话都向二进制日志写事务,所以这个锁经常会阻塞某些会话线程。
1 写入DML语句
通常是指DELETE/INSERT/UPDATE语句,为保证一致性,MySQL在写入二进制日志时同时获得事务级锁,写完后释放锁
在表上锁释放前,在语句提交前同时需要将该语句写入二进制日志,这样就保证了二进制日志始终与语句对表的改动保持一致,如果记录日志没有作为语句的一部分时,有可能其他语句会插在这条语句对数据库的修改和记录二进制两个动作中间。
2 写入DDL语句
通常指的是CREATE TABLE/ALTER TABLE语句,DDL语句会在文件系统中创建或改变对象。为了保护表中的内部数据结构(.frm)得到更新,在修改表定义钱需要先获得一个内部锁LOCK_open
3 写入查询
对于SBR来说,最常见的就binlog事件就是QUERY事件,它将master上执行的语句写入日志,除了实际执行的语句本身,该语句还包含执行语句需要的附加信息
对服务器执行语句时必须知道隐式,隐式包括
1)当前数据库
向QUERY事件添加一个特殊字段,记录当前数据库,处理LOAD DATA INFILE语句的事件也有这个字段。
2)当前时间
有5个函数需要利用到时间NOW CURDATE CURTIME UNIX_TIMESTAMP SYSDATE,前4个返回开始执行的时间,而SYSDATE返回函