binlog 默认记的不是 SQL
我一直以为 binlog 记的是执行过的 SQL。其实 binlog_format 默认是 ROW:记每一行改前和改后的样子。
| 格式 | 记什么 |
|---|---|
| ROW(默认) | 每行改前、改后的值 |
| STATEMENT | SQL 原文 |
| MIXED | 一般记语句,可能不安全时改记行 |
ROW 的好处是从库重放结果确定,不怕 NOW()、UUID()、LIMIT 没有 ORDER BY 这类「同一条 SQL 两边结果不同」的问题。代价是改很多行时,日志会很大。
例外:CREATE、ALTER 这种 DDL,在 ROW 格式下仍然记语句。