Mysql中如何通过日志实现事务提交和回滚

  • 如何保证事务 在日志中实现的

    • mysql通过redolog、binlog和undolog保证了sql的事务性,也可以用于数据库的数据恢复,

  • MySQL中是如何实现事务提交和回滚的?

    • 为了保证数据的持久性,数据库在执行SQL操作数据之前会先记录redo log和undo log

    • redo log是重做日志,通常是物理日志,记录的是物理数据页的修改,它用来恢复提交后的物理数据页

    • undo log是回滚日志,用来回滚行记录到某个版本,undo log一般是逻辑日志,根据行的数据变化进行记录

    • redo/undo log都是写先写到日志缓冲区,再通过缓冲区写到磁盘日志文件中进行持久化保存

    • undo日志还有一个用途就是用来控制数据的多版本(MVCC)

  • bin log

    • binlog是存在于server层的日志,也就是无论使用哪种存储引擎,都能使用binlog记录执行语句

    • binlog分多个日志文件记录,单个文件的大小通过max_binlog_size设置,采用追加的方式写入,当binlog 大小超过max_binlog_size设置的大小会创建新的日志文件,然后切换到新文件继续写入。此外,可通过expire_logs_days设置binlog日志保留的天数。

    • binlog记录操作的方法是逻辑性的语句。有statement和row两种记录格式, statement格式记 sql 语句;row 格式会记录更新前和更新后行的内容.

  • redo log

    • redo log是用来恢复数据的,用于保障已提交事务的持久性

    • redo log是重做日志,通常是物理日志,记录的是物理数据页的修改,它用来恢复提交后的物理数据页

    • redolog是innodb存储引擎特有的。

    • redolog 的大小是固定的,在 mysql 中可以通过修改配置参数 innodb_log_files_in_groupinnodb_log_file_size 配置日志文件数量和每个日志文件大小,采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。

    • 而redolog记录的是数据库中每个页的修改。比如“在某个数据页上做了什么修改”

  • undo log

    • undo log是用来回滚事务的,用于保障未提交事务的原子性

    • undo log是回滚日志,用来回滚行记录到某个版本,undo log一般是逻辑日志,根据行的数据变化进行记录

      undo log跟redo log一样也是在SQL操作数据之前记录的,也就是SQL操作先记录日志,再进行操作数据

    • 进行更新操作时,都会产生undo日志:当 delete 一条记录时,会记录一条对应的 insert 日志。当 update 一条记录时,会记录一条对应相反的 update 日志.当insert一条记录时,会记录一条delete日志。

      需要回滚事务时,只需要执行对应的undo操作,就可以将数据恢复。此外,通过undo日志,可以保证事务的隔离性。假设隔离级别设为读提交,当未提交的事务A修改了id=1对应的行数据,此时事务B想要读取id=1的数据,可以先拿着最新版本的数据,顺着undo日志找到满足其可见性的记录。

      undo日志与普通的数据页一样,对于undo页的修改,需要先写redo日志。也可能会由于lru的规则被淘汰出内存,之后再从磁盘中读取。

  •  undo日志什么时候会删除?

      -  undo按操作类型可分为update/delete/insert, insert操作在事务提交前只对当前事务可见,产生的 Undo 日志可以在事务提交后直接删除。而update/delete操作,其他事务可能需要老版本数据,需要保留到undo操作对应的事务id比数据库当前所有的事务快照都小(此时数据库所有事务对此次改动均可见),才可以删除。

上一篇:xtra+binlog增量备份脚本


下一篇:Mysql数据库主从配置