随着学习和工作的深入,渐渐了解到mysql有三个日志,以前只是接触过binlog (在主从同步的时候用)随后就去了解下了具体有哪三个日志和三个日志的具体作用
一 binlog
binlog 是记录mysql一条条sql执行记录(增删改)可以说是执行日志了 会不停的往后面追加的,类似redis里的aof,是以二进制存在,
主要用在主从库同步和误删数据恢复(少量恢复)
刷盘时间 (sync_binlog参数控制)
MySQL 5.7.7
之前版本的默认值)commit
的时候都要将binlog
写入磁盘;(MySQL 5.7.7
之后版本的默认值)binlog
写入磁盘。 刷盘策略我在这就不介绍了
二 redolog
redolog 是记录数据修改后的值,是innodb引擎独有的,类似redis的rdb 存储的是mysql的物理数据
主要用在崩溃恢复、断电恢复,因为redolog是顺序存储的,切是一页页的 有固定大小的 所以恢复起来会比较快
刷盘时间 (innodb_flush_log_at_trx_commit 参数控制)
如果 redo log Buffer 刷入磁盘后,数据库服务器宕机了,在下次重启的时候 MySQL 也会将 redo 日志文件内容恢复到 Buffer Pool 中,因为 redo log buffer 中的数据已经被写入到磁盘了,已经被持久化了
三 redo日志与bin日志的区别
redo log是 InnoDB 存储引擎特有的日志文件,而bin log属于是 MySQL 级别的日志
redo log记录的东西是偏向于物理性质的,如:“对什么数据,做了什么修改”。
bin log是偏向于逻辑性质的,类似于:“对 students 表中的 id 为 1 的记录做了更新操作” 两者的主要特点总结如下:
性质 | redo Log | bin Log |
文件大小 | redo log 的大小是固定的(配置中也可以设置,一般默认的就足够了) | bin log 可通过配置参数max_bin log_size设置每个bin log文件的大小(但是一般不建议修改)。 |
实现方式 | redo log是InnoDB引擎层实现的(也就是说是 Innodb 存储引起过独有的) | bin log是 MySQL 层实现的,所有引擎都可以使用 bin log日志 |
记录方式 | redo log 采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。 | bin log 通过追加的方式记录,当文件大小大于给定值后,后续的日志会记录到新的文件上 |
使用场景 | redo log适用于崩溃恢复(crash-safe)(这一点其实非常类似与 Redis 的持久化特征) | bin log 适用于主从复制和数据恢复 |
四 undolog
undolog主要是记录数据被修改前的样子,用户事务回滚使用
刷盘时间
在mysql将要更新的数据加载到缓冲区Buffer pool 时,同时往 undo 日志文件中插入一条日志,也就是将 id=1 的这条记录的原来的值记录下来。
更新过程
准备更新一条 SQL 语句
MySQL(innodb)会先去缓冲池(BufferPool)中去查找这条数据,没找到就会去磁盘中查找,如果查找到就会将这条数据加载到缓冲池(BufferPool)中
在加载到 Buffer Pool 的同时,会将这条数据的原始记录保存到 undo 日志文件中
更复杂的还有mvcc过程会新开一篇来讲
mysql执行图解