redo log

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

刷盘策略

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

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

innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用 fsync 对 redo log 进行刷盘

另外,InnoDB 存储引擎有一个后台线程,每隔1 秒,就会把 redo log buffer 中的内容写到文件系统缓存(page cache),然后调用 fsync 刷盘。

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

它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写

binlog

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

binlog会记录所有涉及更新数据的逻辑操作,并且是顺序写。

binlog恢复数据

  1. 找到binlog
-- 查看binlog是否开启
-- log_bin 为 on是开启
show variables like '%log_bin%';

-- 获取binlog文件列表
show binary logs;

-- 查看当前正在写入的binlog文件
show master status;
  1. 导出binlog
sudo /www/server/mysql/bin/mysqlbinlog --base64-output=DECODE-ROWS --start-datetime='2022-04-21 11:30:00' --stop-datetime='2022-04-21 11:35:00'  -v /www/server/data/mysql-bin.000001 > /base_storage/text.log
  1. 恢复数据
/www/server/mysql/bin/mysqlbinlog /www/server/data/mysql-bin.000001 --start-position 85527 --stop-position 87252 | mysql -uroot -proot

undo log

我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚,在 MySQL 中,恢复机制是通过 回滚日志(undo log) 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 回滚日志 中的信息将数据回滚到修改之前的样子即可!并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。