1. 什么是 Binlog
MySQL
的二进制日志可以说
MySQL
最重要的日志了,它记录了所有的
DDL
和
DML(
除了数据查询语句)
语句,以事件形式记录,还包含语句所执行的消耗的时间,
MySQL
的二进制日志是事务安全型的。
一般来说开启二进制日志大概会有
1%
的性能损耗。二进制有两个最重要的使用场景
:
其一:
MySQL Replication
在
Master
端开启
Binlog
,
Master
把它的二进制日志传递给
Slaves
来达到
Master-Slave
数据一致的目的。
其二:
自然就是数据恢复了,通过使用
MySQL Binlog
工具来使恢复数据。
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为
.index
)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*
)记录数据库所有的
DDL
和
DML(
除了数据查询语句)
语句事件
2. Binlog 的分类
MySQL Binlog
的格式有三种,分别是
STATEMENT,MIXED,ROW
。在配置文件中可以选择配 置 binlog_format= statement|mixed|row
。
三种格式的区别:
1
)
statement
:
语句级,
binlog
会记录每次一执行写操作的语句。相对
row
模式节省空间,但是可能产生不一致性,比如“update tt set create_date=now()
”,如果用
binlog
日志进行恢复,由于执行时间不同可能产生的数据就不同。
优点:节省空间。
缺点:有可能造成数据不一致。
2
)
row
:
行级,
binlog
会记录每次操作后每行记录的变化。
优点:保持数据的绝对一致性。因为不管
sql
是什么,引用了什么函数,他只记录 执行后的效果。
缺点:占用较大空间。
3
)
mixed
:
statement
的升级版,一定程度上解决了,因为一些情况而造成的
statement模式不一致问题,默认还是 statement
,在某些情况下譬如:当函数中包含
UUID()
时;包含AUTO_INCREMENT 字段的表被更新时;执行
INSERT DELAYED
语句时;用
UDF
时;会按照ROW 的方式进行处理
优点:节省空间,同时兼顾了一定的一致性。
缺点:还有些极个别情况依旧会造成不一致,另外
statement
和
mixed
对于需要对binlog 的监控的情况都不方便。