mysql || carsh-safe

本文探讨了MySQL如何在崩溃或重启时确保数据安全,介绍了两阶段提交过程,包括将更新操作存储在内存、undolog和redolog中,以及binlog的使用。在可能出现的数据丢失场景中,MySQL通过检查redolog和binlog来决定是否回滚或提交事务。此外,还讨论了组提交策略,以保持commit和binlog的一致性,减少性能损耗。然而,该机制可能导致主从数据不一致和锁资源竞争问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

carsh-safe保证mysql在重启或者宕机提交的数据不会丢失,未提交的数据不会回滚。

实现原理:

1、查询sql数据,如果不在内存则加载到内存,在内存中执行更新操作,2、把旧数据放入undo log日志中,3、将数据页的更新记录到redo log buffer中状态为perpare,4、然后更新逻辑操作到biglog cache中,5、最后在将redo log设置成commit状态,6、返回成功。

缺点:多个事务执行的时候binlog commit顺序不一致容易导致主从不一致。早期mysql采用prepare_commit_mutex锁来保证多事务提交顺序,一个事务获取到锁,状态才可以为prepare,一直到commit,锁资源才会释放。下个事务才可以获取到锁,来进行prepare操作。缺点 竞争锁资源,消耗性能,每次二阶段提交需要和磁盘异步交互2次,一次redo log 第二次binlog.

为什么不会丢失?

1、写入内存完,还没有写入redo log 发生宕机,此时这个事务还没有提交。所以崩溃和事务没有关系。

2、写入redo log或redo log写入完成之后宕机,重启后先检查redo log是否完整,binlog是否完整,不完整会回滚。

3、写入binlog中或写完之后丢失,重启后先检查redo log是否完整,binlog是否完整,不完整会回滚,完整则会进行commit操作。

4、commit redo log时崩溃数据还没有返回之前,重启后先检查redo log是否完整,binlog是否完整,完整则返回数据。

组提交:

保证commit和binlog落盘顺序一致,事务分组将刷盘交给另一个事务操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值