binlog是用于记录数据库的修改以及潜在的修改行为的二进制文件。为了提高性能,mysql默认只打了一些错误日志,若要开启binlog,需要做如下操作:
windows环境在my.ini文件中添加log-bin=C:/Program Files/MySQL/MySQL Server 5.5/binlog/mysqlbin-log,重启mysql服务后生效; linux环境在my.cnf中添加log-bin=.../mysqlbin-log,重启mysql服务后生效。
binlog文件有多个,包括一个索引文件(mysqlbin-log.index)和一系列日志文件(mysqlbin-log.000001...mysqlbin-log.xxxxxx)。 索引文件跟踪所有的日志文件,控制日志文件的创建和命名,索引文件的每一行都包含一个完整的日志文件,要查看所有的日志文件,可以使用命令:show binary logs,会列出所有的binlog文件,及其每个文件的大小。可以在my.ini中修改binlog文件的大小ma_binlog_size=xx如果超过这个值会重新创建一个binlog文件。mysql服务重启一次也会创建一个新的binlog文件。
每个binlog文件由若干binlog事件组成,以Format_desc事件开始,以日志轮换事件结束。这些binlog事件按事务分为多个组,如果一个语句支持事务,那么它所包含的多个事件形成一个组,如果不支持事务,或者只有一个事件的单条语句,自成一组。所以,在binlog文件中的事件组要么是不属于事务的单个语句,要么是由多条语句组成的事务。
每个事件由通用头、提交头、事件体组成。每个事件都有一个固定大小(19字节)的通用头
SQL开始时间:4字节
事件类型:1字节
服务器ID:4字节
事件大小:4字节
下个事件开始位置:4字节
状态信息:2字节
可以使用mysqlbinlog工具来查看二进制文件的通用头。提交头与特定的事件类型有关,但是在同一个binlog文件中同一种事件类型大小固定。事件体存储事件的主要数据,内容因事件类型不同而异。
为了避免两个线程同时更新一个日志,在事件写入二进制日志之前,需要获取一把互斥锁。
数据操作语言(DML):对于DELETE,INSERT,UPDATE等语句,为了保证数据一致性,在写二进制日志之前还需要获取一把事务级锁,写完后释放。
数据定义语言(DDL):对于ALTER,CREATE等语句直接修改表的数据结构,在修改之前也需要先获取锁,由于这样的锁只有一把,所以常做这样的操作会有性能问题。
查询语句:最常见的binlog事件是查询事件,除了实际执行的语句外,Query事件还包括一些附加信息,这些附加信息在不同的上下文取值可能不同,所以在Query事件中需要记录这些附加值。这些值包括
当前数据库:如果语句中全用了表或者数据库,默认用当前数据库;
RAND函数的种子:如果语句中用到了随机函数,需要记录种子;
当前时间:语句开始的时间是隐式信息,也是需要记录的;
自增字段插入值:对于标识为AUTO_INCREMENT的字段,新插入的值也是隐式的;
LAST_INSERT_ID:与AUTO_INCREMENT类似,取决于上一个语句的插入值;
线程ID:有些语句的线程ID是隐式的。
(责任编辑:IT) |