MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

8.11.5 外部ロック

外部ロックは、複数のプロセスによる MyISAM データベーステーブルの競合を管理するためのファイルシステムロックの使用です。 外部ロックは、MySQL サーバーなどの単一のプロセスが、テーブルへのアクセスを必要とする唯一のプロセスであると想定できない状況で使用されます。 次にいくつかの例を示します。

外部ロックが有効になっていると、テーブルへのアクセスを必要とする各プロセスは、テーブルへのアクセスに進む前にテーブルファイルに対するファイルシステムロックを獲得します。 必要なすべてのロックを獲得できない場合、(現在ロックを保持しているプロセスがそれらを解放したあとに) ロックを取得できるまで、プロセスはテーブルへのアクセスをブロックされます。

サーバーは場合によってテーブルにアクセスできるまでほかのプロセスを待機する必要があるため、外部ロックはサーバーのパフォーマンスに影響します。

単一のサーバーを実行して特定のデータディレクトリにアクセスする場合 (これは通常のケースです) およびサーバーの実行中に myisamchk などのほかのプログラムでテーブルを変更する必要がない場合、外部ロックは不要です。 ほかのプログラムでテーブルを読み取るだけである場合、外部ロックは不要ですが、myisamchk がテーブルを読み取っている間にサーバーがテーブルを変更すると、myisamchk が警告をレポートすることがあります。

外部ロックが無効になっていて、myisamchk を使用するには、myisamchk の実行中にサーバーを停止するか、myisamchk を実行する前にテーブルをロックし、フラッシュする必要があります。 この要件を回避するには、CHECK TABLE および REPAIR TABLE ステートメントを使用して、MyISAM テーブルをチェックし、修復します。

mysqld の場合、外部ロックは skip_external_locking システム変数の値で制御されます。 この変数が有効にされている場合、外部ロックは無効になり、その逆も同じです。 外部ロックはデフォルトで無効になっています。

外部ロックの使用は、サーバーの起動時に --external-locking または --skip-external-locking オプションを使用して制御できます。

外部ロックオプションを使用して多数の MySQL プロセスから MyISAM テーブルへの更新を有効にする場合は、delay_key_write システム変数を ALL に設定してサーバーを起動したり、共有テーブルに対して DELAY_KEY_WRITE=1 テーブルオプションを使用しないでください。 そうでないと、インデックスが破損する可能性があります。

この条件を満たす最も簡単な方法は、常に --external-locking--delay-key-write=OFF とともに使用することです。 (これは、多くのセットアップで、前述のオプションを組み合わせることが有用であるため、デフォルトで実行されません。)