请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于redo log 和 刷盘问题

老师您好, 结合6.3 和 6.11 的一个问题, 对redolog如何保证可靠性的一个疑问.
图片描述

  1. redolog 从操作系统理解, 它是个文件, 也会有一部分数据在操作系统以页缓存的形式存在, 那么redolog 是写内存 -> 写binlog ->提交事务 (此时redolog的新内容还在内存里)-> 然后给客户端响应事务提交成功吗 ? 最后根据图中策略进行异步刷盘.
  2. 如果 1 是, 那么写内存之后就给客户端返回了事务提交成功, 此时mysql服务进程突然死了, redolog 在页缓存的那一部分, 也就是给客户端返回事务提交成功到异步刷盘之前的时间窗口内, redolog在内存中的内容就丢了, 但mysql又是持久性可靠的, 它是如何保证的呢, redolog都没持久化, 也没办法重做啊 ?
  3. 如果1 不是, 是刷盘之后才给客户端响应事务提交成功吗, 这样是不是性能就很差了, 因为每次客户端知道事务提交成功都意味着服务端都要操作磁盘IO

最核心的疑问就是: 像mysql这种持久化的存储技术, 面对可靠性和性能之间, 如何既保证可靠性又有相当的性能的, 因为即便是顺序写的预写日志, 也会在内存中有缓存, 对刷盘和给客户端响应成功这个过程不理解 .

正在回答 回答被采纳积分+3

1回答

Moody 2023-07-05 14:45:53
  1. 是的

  2. 确实像你说的会丢数据的,MySQL的持久性也不是完全绝对的,像你说的这种情况,会丢失没有刷盘的部分的。

总的来说还是要在持久性和性能之间找个平衡,不存在可以兼得的情况。至于数据会丢失的部分,一般只能通过业务上去人工处理了

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_高处不胜寒_0 #1
    好的, 谢谢老师, 对这个点一直是个疑问, 这个问题是所有持久化的存储技术都有的,  这次算是理解了.
    回复 有任何疑惑可以回复我~ 2023-07-05 21:40:07
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信