天天看点

binlog日志的三种方式

mysql的binlog说明

主从复制依赖于二进制日志文件,简称为binlog

binlog里面有存放了偏移信息

mysql主库binlog信息查看命令,登录到mysql里

show master logs; #binlog列表查看

show master status; #记录目前的binlog+偏移信息

创建库创建表初始binlog

create database shijiange;

use shijiange;

create table test (id int);

查看binlog的两种方式

show binlog events in 'master-bin.000003';

show binlog events in 'master-bin.000003' limit 2;

show binlog events in 'master-bin.000003' from 120;

show binlog events in 'master-bin.000003' from 120 limit 1;

mysqlbinlog master-bin.000003;

增删改查,然后查看binlog

insert into test values (1); #插入数据

update test set id = 3 where id = 1; #更新数据,有事务的提交

select * from test; #无数据的改变,无需记录binlog

delete from test; #删除数据,事务提交

use mysql;

insert into test values (1); #错误sql不会写入binlog

mysql主库binlog清空,测试教学环境用,线上环境慎用。或者初搭建mysql主从用

reset master;

show master logs;

mysql主库刷新binlog,一般来说也是测试环境用

flush logs;

show master logs; #增加一个二进制日志

show binlog events in 'master-bin.000001'; #记录了下一个binlog的文件名和索引

show binlog events in 'master-bin.000002';

测试数据删除

drop database shijiange;

查看mysql主库的binlog格式

binlog仅在主库设置即可,从库无需设置

binlog的默认方式为STATEMENT ( show variables like '%binlog_format%'; )

mysql主库的binlog有三种方式

statement #最古老的方式,基于sql的主从复制。binlog里面保存的都是sql语句,binlog日志量小。但如果像uuid()的话,数据会不一致

row #基于行的主从方式,保证数据一致性,binlog里面保存的是更改信息。binlog日志量大。阿里云默认使用这种方式

mixed #statement和row格式的结合,一般使用statement

主从复制的方式可以动态更改,无需重启mysql

set binlog_format = ROW; #针对当前的会话,会话退出后就会还原成STATEMENT

show variables like '%binlog_format%';

set global binlog_format = ROW; #针对所有的会话,但是重启后又会恢复为STATEMENT

mysql配置文件新增binlog_format = ROW #永久把binlog格式替换为ROW

row格式的binlog长什么样?row格式主要是记录了更改

create database shijiange; #记录sql

create table test( id int ); #记录sql

insert into test values (1); #插入数据,show binlog events看不到内容

update test set id = 3 where id = 1; #记录更改,show binlog events看不到内容

alter table test add age varchar(50); #记录sql

delete from test; #记录更改,show binlog events看不到内容

数据安全,但binlog的日志量比较大,试想,如果删除、更新了上百万行的话

insert into test values (2, UUID());

继续阅读