Mysql的binlog有三种格式:
1.Statement-based(SBR):
- 格式描述:记录的是SQL语句。例如,当执行一条INSERT INTO table_name (col1, col2) VALUES ('value1', 'value2');语句时,binlog中记录的就是这条完整的INSERT语句。
优点:
- 日志文件相对较小,因为只记录SQL语句,而不是每一行数据的变化。
- 对于一些简单的操作,可读性好,通过查看binlog能很清楚地知道执行了哪些SQL语句。
缺点:
- 在某些情况下,可能会导致主从复制不一致。例如,使用了非确定性函数(如NOW()、RAND()等),在主库和从库执行结果可能不同。
- 对于一些复杂的DDL操作,可能会有潜在风险。
2.Row-based(RBR):
- 格式描述:记录的是每一行数据的变化。比如对某一行数据进行更新,binlog中会记录更新前和更新后这一行数据的完整内容。
优点:
- 主从复制非常可靠,能保证主从库数据的严格一致性,因为记录的是实际数据的变化。
- 对于一些复杂的业务逻辑,尤其是涉及到触发器、存储过程等,复制效果更好。
缺点:
- 日志文件通常较大,因为要记录每一行数据的变化,占用更多磁盘空间。
- 可读性较差,直接查看binlog难以理解具体执行了什么业务操作。
3.Mixed-based(MBR):
- 格式描述:是前两种格式的混合,Mysql会根据执行的SQL语句类型,自动选择使用Statement-based还是Row-based格式来记录binlog。一般情况下,简单的SQL语句(如不涉及非确定性函数的DML语句)使用Statement-based格式,而对于可能导致主从复制不一致的语句(如使用了非确定性函数的语句)则使用Row-based格式。
优点:
- 结合了SBR和RBR的优点,在保证一定复制可靠性的同时,尽量减少日志文件的大小。
缺点:
- 由于存在自动选择格式的机制,在某些复杂场景下,可能会出现格式选择不符合预期的情况,增加了排查问题的难度。