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());