30周年をひかえての回顧録ですが、もう少し MySQL 3.2x について語ります。
この記事のアイデアは、Daniël van Eeden から提案されたものです。
初期の頃、つまりMySQL 3.20で、MySQLはISAMストレージフォーマットを使用していたことをご存知でしょうか?IBM は 1960 年代に、情報管理システム(IMS)の一部としてインデックス順次アクセス方式を採用しました。IMS データベース管理システムは、最初に広く使用された階層型データベースの 1 つとなり、ISAM はそのアーキテクチャの重要な部分でした。
MyISAMがISAMに代わってデフォルトのストレージエンジンとなったのは2001年のMySQL 3.23からで、インデックスの改善など機能が強化されました。
さらに、バイナリログより前に、データをリカバリし、非常に基本的なポイントインタイムリカバリを実行するために使用できる方法があったことをご存知でしょうかか。そして面白いことに、この機能は MySQL 9 でもまだ利用可能なのです!
ISAMLOG
mysqld を --log-isam オプション付きで起動すると、MyISAM のすべての変更をファイルに記録することができます。 このオプションは MySQL Study Guide でも触れられていません。
以下は MySQL 3.20 での例です:


上の図の通り、これらのファイルで使用できるコマンドラインユーティリティがあります: isamlog は後に myisamlog と改名され、最新のMySQLリリースにもまだ存在しています:


ISAMLOGは、ISAMテーブルに加えられたすべての変更をログに記録するメカニズムとして導入され、管理者が失われたデータを回復したり、問題をデバッグしたりできるようにしました。90年代後半、これはデータ破損、偶発的なデータ削除、システムクラッシュなどの課題に対する実用的な解決策となりました。
ISAMLOGの中核機能は、ISAMテーブルへのすべての変更をキャプチャすることであり、挿入、更新、削除などの操作を専用のログファイルに順次記録します。このログファイルを再生することで、特定の時点までのテーブルの状態を再構築し、データのリカバリやデバッグに役立てることができます。
MySQL 3.23 ではMyISAMLOG が導入され、MyISAMLOG は前身の機能の多くを受け継いだものの、手動リカバリプロセスを保持しており、データベースシステムがより複雑になるにつれ、時代遅れに感じられるようになりました。バイナリログの登場は、MyISAMLOGの終焉が始まったことを予感させ、ユーザーはより堅牢で効率的なロギングシステムを求めるようになっていました。
MyISAMLOGの本当の終焉は、 mysqlbinlog が導入された2001年に訪れました。
ちょっとしたお楽しみと郷愁を味わうために、MySQL 9.1でテストしてみましょう…
まず log-isam オプションを使ってMySQLを起動します:


レコードを持つMyISAMテーブルができたので、それを空にしてみます:

mysiam.log ファイルが作成され、その中にいくつかのコンテンツがあることがわかります:

このファイルからデータを復元できるか見てみましょう。まずテーブルを削除して再作成します:

次に myisamlog ファイルを使用します:

データが復元されたことがわかります :

ISAMLOG は MySQL の現在のツールキットには含まれていませんが、その遺産はデータベースの進化における重要なマイルストーンとして存在しています。ISAMLOG のようなツールを振り返ることで、MySQL が今日のような強力な存在になるために貢献できた挑戦と成果に対する理解が深まります。
そして、MyISAM はもう使用せず、 InnoDB を使用することをお勧めします。
MyISAM を利用すべきではない理由
- 限られた同時実行性: MyISAMシステムは通常テーブルレベルのロックとなるため、同時実行性が低下し、マルチユーザ環境ではボトルネックになる可能性がある。
- トランザクション非対応: MyISAMはトランザクション処理に対応していないため、変更をロールバックしたり、アトミックにコミットすることができない。
- データの整合性: MyISAMには外部キー制約や自動参照整合性のような機能がないため、データ間の複雑な関係を制御することが難しい。
- クラッシュリカバリ非対応: MyISAMにはクラッシュリカバリのメカニズムが組み込まれていないため、システムがクラッシュした場合、データの破損が発生する可能性があり、手動での修復が必要となる。
- 高度な機能の欠如: MyISAMは、行レベルのロック、インデックスの最適化などの高度な機能を提供しておらず、MySQLの取り組みはInnoDBにフォーカスしている。

