美文网首页Mysql一些收藏js css html
mysql之日志系统:SQL更新语句逻辑

mysql之日志系统:SQL更新语句逻辑

作者: 每天进步一点点变成更好的自己 | 来源:发表于2022-04-15 21:34 被阅读0次

    mysql的2个重要日志:物理日志redo log和逻辑日志 binlog。
    redo log: 保证crash-safe能力
    每次事务的redo log持久化到磁盘:innodb_flush_log_at_trx_commit=1
    每次事务的binlog 持久化到磁盘:sync_binlog=1

    1、redo log

    WAL技术:Write-Ahead Logging,关键点是先写日志,在写磁盘。
    crash-safe: 有了redo log,InnoDB就可以保证即时数据库发生异常重启,之前提交的记录都不会丢失。
    当需要更新一条语句时,InnoDB引擎会先把记录写到redo log里面,并更新内存。同时,在后续适当的时候,把这个操作记录更新到磁盘里面。

    redo log是InnoDB引擎特有的日志,物理日志,记录的是在某个数据页做了什么修改。redo是循环写日志,空间固定会用完。redo log主要节省的是随机写磁盘的IO消耗(转成顺序写)。

    2、binlog

    binlog是服务层Server层中特有的日志,所有引擎都可以使用,binlog是逻辑日志,记录这个语句的原始逻辑。比如给ID=2这一行的C字段加1。
    binlog是可以进行追加写入,写到一定大小后会切换到下一个,并不会覆盖以前的日志。

    3、SQL更新语句逻辑

    update语句执行流程:mysql> update T set c=c+1 where ID=2;
    第一步,执行器先找引擎取ID=2这一行,ID是主键,引擎直接用树搜索找到这一行。如果ID=2,这一行所在的数据页本来就在内存中,直接返回给执行器,否则,需要先从磁盘读入内存,然后再返回。
    第二步,执行器拿到引擎给的行数据,执行操作,再调用引擎接口写入这行新数据。
    第三步,引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,redo log处于prepare状态,随后告知,执行器执行完毕,随时可以提交事务。
    第四步,执行器生成这个操作的binlog,并把binlog写入磁盘。
    第五步,执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log改成提交状态,更新完成。

    image.png

    相关文章

      网友评论

        本文标题:mysql之日志系统:SQL更新语句逻辑

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