mysql数据库Redo、Undo、Binlog

Undo日志

undo日志记录的是数据库的历史数据,保证事务的原子性

怎么保证原子性

当有A、B两个事务同时访问数据库时,当A事务发出修改操作但未Commit时,会首先将修改数据存入undo日志中,B事务发出的查询操作读取的还是原来的数据。如果A事务Commit前发生异常,那么mysql就利用undo日志将数据回滚到修改之前的样子。

binlog日志

binlog记录了语句的原始逻辑,只要表数据发生了修改,就会将修改的对应逻辑记录在binlog日志比如"令id=1的某字段值+1“等操作。

binlog日志主要的用途是同步数据,保持数据的一致性,比如主备,主从,数据备份等。

Redo 日志 (InnoDb引擎专有)

Redo日志主要用于数据库恢复数据使用,当Mysql挂了或者宕机了,可以用Redo日志恢复数据。说白了就是一种持久化的手段因为为了减少磁盘IO,Mysql不会直接在磁盘中更新数据,而是现在内存的Buffer Pool进行更新,在未来的某个时间点再将缓存更新到磁盘中,但如果还没更新就出现了宕机或者节点挂了,那在内存中的数据就这样没了。

Mysql为了防止这种情况的发生,引入了Redo日志,对内存的缓冲池进行修改操作,都会记录的Redo日志中。所以当发生故障时,就可以利用Redo日志恢复没有更新到磁盘的数据。

当然Redo日志也是保存在磁盘中的,所以也是为了效率,速度快,也有一个Redolog Buffer在内存中。

InnoDB后台有个线程,每隔一秒就会将Redolog Buffer写进 文件缓存系统,然后刷进Redo日志中(简称刷盘)。同时还有个innodb_flush_log_at_trx_commit 参数可供设置,表示事务在提交时进不进行刷盘操作。

binlog日志存储的是逻辑日志,也就是sql语句(当然这和设置有关系,可以先这么理解)Redo日志记录的是物理日志,也就是它所记录的是哪个数据页的哪个数据行的哪个字段发生了什么更改,更改后的值是什么等。

posted @ 2022-05-05 22:16  DawnHouse  阅读(118)  评论(0)    收藏  举报