以更新数据为例:update user set username = ‘zhangsan’ where id= ‘1’
- innodb cache: inonbb数据缓存。首先会判断上面这条语句的数据是否在在缓存中,如果不在,则从磁盘数据里面加载过来,然后加独占锁,避免其他线程在此期间更新。
- 将旧的数据刷入undo log 日志文件,方便出错后回滚数据。
- 更新新的数据到innodb cache中。这里讲username = ‘zhangsan’ 这个新的数据更新到cache中。此时,磁盘数据还是旧的。
- redo log cache 也就是redo log buffer, 将更新数据写入redo log buffer缓冲池中。
- 如果此时系统宕机,那redo log buffer中的数据也会丢失,更新是没有成功的
- 提交事务后redo log开始刷入磁盘的redo log日志文件。如果刷入了redo log文件,就算系统宕机,重启后数据也不会丢失,会从redo log重新刷新数据。
mysql> show variables like '%innodb_flush_log_at_trx_commit%';
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
+--------------------------------+-------+
1 row in set (0.01 sec)
redo log 从buffer刷入磁盘的过程中,有innodb_flush_log_at_trx_commit参数可以设置。
- innodb_flush_log_at_trx_commit = 0时, redo log始终存在于buffer中,不会刷入磁盘redo log日志文件,系统宕机后,数据会丢失。性能最好
- innodb_flush_log_at_trx_commit = 1。只要事务提交成功,必然会刷redo log到磁盘文件。数据保证不丢失,性能会相对差一点。这也是innodb 默认的刷redo log日志配置
- innodb_flush_log_at_trx_commit = 2 。redo log会先刷入系统缓存os cache中。 os cache会不定时的刷新到磁盘文件,性能比等于1时要好,但是系统宕机仍有可能丢失数据。