Transactional write の調査: MySQL 編その2

前回は主に redo log を調査した。 InnoDB ではいわゆる redo log は MTR によって実装されていることがわかった。

今回はロールバック周りを見ていく。

redo log があれば ACID を実装することが可能なのは SQLite で調べたとおりだが、InnoDB は MVCC なので、 redo log だけだと最新のページを取得するのにコストが大きい。 そのため InnoDB はページは最新の状態に更新し、古いページを rollback segment に退避するという実装をしている。 rollback はこの rollback segment を使って実行される。

MySQL のドキュメントでは undo log が rollback segment に格納されるとあるが、 ここで言う log というのは MTR のように確実に sync されるわけではない。 つまり rollback segment はプロセスがクラッシュした際に破壊される恐れがある。

ではどのように rollback segment を保護しているのか。 InnoDBMTR の中に rollback segment への書き込み自体を記録することで再構築できるようにしている。

InnoDB ではプロセスクラッシュ時のリカバリは次のように行われる。

  1. redo log の再生

    これにより、データベースファイルのページが最新の状態に復旧される。また rollback segment が復旧される。

  2. 未 commit のトランザクションの rollback

    1 で復旧された rollback segment を使って rollback を行う。