美文网首页
MySQL binlog 原理

MySQL binlog 原理

作者: 技术灭霸 | 来源:发表于2021-11-20 16:20 被阅读0次

    一、介绍

    MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

    binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是完全不同的日志;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,并以"事务"的形式保存在磁盘中;

    作用:

    1. 复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves并回放来达到master-slave数据一致的目的
    2. 数据恢复:通过mysqlbinlog工具恢复数据
    3. 增量备份

    redo log和binlog区别

    1. binlog是二进制日志,是储存在MySQL Server层面,不管是什么存储引擎,对数据库进行了修改都会产生二进制日志。redo log是属于innoDB层面,只记录该存储引擎中表的修改。并且二进制日志先于redo log被记录
    2. redo log是物理日志,记录该数据页更新的内容;binlog是逻辑日志,记录的是这个更新语句的原始逻辑
    3. redo log是循环写,日志空间大小固定;binlog是追加写,是指一份写到一定大小的时候会更换下一个文件,不会覆盖。
    4. 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类型.

    可以根据语句的不同,而自动选择适合的日志格式.

    相关文章

      网友评论

          本文标题:MySQL binlog 原理

          本文链接:https://www.haomeiwen.com/subject/ifqutrtx.html