Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

02 | 日志系统:一条SQL更新语句是如何执行的? #7

Open
git-zjx opened this issue Jul 16, 2019 · 0 comments

Comments

@git-zjx
Copy link
Owner

commented Jul 16, 2019

更新语句的执行流程和查询语句的执行流程类型,区别在于更新语句会使查询语句失效,同时还会涉及到两个日志模块:redo log (重做日志)和 bin log (归档日志)

redo log(重做日志)

当有一条记录需要更新时,InnoDB 引擎就会先把记录写到 redo log 中,并更新内存,此时更新算是完成了,之后,InnoDB 引擎会在适当的时候将记录写入磁盘中。

这里涉及到 WAL 技术(Write-Ahead Logging),先写日志,再写磁盘

redo log 的大小是固定的,且是循环写的,redo log 赋予了 InnoDB 引擎 crash-safe 能力

bin log(归档日志)

两种日志的区别:

  1. redo log 是 InnoDB 引擎特有的;bin log 是 Server 层实现的,所有引擎都可以用
  2. redo log 是物理日志,记录的是 “在某个数据页上做了什么修改”;bin log 是逻辑日志,记录的是语句的原始逻辑,例如:给 ID=2 这一行的 C 加 1
  3. redo log 是循环写的,空间固定会用完;bin log 是追加写的,文件写到一定大小,会切换到下一文件,不会覆盖

两阶段提交

2e5bff4910ec189fe1ee6e2ecc7b4bbe

主要是为了保证 redo log 和 bin log 保持一致

配置
innodb_flush_log_at_trx_commit 参数为 1 时,每次事务的 redo log 都会直接持久化到磁盘
sync_binlog 参数为 1 时,每次事务的 bin log 都会直接持久化到磁盘

问题

  1. 写redo日志也是写io(我理解也是外部存储)。同样耗费性能。怎么能做到优化呢?
    redo log是顺序写,并且可以组提交,还有别的一些优化,收益最大是是这两个因素
  2. 数据库只有redo commit 之后才会真正提交到数据库吗
    是这样,正常执行是要commit 才算完,但是崩溃恢复过程的话,可以接受“redolog prepare 并且binlog完整” 的情况
  3. bin log为什么说是逻辑日志呢?
    逻辑日志可以给别的数据库,别的引擎使用,已经大家都讲得通这个“逻辑”;
    物理日志就只有“我”自己能用,别人没有共享我的“物理格式”

@git-zjx git-zjx self-assigned this Jul 16, 2019

@git-zjx git-zjx removed their assignment Jul 16, 2019

@git-zjx git-zjx added this to MySQL实战45讲 in MySQL Jul 16, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
1 participant
You can’t perform that action at this time.