回答
MySQL 中 binlog 又称为二进制日志。它记录所有变更数据库状态的语句,变更操作包括数据更新、表结构变更等。Binlog 通常用于数据恢复、主从复制。再者,它是服务层的数据日志,所有 MySQL 存储引擎都支持。
MySQL 的 binlog 有三种格式:STATEMENT、ROW 和 MIXED。
STATEMENT
STATEMENT 格式记录原始的 SQL 语句。通常其产生较小的日志文件,并且因为是按照语句来记录,所以恢复也相对较快。但是,如果存在 SQL 依赖数据库服务器的环境变量或者涉及到随机数生成等,那么在主从复制时会出现数据不一致的问题。
ROW
ROW 格式记录对每一行数据所做的更改。这种格式的日志文件通常较大,但是可以保证主从复制时数据的绝对一致性,即使 SQL 语句涉及到了非确定性函数。
MIXED
MIXED 格式混合了 STATEMENT 和 ROW 两种格式的特点。MySQL 会根据执行的SQL语句的类型,智能地选择使用 STATEMENT 或 ROW 格式记录日志。例如,对于大多数 DML 语句,MySQL 使用 STATEMENT 格式;而对于可能引起数据不一致的语句,如包含 NOW()、RAND() 等函数的语句,MySQL使用 ROW 格式。