• MySQL 更新语句执行过程 WAL redolog binlog


    MySQL 更新语句执行过程 WAL redolog binlog

     

    WAL

    全称Write-Ahead Logging --- 先写日志再写磁盘

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

     

    redo log

    • redo log (重做日志)是处于存储引擎层的,是InnoDB引擎特有的

    • redo log 存储的是物理日志 --- 即,“在某个数据页上改动了什么”

    • redo log是循环写,空间是一定的,会用完。

    • InnoDB 引擎的 redo log 的空间是有限的,一组4个文件,每个文件1GB,总共4GB。当这块“临时记录板”写满后再次从开头的地方循环写入。

    • redo log 的写入分为两个步骤 --- perparecommit阶段 --- ”两阶段提交“

     

    有了redo log,就可以保证即使数据库发生异常重启也不会丢失记录,称为 crash-safe

     

    binlog

    • binlog (归档日志) 处于server层,是Mysql自带的日志模块

    • binlog 是存储的是逻辑日志 --- 即,“记录原始语句”。因此可用来恢复数据库 --- 相当于在某个时间的基础上重新运行了一遍相关语句。

    • binlog 是可追加写入的 --- binlog文件写到 一定大小后就会在下一个文件中继续写,而不覆盖之前的文件。

     

    两种日志的使用流程

    • (执行器)读取表中需要update的那一行
    • (InnoDB)查询该行信息是否在内存中。若没有则从磁盘读取到内存。然后都返回行数据
    • (执行器)更改行数据、写入新行
    • (InnoDB)新行更新到内存,写入redo log (此时处于prepare阶段)
    • (执行器)写入binlog
    • (InnoDB)提交事务 (此时处于commit阶段)

    使用“两阶段提交”是为了避免恢复时恢复出来的数据库与原有状态不一致的现象。

     

    避免MySQL crash时数据丢失的设置

    我们知道发生crash时丢失的肯定都是内存中的数据,通过以下设置进行持久化

    • redo log 用于保证 crash-safe 能力,将innodb_flush_log_at_trx_commit = 1 --- 每次事务的 redo log 直接持久化到磁盘
    • sync_binlog = 1 --- 每次事务的binlog都持久化到磁盘

     

    恢复与扩容

    • 最近的全量备份+到相应时间点的归档日志(binlog)

     

  • 相关阅读:
    Mybatis的XML中数字不为空的判断
    初步使用VUE
    Vue中实现菜单下拉、收起的动画效果
    Docker For Windows时间不对的问题
    freemarker使用自定义的模板加载器通过redis加载模板
    .net core 打印请求和响应的内容
    codedecision P1113 同颜色询问 题解 线段树动态开点
    洛谷P2486 [SDOI2011]染色 题解 树链剖分+线段树
    洛谷P3150 pb的游戏(1)题解 博弈论入门
    codedecision P1112 区间连续段 题解 线段树
  • 原文地址:https://www.cnblogs.com/G-Aurora/p/13182306.html
Copyright © 2020-2023  润新知