MySQL日志系统

  • 一条更新语句的执行流程又是怎样的呢?
  • create table T(ID int primary key, c int);
  • 如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写:
  • update T set c=c+1 where ID=2;
    查询流程不一样的是,更新流程还涉及两个重要的日志模块
日志模块:redo log(物理日志)

每次一次更新操作都需要写进磁盘,然后磁盘也要找到对于记录,然后在更新,整个I/O成本,查找成本都很高;

  • ,InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末尾就又回到开头循环写,如下面这个图所示。

innodb保证数据库发生异常,之前的记录也不会丢失,这个能力称为crash-safe.

日志模块:binlog(逻辑日志)
  • 两阶段提交流程图:

1,执行器先找到引擎ID=2,ID是主键,引擎用树搜索找到者这行;
2, 如果ID=2这一行所在数据页本来就在内存中,直接返回给器,否则需要从磁盘读入内存,然后在返回。执行器拿到引擎给的行数据,把这个值加1,比如原来是N,那么现在是N+1,得到新的一行数据,在调用引擎接口写入这行新数据;
3,引擎将这行新数据更新到内存中,同时这个更新记录到redo log里面,此时redol处于prepare状态;
4, 执行器调用引擎的提交事务接口,引擎刚刚写入的redo log改成提交(commit)提交状态,更新完成;

为什么两阶段提交?

先写 redo log 后写 binlog,假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来;

先写 binlog 后写 redo log 如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效;

posted @ 2021-02-22 14:49  惊风破浪的博客  阅读(45)  评论(0编辑  收藏  举报