八股P2-MySQL

130 阅读3分钟

三大日志

redolo(重做日志),属物理日志:记录事务的更新内容,在MySQL重启时恢复数据库。

MySQL实例挂了/服务器宕机,重启

基本数据更新+写redolog+刷盘过程

image.png

  • 刷盘策略提供,innodb_flush_log_at_trx_commit参数,0,1,2
  • 0,事务提交时不刷盘
  • 1,事务提交时刷盘。从redo log buffer直接刷到redo文件
  • 2,事务提交时,只把redo log buffer 内容写到 page cash 中

此外,默认刷盘,后台有一个线程,每1秒,把redo log buffer 内容写到 cash page中,刷一次

image.png

总体来看:刷盘策略+默认刷盘

image.png

  • 0,可能会丢失一秒数据
  • 1,
    • 只要事务提交成功,redolog必然完整,没有数据丢失
    • 如果事务期间MySQL挂了/服务器宕机,redolog日志会丢失,但是事务没提交,没数据损失
  • 2,
    • 提交成功,写入page cash
    • 事务期间MySQL挂了无损失,服务器宕机损失1秒数据

日志文件组

硬盘上存储的 redo log 日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的。

比如可以配置为一组4个文件,每个文件的大小是 1GB,整个 redo log 日志文件组可以记录4G的内容。

它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。

image.png

在个日志文件组中还有两个重要的属性,分别是 write pos、checkpoint

  • write pos 是当前记录的位置,一边写一边后移
  • checkpoint 是当前要擦除的位置,也是往后推移

每次刷盘 redo log 记录到日志文件组中,write pos 位置就会后移更新。

每次 MySQL 加载日志文件组恢复数据时,会清空加载过的 redo log 记录,并把 checkpoint 后移更新。

write poscheckpoint 之间的还空着的部分可以用来写入新的 redo log 记录。

image.png

如果 write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log 记录,MySQL 得停下来,清空一些记录,把 checkpoint 推进一下。

image.png

2

binlog(归档日志),属逻辑日志:记录事务中的sql语句,保证MySQL集群的数据一致性

回滚日志undo log

实现回滚机制,实现MVCC机制

事务期间的修改,会先记录到undolog,然后再执行操作。

  • 期间遇到异常,利用undolog 中的信息将数据回滚到修改之前。
  • undolog先于数据持久化到磁盘上。 这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。

另外,MVCC 的实现依赖于:隐藏字段、Read View、undo log。在内部实现中,InnoDB 通过数据行的 DB_TRX_IDRead View 来判断数据的可见性,如不可见,则通过数据行的 DB_ROLL_PTR 找到 undo log 中的历史版本。每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建 Read View 之前已经提交的修改和该事务本身做的修改

# 总结

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性

MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。