这一期的内容可能设计一些底层的知识,我会尽量用通俗的语言为大家讲解,如果有哪里不明白的也可以到本周日的培训上来交流,那么话不多说,就让我们开始这趟MySQL之旅吧!
ACID是我们学习关系型数据库(MySQL)绕不开的东西,这是能保证数据库逻辑与结构正常工作的基本,关系型数据库中有很多关于ACID的设计,今天我就举其中最有代表性的一个,让大家初步认识到什么是ACID(原子性、隔离性、持久性、一致性),那么什么是2PC?
1、我们首先要了解两个日志——redo log 和 bin log

redo log是一个实时记录的日志但是有两状态(prepare,commit),但是空间有限可以理解成一个有固定大小的画板,用于记录你的一些临时草稿,完成后就擦除掉。有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe。
bin log是一个可以无限加页的本子,把你的每一条笔记都记录在里面。
2、2PC的流程是什么?

我来简单描述一下这个流程:首先我们想要存入一条数据到数据库中,在执行器执行命令的期间会发生这些事情:
数据写入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,在磁盘上的物理位置可能隔了几百兆字节。磁头需要频繁地“寻道”和“旋转”,这极其耗时。

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_logfile0、ib_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.000001、mysql-bin.000002。此外还有一个.index文件,记录了当前所有的 binlog 文件清单。 - 默认路径:同样默认存放在
datadir下,但在生产环境下,为了安全和性能,DBA 经常会把它挂载到独立的磁盘上。
如何查找:
-- 查看 binlog 的基础路径和文件名
SHOW VARIABLES LIKE 'log_bin_basename';
-- 查看当前正在使用的 binlog 文件名
SHOW MASTER STATUS;
最后,如果你是一个数据库小白(虽然我也是),我很高兴你能看到这儿,可能你会对其中的一些知识感到困惑,但学习何尝不是这样,是一段对未知不断发起挑战的旅程,我相信当你与同学下次谈论到数据库有关的东西时,他们还在那里说一些查询语句的时候,你已经看透了本质在一旁憋笑了......好了好了,总之,希望通过今天这一篇文章,提起大家对技术类底层学习的一点兴趣吧,相信这样你会走的更远!
原创:GoForth 编辑:GoForth