zoukankan      html  css  js  c++  java
  • 一条SQL更新语句是如何执行的&binlog

    更新语句也会走一遍查询语句的那一套流程,不同的是更新流程涉及两个重要的日志模块,redo log(重做日志)和binlog(归档日志)。

    更新的时候,会把被更新的表上的缓存结果都清空。

    redo log

      InnoDB引擎层的日志

      在更新操作很频繁时,如果每一次的更新操作都需要写磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程IO成本,查找成本都很高。

      先介绍一下MySQL的WAL技术,WAL的全称是Write-Ahead Logging,它的关键点是先写日志,再写磁盘。

    具体来说,当有一条语句需要更新的时候,InnoDB引擎就会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。同时InnoDB引擎会在适当的时候,将这个操作记录更新到磁盘

    里面,而这个更新往往是在系统比较空闲的时候做。

      另外,InnoDB的redo log是固定大小的,从头开始写,写到末尾就又回到开头循环写,因此要在覆盖记录前把记录更新到数据文件中。

    有了redo log,InnoDB就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe

    binlog(归档日志)

      Server层日志

    为什么会有redo log和binlog两份日志呢?

      因为最开始 MySQL 里并没有 InnoDB 引擎。MySQL 自带的引擎是 MyISAM,但是MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB使用另外一套日志系统——也就是 redo log 来实现 crash-safe 能力 

    这两种日志有以下三点不同:

      1、redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。

      2、redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。

      3、redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

    Update语句的执行流程:

      1、执行器先找InnoDB引擎取ID=2的这一行。ID是主键,引擎直接用树(B+树)搜索找到这一行。如果ID=2这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回

      2、执行器拿到引擎给的行数据,执行更新操作,得到新的一行数据,再调用引擎接口写入这行新数据

      3、引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态,然后告知执行器执行完成了,随时可以提交事务。

      4、执行器生成这个操作的binlog,并把binlog写入磁盘

      5、执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交(commit)状态,更新完成。

    mysqlbinlog 工具分析binlog日志

      1、查看是否开启binlog,ON开启,OFF没有开启

      

      2、查看binlog文件

       3、查找mysqlbinlog的位置

        (1)默认位置,使用命令:which mysqlbinlog

        (2)自定义位置,我的在 mysql安装目录的log文件夹中

      4、使用命令分析日志

        mysqlbinlog --no-defaults --database=数据库名 --base64-output=decode-rows -v --start-datetime='2020-07-14 09:56:00' --stop-datetime='2020-07-14 09:58:00' mysql-bin.000052| more

  • 相关阅读:
    BZOJ 1021 循环的债务
    BZOJ 1019 汉诺塔
    BZOJ 1018 堵塞的交通
    BZOJ 1017 魔兽地图
    BZOJ 1016 最小生成树计数
    Luogu 3008 [USACO11JAN]道路和飞机Roads and Planes
    Luogu 3625 [APIO2009]采油区域
    Luogu 4139 上帝与集合的正确用法
    Luogu 3629 [APIO2010]巡逻
    Luogu 3626 [APIO2009]会议中心
  • 原文地址:https://www.cnblogs.com/yangyongjie/p/13323989.html
Copyright © 2011-2022 走看看