MySQL binlog 原理
2021-11-20 本文已影响0人
技术灭霸
一、介绍
MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中;
作用:
- 复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的
- 数据恢复:通过mysqlbinlog工具恢复数据
- 增量备份
redo log和binlog区别
- binlog是二进制日志,是储存在MySQL Server层面,不管是什么存储引擎,对数据库进行了修改都会产生二进制日志。redo log是属于innoDB层面,只记录该存储引擎中表的修改。并且二进制日志先于redo log被记录。
- redo log是物理日志,记录该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
- redo log是循环写,日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
- redo log作为异常宕机或者介质故障后的数据恢复使用,binlog可以作为恢复数据使用,主从复制搭建。
binlog格式
Mysql binlog日志有ROW,Statement,MiXED三种格式:
- statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。
- row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。
- mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。
举例说明 ROW和Statement两种格式的区别
有 statement,row, mixed3种,其中mixed是指前2种的混合.
以insert into xxtable values (x,y,z)为例,
影响: 1行,且为新增1行, 对于其他行没有影响.
这个情况,用row格式,直接复制磁盘上1行的新增变化.
以update xxtable set age=21 where name=’sss’;
这个情况,一般也只是影响1行. 用row也比较合适.
以过年发红包,全公司的人,都涨薪100元.
update xxtable set salary=salary+100;
这个语句带来的影响,是针对每一行的, 因此磁盘上很多row都发生了变化.
此处,适合就statment格式的日志.
2种日志,各有各的高效的地方,mysql提供了mixed类型.
可以根据语句的不同,而自动选择适合的日志格式.