MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
946 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 31 讲/共 41 讲
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

29|数据都在内存里修改,服务器或数据库宕机会丢数据吗?

你好,我是俊达。
InnoDB 使用 REDO 和 UNDO 来实现事物的 ACID 属性,保障数据不丢。事务修改缓存页里的数据时,会生成 UNDO 和 REDO 日志,事务提交时,虽然缓存页没有实时刷新,但是会确保 REDO 日志已经完成持久化。
下面是 REDO 和 UNDO 机制的一个简单的示意图。
缓存页被修改后,最新的数据为版本 3,文件中保存的还是版本 1 的数据。如果此时数据库崩溃了,下次启动时,应用 REDO 日志,可以将文件中版本 1 的数据重新更新到版本 3。如果数据库崩溃时事务还没有提交,会应用 UNDO 日志,将数据回滚到已经提交的版本。
这一讲中,我们先通过几个具体的例子,来了解基本的 DML 操作是怎么修改数据页的,然后再来分析这些操作,在 REDO 日志中是怎么记录的。

页面内的变更

表刚刚创建时,表中还没有数据,B+ 树只有空的根页面。随着不断往表中插入数据、更新数据,一个页面的空间无法容纳新的数据,需要对页面进行分裂,往 B+ 树中添加新的页面。

插入记录(insert)

执行 Insert 语句插入记录时,需根据新记录的主键值,在聚簇索引上定位这行记录的位置,定位完成后,游标(cursor)会指向待插入数据的上一行记录。我们先考虑最简单的情况,当前页面有足够的空闲空间来容纳新的记录。在第 25 讲中,我们已经知道,页面内的空闲空间主要由两部分组成。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. InnoDB使用REDO和UNDO来实现事物的ACID属性,保障数据不丢。 2. 数据库崩溃时,应用REDO日志可以将文件中的数据重新更新到最新版本,而应用UNDO日志可以将数据回滚到已提交的版本。 3. REDO记录描述了对物理页面的数据修改操作,包括MLOG_nBYTE和MLOG_WRITE_STRING等类型的记录格式。 4. REDO是通过事务执行过程中生成REDO日志和UNDO日志来保护数据不丢的。 5. 在事务提交时,REDO日志会被刷新到磁盘中,即使数据库崩溃,通过解析redo文件,可以重新执行redo日志,将数据页更新到最新的版本。 6. 如果在事务提交前数据库崩溃了,数据库启动时,会应用redo日志后,扫描Undo表空间,发现有事务还没有提交,就开始回滚事务,undo日志中记录了回滚事务需要的信息,回滚完成后,数据也不会有问题。 7. REDO记录按MTR分组,一个MTR中的REDO日志要么全部应用,要么全部丢弃。 8. InnoDB维护了日志系统的各个LSN号,通过这些LSN号来协调日志系统的线程。 9. REDO日志文件持久化到REDO文件中后,才真正保证了数据不丢。8.0.30版本开始,废弃了参数innodb_log_file_size和innodb_log_files_in_group,而改用参数innodb_redo_log_capacity。 10. 崩溃恢复(Crash recovery)是MySQL启动时的一个重要步骤,包括读取redo文件中的checkpoint记录、解析redo文件中的日志、执行redo和undo等步骤。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • binzhang
    看到日志类型有mlog_undo_***, 写undo page的时候也会产生redo的吧?

    作者回复: 是的,写undo page也会产生redo。 因为Undo page也是缓存到buffer pool中的,事务提交时,undo page也不会实时刷新,需要记录redo日志才能保证Undo的数据不丢。

    2024-10-28归属地:美国
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部