MySQL数据的ACID保护机制(2PC)

这一期的内容可能设计一些底层的知识,我会尽量用通俗的语言为大家讲解,如果有哪里不明白的也可以到本周日的培训上来交流,那么话不多说,就让我们开始这趟MySQL之旅吧!

ACID是我们学习关系型数据库(MySQL)绕不开的东西,这是能保证数据库逻辑与结构正常工作的基本,关系型数据库中有很多关于ACID的设计,今天我就举其中最有代表性的一个,让大家初步认识到什么是ACID(原子性、隔离性、持久性、一致性),那么什么是2PC?

1、我们首先要了解两个日志——redo log 和 bin log

1142X856/16a7950217b3f0f4ed02db5db59562a7.png

redo log是一个实时记录的日志但是有两状态(prepare,commit),但是空间有限可以理解成一个有固定大小的画板,用于记录你的一些临时草稿,完成后就擦除掉。有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。

bin log是一个可以无限加页的本子,把你的每一条笔记都记录在里面。

2、2PC的流程是什么?

1142X1522/2e5bff4910ec189fe1ee6e2ecc7b4bbe.png

我来简单描述一下这个流程:首先我们想要存入一条数据到数据库中,在执行器执行命令的期间会发生这些事情:

数据写入redo log 这个过程是瞬间的,然后redo log 进入prepare状态,然后数据会“缓慢”的写入bin log 中,等数据都写入后,redo log 就会变成commit状态,数据存储完成。

3、为什么是这个流程,prepare状态有什么用?

最好理解的情况就是断电,也就是执行器执行命令的期间突然被打断了,InnoDB引擎会怎么处理呢?

1、有没有完整且处于prepare状态redo log 如果没有或者不完整,那就无事发生或者回滚;如果有redo log 进行下一步。

2、bin log是否完整, 如果不完整,那么操作全部回滚 (Rollback) ,删掉这个redo log;如果有,那么就完成 bin log, 然后将redo log改为commit状态提交完成。

4、有一些问题

1、为什么数据写入redo log 这个过程是瞬间的?

A. 顺序写 vs. 随机写(最根本原因)
  • Redo Log顺序追加写入。磁头不需要在磁盘上到处找位置,就像在长长的纸带末尾一直写下去。
  • 数据文件随机写入。因为数据存在 B+ 树里,修改两个相邻的 ID,在磁盘上的物理位置可能隔了几百兆字节。磁头需要频繁地“寻道”和“旋转”,这极其耗时。

2816X1536/Gemini_Generated_Image_7ohhch7ohhch7ohh.png

B. 写入量极小
  • 当你修改一行数据时,数据文件 必须以“页”(Page,默认 16KB)为单位刷盘。哪怕你只改了一个字节,也要刷 16KB。
  • Redo Log 记录的是物理日志。它只记录:“在某个表空间的第几页,偏移量是多少的地方,改成了什么值。”这种记录通常只有几十个字节。
C. 内存缓冲 (Log Buffer)
  • 事务执行时,Redo Log 先写到内存里的 redo log buffer。这个操作是纳秒级的。
  • 只有在事务提交(Commit)或 Buffer 快满时,才会触发一次集中刷盘。

2、redo log 和 bin log的物理位置在哪里?

1. Redo Log 的物理位置

Redo Log 是由 InnoDB 存储引擎 维护的,它的物理文件通常被称为“日志组”。

  • 默认文件名:通常以 ib_logfile 开头,后面跟着数字,例如 ib_logfile0ib_logfile1
  • 默认路径:存放于 MySQL 的 datadir 目录下。

如何查找: 在 Navicat 或命令行中输入以下 SQL:

-- 查看 redo log 存放的根目录(如果为空,则默认在 datadir)
SHOW VARIABLES LIKE 'innodb_log_group_home_dir';

-- 查看数据目录(通常 redo log 就在这里)
SHOW VARIABLES LIKE 'datadir';

2. Bin Log 的物理位置

Bin Log 是由 MySQL Server 层 记录的,它记录了所有修改数据的逻辑操作。

  • 文件名:通常由你设置的名称加上 6 位数字后缀组成,例如 mysql-bin.000001mysql-bin.000002。此外还有一个 .index 文件,记录了当前所有的 binlog 文件清单。
  • 默认路径:同样默认存放在 datadir 下,但在生产环境下,为了安全和性能,DBA 经常会把它挂载到独立的磁盘上。

如何查找

-- 查看 binlog 的基础路径和文件名
SHOW VARIABLES LIKE 'log_bin_basename';

-- 查看当前正在使用的 binlog 文件名
SHOW MASTER STATUS;

最后,如果你是一个数据库小白(虽然我也是),我很高兴你能看到这儿,可能你会对其中的一些知识感到困惑,但学习何尝不是这样,是一段对未知不断发起挑战的旅程,我相信当你与同学下次谈论到数据库有关的东西时,他们还在那里说一些查询语句的时候,你已经看透了本质在一旁憋笑了......好了好了,总之,希望通过今天这一篇文章,提起大家对技术类底层学习的一点兴趣吧,相信这样你会走的更远!

原创:GoForth 编辑:GoForth

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇