MySQL日志(binlog、redo log、undo log等)


在MySQL数据库中,日志是记录数据库操作和状态变化的重要组成部分。它包括多个类型,如二进制日志、事务日志、错误日志和慢查询日志等。每种日志都有不同的作用和记录内容。

redo log(重做日志)

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。它记录了对数据库所做的更改操作,包括插入、更新和删除等,以便在数据库发生故障时进行恢复。

重做日志的主要作用是在数据库系统崩溃、断电或其他故障情况下,通过重播重做日志中的操作来恢复未提交的事务更改。它采用的是“Write Ahead Logging”(先写日志,再写数据)的策略,即在将数据写入磁盘之前,先将相应的日志记录写入重做日志文件。

当数据库发生崩溃时,MySQL通过读取重做日志文件中的记录,并按照顺序重新执行这些日志操作,将数据库恢复至崩溃前的状态。这样可以确保数据在崩溃之前的提交事务都能够完全持久化到磁盘,并保持数据库的一致性。

MySQL中的重做日志是循环写入的,即当日志文件写满时会重新覆盖最旧的日志内容。为了保证重做日志的持久性,MySQL使用了“两阶段提交”(Two-Phase Commit)协议,将重做日志的数据持久性与数据文件的写入同步,以保证数据完整性。
重做日志的大小和性能是需要注意的因素。如果重做日志文件太小,可能无法容纳大量的日志记录,从而导致无法进行持久化恢复。而过大的重做日志文件则会增加IO负担和写入延迟。因此,在配置MySQL时,需要合理设置重做日志的大小以满足实际需求。

刷盘时机

InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:

  • 0 :设置为 0 的时候,表示每次事务提交时不进行刷盘操作
  • 1 :设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)
  • 2 :设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache

binlog

redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎。 而 binlog 是逻辑日志,记录内容是语句的原始逻辑,属于MySQL Server 层。

binlog 日志有三种格式,可以通过binlog_format参数指定。

  • statement:指定statement,记录的内容是SQL语句原文。
  • row:row格式记录的内容看不到详细信息,要通过mysqlbinlog工具解析出来。
  • mixed:指定为mixed,记录的内容是前两者的混合。MySQL会判断这条SQL语句是否可能引起数据不一致,如果是,就用row格式,否则就用statement格式。

binlog的写入时机:事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

undo log

撤销日志(Undo Log)是MySQL数据库的一种日志文件,用于在事务回滚或数据库崩溃时撤销已经进行的修改操作。

与重做日志(Redo Log)记录的是修改数据库的操作,撤销日志记录的是用于回滚事务的信息。当事务需要回滚时,MySQL使用撤销日志来还原被修改的数据到事务开始时的状态,以实现事务的原子性。

撤销日志的主要作用是:

  1. 事务回滚:如果事务发生错误或被显式回滚,MySQL可以使用撤销日志来撤消/还原已经执行的修改操作,以将数据恢复到事务开始之前的状态。
  2. 并发控制:撤销日志还用于支持并发控制机制,如多版本并发控制(MVCC)。通过撤销日志的记录,可以获得先前版本的数据,使不同的事务以读一致的方式访问数据库。

撤销日志的实现方式是将回滚信息记录在日志文件中。对于已经提交的事务,在数据库的正常操作中,撤销日志会逐渐清理并释放空间。在数据库崩溃或异常关闭时,MySQL会利用撤销日志来自动恢复未提交的事务并撤销已经提交但未持久化到磁盘的事务。

猜你喜欢

转载自blog.csdn.net/weixin_43598687/article/details/131444361