MySQL

binlog 默认记的不是 SQL

我一直以为 binlog 记的是执行过的 SQL。其实 binlog_format 默认是 ROW:记每一行改前和改后的样子。

格式记什么
ROW(默认)每行改前、改后的值
STATEMENTSQL 原文
MIXED一般记语句,可能不安全时改记行

ROW 的好处是从库重放结果确定,不怕 NOW()、UUID()、LIMIT 没有 ORDER BY 这类「同一条 SQL 两边结果不同」的问题。代价是改很多行时,日志会很大。

例外:CREATE、ALTER 这种 DDL,在 ROW 格式下仍然记语句。

esc