File tree Expand file tree Collapse file tree 2 files changed +3
-3
lines changed
Expand file tree Collapse file tree 2 files changed +3
-3
lines changed Original file line number Diff line number Diff line change 2929
3030简单来说 MySQL 主要分为 Server 层和存储引擎层:
3131
32- - ** Server 层** :主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binglog 日志模块。
32+ - ** Server 层** :主要包括连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binlog 日志模块。
3333- ** 存储引擎** : 主要负责数据的存储和读取,采用可以替换的插件式架构,支持 InnoDB、MyISAM、Memory 等多个存储引擎,其中 InnoDB 引擎有自有的日志模块 redolog 模块。** 现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始就被当做默认存储引擎了。**
3434
3535### 1.2 Server 层基本组件介绍
@@ -117,7 +117,7 @@ update tb_student A set A.age='19' where A.name=' 张三 ';
117117* ** 先写 redo log 直接提交,然后写 binlog** ,假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 bingog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。
118118* ** 先写 binlog,然后写 redo log** ,假设写完了 binlog,机器异常重启了,由于没有 redo log,本机是无法恢复这一条记录的,但是 binlog 又有记录,那么和上面同样的道理,就会产生数据不一致的情况。
119119
120- 如果采用 redo log 两阶段提交的方式就不一样了,写完 binglog 后,然后再提交 redo log 就会防止出现上述的问题,从而保证了数据的一致性。那么问题来了,有没有一个极端的情况呢?假设 redo log 处于预提交状态,binglog 也已经写完了,这个时候发生了异常重启会怎么样呢?
120+ 如果采用 redo log 两阶段提交的方式就不一样了,写完 binlog 后,然后再提交 redo log 就会防止出现上述的问题,从而保证了数据的一致性。那么问题来了,有没有一个极端的情况呢?假设 redo log 处于预提交状态,binlog 也已经写完了,这个时候发生了异常重启会怎么样呢?
121121这个就要依赖于 MySQL 的处理机制了,MySQL 的处理过程如下:
122122
123123* 判断 redo log 是否完整,如果判断是完整的,就立即提交。
Original file line number Diff line number Diff line change 210210
211211![ ] ( https://cdn.jsdelivr.net/gh/18702524676/CND5/image/mysql/04/05.png )
212212
213- 虽然性能得到提升,但是机器宕机,` page cache ` 里面的 binglog 会丢失。
213+ 虽然性能得到提升,但是机器宕机,` page cache ` 里面的 binlog 会丢失。
214214
215215为了安全起见,可以设置为` 1 ` ,表示每次提交事务都会执行` fsync ` ,就如同** binlog 日志刷盘流程** 一样。
216216
You can’t perform that action at this time.
0 commit comments