那么如何解决这个问题呢, InnoDB 采用了 redo log 机制来解决:
redo log 是 Innodb 存储引擎的特性, 即在更新数据时, 先将更新操作的结果放到 redo log 中, 他存储的是物理日志...你可能会问, 写到 redo log 不也是写入到磁盘吗, 这效率会更好吗, 是不是多此一举啊. 其实不是的, 首先每次写入 redo log 的数据是非常小的, 他只记录了这次修改的物理操作....(存储引擎层 InnoDB)
写 binlog (MySQL 服务层)
提交事务, redo log 状态改为 commit 状态....(存储引擎层 InnoDB)
当系统出现异常宕机时:
binlog 有记录,redo log 状态 commit: 正常完成的事务,不需要恢复
binlog 有记录,redo log 状态 prepare...binlog 无记录,redo log 无记录: 在 redo log 写之前 crash, 恢复操作:回滚事务
相关配置
innodb_flush_log_at_trx_commit 参数设置为 1,