mysql-查看binlog日志
binlog有三种格式
- STATEMENT
- ROW
- MIXED
在 MySQL 5.7.7
之前,默认的格式是 STATEMENT
,在 MySQL 5.7.7
及更高版本中,默认值是 ROW
。
可以使用配置文件来修改
vim /etc/mysql/mysql.conf.d/mysqld.cnf
log-bin=mysql-bin # 开启 binlog
# binlog-format=ROW # 选择 ROW 模式
# binlog-format=STATEMENT # 选择 STATEMENT 模式
binlog-format=MIXED # 选择 MIXED 模式
server_id=1000 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
使用以下命令,可以分别查看binlog相关信息
# 查看binlog是否开启
show variables like '%log_bin%';
# 查看binlog格式
show variables like "%binlog_format%";
# 查看binlog文件有哪些
show binary logs;
# 查看binlog内容
show binlog events in '文件名';
STATEMENT
内容
statement格式记录的是语句的本身的内容。如图所示
特点
**优点:**日志文件小,节约i/o,性能好
**缺点:**准确性差,对于系统函数now(), uuid()和自增值AUTO_INCREMENT等不能准确复制,或者不能复制。
ROW
5.1.5版本的MySQL才开始支持 row level
的复制
内容
row记录数据变化的内容,没有上下文
特点
优点: 准确,没有上下文信息。
**缺点:**日志文件大,性能差
MIXED
从5.1.8版本开始,MySQL提供了Mixed格式,实际上就是Statement与Row的结合。
在Mixed模式下,一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
使用5.7.23版本去执行以下语句,binlog内容如图所示
insert into t values(null, 1, 1); 没有指定自增id插入 使用statement
insert into t values (2,2,2); 指定自增id插入 使用statement
alter table t add column e varchar(10); 增加字段 使用statement
alter table t modify column e varchar(255); 修改字段 使用statement
insert into t values (2,2,2,UUID()); 使用了uuid()函数,使用row
delete from t2 where id < 10; 删除使用statement
insert into t2(c,d) select c,d from t; 批量插入使用row
使用MIXED格式,如何判断选择row还是statement,官网给出了以下case。
When running in MIXED logging format, the server automatically switches from statement-based to row-based logging under the following conditions:***(当使用MIXED格式时,将使用row来记录binlog。其余全部使用statement)***`
- `When a DML statement updates an NDBCLUSTER table.(在NDBCLUSTER集群中使用dml 修改时)`
- `When a function contains UUID().(使用uuid函数时)`
- `When one or more tables with AUTO_INCREMENT columns are updated and a trigger or stored function is invoked. Like all other unsafe statements, this generates a warning if binlog_format = STATEMENT.`
`For more information, see Section 16.4.1.1, “Replication and AUTO_INCREMENT”.
......
总结 使用mixed格式,当mysql认为会导致数据不一致就会采用row,否则会使用statement。但是还是会有不一致的风险存在,所以目前生产级别还是推荐使用row级别