MYSQL引擎层如何工作

42 阅读1分钟

MYSQL 分两大内存 BufferPool, redologBuffer 和三大日志 undolog,redolog, binlog.

undolog: 用于事务回滚,保证事务的原子性。

redolog: 保持事务的持久性,防止数据库崩溃后数据丢失。

binlog: 用于数据备份,主从复制,记录数据库的所有变故操作。

set autocommit=0;
update employee set name='xxx' where id=1; 
commit;
classDiagram
client --|> server 
server --|> BufferPool
server --|> binlog
server --|> page Cache1
page Cache1 --|> binlog
BufferPool --|> 磁盘
磁盘 --|> BufferPool
BufferPool --|> undolog
BufferPool --|> redolog Buffer
redolog Buffer --|> redolog
redolog Buffer --|> page Cache
page Cache --|> redolog
client : 客户端
class server{
执行器
}
class 磁盘{
磁盘文件(.ibd)
索引页--|> 索引页2--|>数据页
索引页--|> 索引页3--|>数据页
}
class BufferPool{
缓存页 缓存页
缓存页 缓存页
}
class undolog{
旧数据
回滚日志
}
class redolog{
新数据
重做日志 数据崩溃恢复
}
class redolog Buffer{
利用innodb_flush_log_at_trx_commmit刷盘策略
0 每隔一秒写入 (走页缓存)
1 提交时写入(实时写实时刷)直接走redolog
2 写入系统缓存(延迟写延迟刷)(走页缓存)
}
class page Cache{
由操作系统fsync函数持久化到磁盘(0/2)
}
class page Cache1{
由操作系统fsync函数持久化到磁盘(0/N)
}
class server{
三种刷盘机制,将数据刷新到binlog
0 操作系统决定 实时写延迟刷
1 提交时写入 实时写实时刷
N n次事务提交 实时写延迟刷
mysql5.7.7以前默认为0,后面默认时1,实时写实时刷


}
class binlog{
二进制日志
}

①首先去BufferPool的缓存页查看是否有id=1的数据,如果有直接更新BufferPool中的缓存页。

②去磁盘.ibd文件中去加载id=1的整页数据。将整页数据缓存到BufferPool里面,并且将id=1的数据进行修改,并且把修改之前的旧数据记录到undolog日志当中,再去更新BufferPool中的数据(标记为脏页)。这时需要将脏页的数据同步到磁盘中。

③在进行BufferPool数据更新变成脏页的同时,将新数据保存到Redolog日志当中。用于后期的mysql数据崩溃的数据恢复。

④新数据更新的时候,会将新数据放到redologBuffer当中。利用(innodb_fluash_log_at_trx_commit)刷盘策略

刷盘策略
012
每隔一秒写入提交时写入(实时写实时刷)写入系统缓存

server层也有刷数据到binlog的刷盘策略

刷盘策略
01N
操作系统决定提交时写入(实时写实时刷)n次事务提交(实时写延迟刷)