事务日志在书中只有一小节的内容,但是感觉对于理解MySQL的许多机制比较重要,所以记录一下。
为了提高事务中更新操作的效率,MySQL中的大多数存储引擎都实现了事务日志。
使用事务日志,当有更新操作时,存储引擎只将数据在内存中的copy修改成更新后的值,但并不将数据的更新刷新的硬盘,只是将更新操作的行为记录到硬盘上的事务日志中。因为事务日志的记录是采用文件追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头。并且仅仅记录数据更新行为的数据量也非常小,所以事务日志的记录是非常快的。
事务日志持久以后,对用户而言,数据的更新操作就完成了。内存中被修改的数据在后台可以慢慢的刷新到真正的硬盘数据库文件中。这样数据最终就被完整的存储好了。通过事务日志的方式更新数据,需要写两次磁盘,第一次是将更新行为记录到事务日志,第二次是真正的将更新后的数据记录到数据库文件中。
如果数据的修改行为已经记录到事务日志,但数据本身还没有写到数据库文件中,此时系统崩溃,存储引擎在重启之后会自动根据事务日志恢复这部分修改的数据。