💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
- 持续学习,不断总结,共同进步,活到老学到老
- 人生的本质是追寻自我的提升,包括思想、能力、意志等等。
- 直面变化,找到背后更基础的东西,更基础的东西是用户的需求。
- 我们的成功是我们的现在和将来决定的。今天和明天已经由昨天决定,你还可以决定后天。
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨
1.重做日志块与重做日志文件
重做日志(Redo Log)是数据库管理系统中的一种重要机制,用于保证事务的持久性和数据恢复。在 MySQL 等数据库管理系统中,重做日志通常由多个重做日志文件组成,每个文件由多个重做日志块组成。
重做日志块(Redo Log Block):
- 重做日志块是重做日志的最小单位,通常是一个固定大小的数据块。
- 它记录了数据库中发生的每个事务所进行的修改操作,如更新、插入和删除等。
- 当事务执行修改操作时,先将修改记录到重做日志块,然后再将修改应用到内存中的数据页上。
- 重做日志块是顺序写入的,因为它需要保证记录的顺序与事务的执行顺序一致。
- 一旦事务将修改记录到重做日志块并提交,数据库就可以认为该事务的修改已经持久化,并可以在必要时进行恢复。
重做日志文件(Redo Log File):
- 重做日志文件是由多个重做日志块组成的逻辑文件,用于存储重做日志的内容。
- 重做日志文件是一个循环的文件组,当写满一个重做日志文件后,数据库会切换到下一个重做日志文件,以保证循环使用。
- 在数据库运行期间,重做日志文件会不断地写入新的重做日志块,并且不会删除已经写入的内容,这是为了确保发生故障时可以进行数据恢复。
- 当数据库发生崩溃或意外停机时,重做日志文件中的内容将被用于恢复未提交的事务和未写入磁盘的数据页,以保证数据的一致性。
总结:
- 重做日志块是重做日志的最小记录单位,记录每个事务的修改操作。
- 重做日志文件是由多个重做日志块组成的逻辑文件,用于存储重做日志的内容,确保数据的持久性和一致性,以及在数据库崩溃时进行恢复。
2.重做日志的格式?
在 InnoDB 存储引擎中,对干各种不同的操作有着不同的重做日志格式。到 InnoDB1.2.x 版本为止,总共定义了 51 种重做日志类型。虽然各种重做日志的类型不同,但是它们有着基本的格式,表 3-2 显示了重做日志条目的结构:
- redo_log_type 占用 1 字节,表示重做日志的的类型
- space 表示表空间的 ID,但采用压缩的方式,因此占用的空间可能小于 4 字节
- page_no 表示页的偏移量,同样采用压缩的方式
- redo_log_body 表示每个重做日志的数据部分,恢复时需要调用相应的函数进行解析
3.重做日志刷盘机制
从重做日志缓冲往磁盘写入时,是按 512 个字节,也就是一个扇区的大小进行写入。因为扇区是写入的最小单位,因此可以保证写入必定是成功的。因此在重做日志的写入过程中不需要有 double write.
从重做日志缓冲写入磁盘上的重做日志文件是按一定条件进行的,
- 在主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件中,不论事务是否已经提交。
- 另一个触发写磁盘的过程是由参数
innodb_flush_log_at_trx_commit
控制,表示在提交(commit)操作时,处理重做日志的方式。参数 innodb_flush_log_at_trx_commit 的有效值有 0 1 2。- 0 代表当提交事务时,并不将事务的重做日志写入磁盘上的日志文件,而是等待主线程每秒的刷新。
- 1 表示在执行 commit 时将重做日志缓冲同步写到磁盘,即伴有 fsync 的调用。
- 2 表示将重做日志异步写到磁盘,即写到文件系统的缓存中。因此不能完全保证在执行 commit 时肯定会写入重做日志文件,只是有这个动作发生。
因此为了保证事务的 ACID 中的持久性,必须将 innodb_flush_log_at_trx_commit
设置为 1,也就是每当有事务提交时,就必须确保事务都已经写入重做日志文件。那么当数据库因为意外发生宕机时,可以通过重做日志文件恢复,并保证可以恢复已经提交的事务。而将重做日志文件设置为 0 或 2,都有可能发生恢复时部分事务的丢失。不同之处在于,设置为 2 时,当 MySQL 数据库发生宕机而操作系统及服务器并没有发生宕机时,由于此时未写入磁盘的事务日志保存在文件系统缓存中,当恢复时同样能保证数据不丢失。
觉得有用的话点个赞
👍🏻
呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙