7

私は、DBMS (MySQL) で「トランザクション ジャーナリング」を使用する必要があるプロジェクトに取り組んでいます。別の要件のためにトランザクションを使用するために、すでに InnoDB の使用に切り替えています。トランザクションジャーナリングとは何かを理解しようとしています。MySQLのドキュメントを読むなど、1日以上検索しています。適切なキーワードを探していないだけかもしれませんが、よくわかりません。あるいは、「トランザクション ジャーナリング」は不適切な用語かもしれません。

私の理解では、データベース トランザクションのジャーナリングは、ファイル システムにコミットされる前にジャーナルに変更が加えられるという点で、ジャーナリング ファイル システムに似ています。私が読んだところによると、InnoDB エンジンはトランザクションがディスクにコミットされる前に何らかのジャーナルに保存されているようです。これは正確に聞こえますか?もしそうなら、取引ジャーナルはどこにありますか? ib_logfile0 と ib_logfile1 ですか?

4

1 に答える 1

10

あなたはここで間違いなく正しい軌道に乗っています。

InnoDB がコミットする必要があるトランザクションを実行するときは常に、2 フェーズ コミットとして実行されます。トランザクションは最初にこれらのログに書き込まれます。そして、そこからコミットされます。

これは、MySQL のクラッシュまたはサーバーのクラッシュが発生した場合に非常に役立ちます。

mysql を再起動すると、ib_logfile0 および ib_logfile1 内のすべてのコミットされていないエントリが、InnoDB のクラッシュ リカバリの一部として再生され、InnoDB が調和のとれた状態になります (これは、ACID コンプライアンスの一貫性と耐久性の部分です) 。

ib_logfile0 と ib_logfile1 を削除して mysql を開始すると、それらのファイルに含まれていたコミットされていないトランザクションはすべて失われます。クラッシュ リカバリ サイクル中にログ ファイルが見つからない場合は、 innodb_log_file_size設定に基づいて再生成されます。

InnoDB の詳細な説明については、MySQL のドキュメントを参照してください。

@karatedog InnoDB の MVCC 部分は、ibdata1 としてよく知られているシステム テーブルスペース内で発生します。トランザクションの開始前に表示されるデータはすべて記録され、必要な行にアクセスする他のユーザーが、更新が行われる前のデータを表示できるようにします。これにより、REPEATABLE-READ と呼ばれるものが可能になります。これは、ACID 準拠の I、Isolation に該当します。トランザクションの分離が良い、悪い、または醜いさまざまなシナリオに関して、DBA StackExchange にこれに関する投稿を書きました。

MyISAM に関しては、クラッシュ リカバリは自動ではありません。かなり簡単にクラッシュします。そのため、SQL コマンドREPAIR TABLEが存在します。これが、オンラインでない MyISAM テーブルに対して実行するオプションがMySQL ユーティリティmyisamchkにある理由でもあります。-rREPAIR TABLE

MariaDB と Ariaは、MyISAM の代わりとしてクラッシュセーフなストレージ エンジンを作ろうとしてきました。

于 2012-03-30T21:28:31.550 に答える