这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战
前言:mysql在我们目前开发中是非常常用的,对于mysql中他的日志信息往往侧重点是重于数据的,以下我们来列举一下mysql中含有的日志文件。
日志文件分类:
-
重做日志(redo log)
-
二进制日志(binlog)
-
回滚日志(undo log)
-
错误日志(errorlog)
-
慢查询日志(slow query log)
-
一般查询日志(general log)
-
中继日志(relay log)
一般情况下重做日志(redo log)、二进制日志(binlog)、回滚日志(undo log)最为常用。
重做日志(redo log)
redo log是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。redo日志记录事务执行后的状态,用来恢复未写入data.file的已成功事务更新的数据。防止在发生故障后尚有脏页未写入磁盘,在重启mysql服务后,它会根据redo log进行重做,从而确保数据的持久性与完整性。
InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:
- 0 :设置为 0 的时候,表示每次事务提交时不进行刷盘操作
- 1 :设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)
- 2 :设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache
刷盘:将消息写入到磁盘中。
InnoDB数据页:则和我们的tcp、udp的请求头差不多,此处我们不做过多的了解。
innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用fsync对redo log进行刷盘
InnoDB存储引擎会把redo log buffer中的内容写到文件系统缓存(page cache),然后调用fsync刷盘,
每隔1s执行一次。
当innodb_flush_log_at_trx_commit=0的时候,因为提交时不主动进行刷盘操作,那么在服务挂掉,宕机等异常情况下可能会有1s的数据丢失。
当innodb_flush_log_at_trx_commit=1的时候,因为每次事务提交时都将进行刷盘操作,那么在服务挂掉,宕机等异常情况一般是不会存在数据丢失的,此操作具有原子性。
当innodb_flush_log_at_trx_commit=2的时候,因为每次事务提交时都只把 redo log buffer 内容写入 page cache,那么在服务挂掉,宕机等异常情况下可能会有1s的数据丢失,因为此处并未涉及到原子性操作,而是吧操作信息记录到一个缓存信息中。