1. redo log(重做日志)
- 是InnoDB存储引擎的日志
- 为了记录对数据文件的物理更改,并保证总是日志先行。即在持久化数据文件前,保证之前的redo日志已经写道磁盘了。由于redo log是顺序整块写入,所以性能要更好
- 写入过程
- 当数据库对数据进行更改时,需要把数据页从磁盘读到buffer pool(一块内存区域)中,然后再更新buffer pool中的数据。此时buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据,此时InnoDB会把新记录写道redo log日志中(因为这个时顺序写入,IO性能高,比将buffer pool里面的数据同步到磁盘性能高。其实写redo log的时候也会有buffer),然后提交事务(但是磁盘数据还是没修改)。如果这个时候突然发生了非正常数据库重启,则这些数据还没有正常同步到磁盘文件中去。则可以通过redo log来重做记录。
- 本质是虽然事务提交了,但是数据此时还没来得及写入磁盘,此时如果发生故障,则可以通过redo log来进行数据重做
- 数据更新的时候就会进行redo log写入。而不是要等到要提交的时候才开始redo log写入
- 是物理日志,
2. undo log(归滚日志)
- 开始数据修改的时候,undo log会产生一条日志。
- 存储的是逻辑日志,如我们要insert一条记录,则undo log会记录一条对应的delete日志。
- 为了达到事务回滚。如果在事务未提交前机器故障,则根据undo log可以回滚数据
- MVCC就是基于undo log来实现的。
3. binlog(二进制日志)
- 不同于InnoDB引擎的redo/undo log。其主要是用来记录对MySQL数据更新或潜在发生更新的SQL语句。并以“事务”的形式保存在磁盘中
- 主要作用
- 主从复制:MySQL主从复制在Master端开启binlog,Master把它的二进制日志传递给slaves并执行达到master-slaver数据一致性的目的
- 数据恢复
- 增量备份
- 不会记录不修改数据的语句,如select与show语句
- 可以配置自动删除时间:expire_logs_days
- 在数据提交前才开始进行binlog写盘
4. errorlog(错误日志)
- 记录出现错误的日志
5. slow query log(慢查询日志)
- 记录查询比较慢的sql语句
- 几个常用的配置参数
- slow_query_log 慢查询开启状态
- slow_query_log_file 存储位置
- long_query_time 查询超过多少秒才记录
- log_queries_not_using_indexes 未使用查询语句也被记录到慢查询日志中
6. general log(一般查询日志)
- 就是一般查询的日志
7. relay log(中继日志 )
- 主从复制的时候使用
Innodb完成一次更新操作的具体步骤
- 开启事务
- 查询待更新的记录到内存,并加X锁
- 记录undo log到内存buffer
- 记录redo log到内存buffer
- 更改内存中的数据记录
- 提交事务,出发redo log刷盘
- 记录 bin log
- 事务结束