# mysql三大日志
# The Binary Log
The Binary Log 是我们常说的 binlog
binlog 简单的来说就是归档日志,是 MySQL Server 服务层面的日志,不属于存储引擎特有,记录了某个数据做了什么修改;
# 如何开启 binlog
在 MySQL8 中默认是启用 binlog 的
# binlog 有几种格式?
binlog 有三种格式
- statement
- row
- mixed
在 MySQL5.7.7
之前,默认的格式是 statement,在 MySQL5.7.7
之后,默认的格式是 row。
日志格式由参数 binlog_format 指定,查看一下的 binlog 格式:
show global variables like '%binlog_format%';
TODO: 这里的优缺点需要去验证是否正确
详细介绍这三种模式
statement:每一条会修改数据的 sql 语句会记录到 BinLog 中
优点:不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO,从而提高了性能;
缺点:在某些情况下会导致主从数据不一致,比如执行 sysdate()
、sleep()
等。
row:基于行的复制,不记录每条 sql 语句的上下文信息,仅需记录哪条数据被修改了。
优点:不会出现某些特定情况下的存储过程、function、trigger 的调用和触发无法被正确复制的问题;
缺点:会产生大量的日志,尤其是 alter table 的时候会让日志暴涨(因为这相比于 statement 的只记录一条 sql,row 格式的 binlog 会写入大量的行记录日志)
AI 给出的例子
+-------------+------+
| id | name |
+-------------+------+
| 1 | John |
| 2 | Mary |
+-------------+------+
# 执行语句:UPDATE test SET name='Susan' WHERE id=2
# 二进制日志
UPDATE test SET name='Susan' WHERE id=2 ### UPDATE test SET name='Mary' WHERE id=2
mixed:基于 statement 和 row 两种模式的混合复制,一般的复制使用 statement 模式保存 binlog ,对于 statement 模式无法复制的操作使用 row 模式保存 binlog。
新版的 MySQL 中对 row 级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。
# binlog 与 canal
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
canal 就要求 binlog-format 使用 row 模式
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
← buffer_pool mysql主从 →