美文网首页
mysql 怎样保证事务不丢

mysql 怎样保证事务不丢

作者: 放开那个BUG | 来源:发表于2021-03-28 16:37 被阅读0次

1、前言

redo log + bin log 是现在 mysql 常用的一种配置,在 innerdb 没有成为 mysql 的默认引擎之前,mysql 已经又了 binlog 这种日志格式,它在 server 层。innerdb 有自己的 redo log 支持崩溃恢复,后面成为 mysql 的引擎过后,整个事务的过程变成一种两阶段提交的方式:

    1. 先写 redo log,redo log 处于 prepare 阶段
  • 2.后写 binlog
  • 3.binlog 写入之后,提交 redo log,整个事务 commit

2、问题讨论

现在设想两种情况:
A.如果已经写了 redo log,redo log 处于 prepare 阶段,写 binlog 之前崩溃了
答:此时 binlog 还没写,redo log 也没提交,所以崩溃恢复的时候,整个事务会回滚。这时 binlog 还没写,如果是主从复制的架构,binlog 的数据也不会传递到备库里。

B.如果是已经写了 binlog,但是 redo log 还没提交
答:mysql 目前的崩溃规则如下:

  • 1.如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交
  • 2.如果 redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整
    * a.如果是,则提交事务
    * b.否则,回滚事务

追问 B:处于 prepare 阶段的 redo log 加上完整的 binlog,重启就能恢复,mysql 为什么要这样设计
答:这个问题与数据与备份的一致性有关。如果写 binlog 后 mysql 崩溃,但是因为已经写入了,binlog 会被从库消费使用(或者使用 binlog 恢复库),所以主库上也要提交这个事务,保证主从一致性。

相关文章

  • mysql 怎样保证事务不丢

    1、前言 redo log + bin log 是现在 mysql 常用的一种配置,在 innerdb 没有成为 ...

  • 浅谈我对Mysql高可用的理解

    问题1:Mysql是如何保证不丢数据的? 众所周知,事务一旦提交,则对数据的改变将永久有效,这是数据库持久性的特性...

  • MYSQL事务 SELECT会自动加锁 及乐观锁

    1,mysql事务 select会自动加锁吗? 总结:mysql事务select 只是进行了隔离,保证数据的一致性...

  • MySQL是怎么保证数据不丢的?

    只要 redo log 和 binlog 保证持久化到磁盘,就能确保 MySQL 异常重启后,数据可以恢。 bin...

  • Mysql 是怎么保证数据不丢的

    一、binlog的写入机制 binlog写入逻辑:事务执行过程中、先写日志导binlog cache、事务提交时、...

  • MySQL是怎么保证数据不丢的

    如何保证 redo log 真实地 写入了磁盘 binlog 的写入逻辑比较简单:事务执行过程中,先把日志写到 b...

  • MySQL事务和隔离

    如何理解MySQL的事务? 简单来说就是要保证一组数据库操作,要么全部成功,要么全部失败。MySQL中的事务支持是...

  • Mysql并发控制-事务

    Mysql并发控制-事务 事务的特性ACID A: atomiciy 原子性一个事务必须保证其中的操作要么全部执行...

  • 事务与隔离

    事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。MySQL...

  • 3. Mysql事务隔离

    事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在Mysql中,事务支持是引擎层实现的,Mysql支持多...

网友评论

      本文标题:mysql 怎样保证事务不丢

      本文链接:https://www.haomeiwen.com/subject/gwbphltx.html