外部ロックは、複数のプロセスによる MyISAM
データベーステーブルの競合を管理するためのファイルシステムロックの使用です。 外部ロックは、MySQL サーバーなどの単一のプロセスが、テーブルへのアクセスを必要とする唯一のプロセスであると想定できない状況で使用されます。 次にいくつかの例を示します。
同じデータベースディレクトリを使用する複数のサーバーを実行する場合 (推奨されません)、各サーバーで外部ロックが有効になっている必要があります。
-
myisamchk を使用して
MyISAM
テーブルに対して保守操作を実行する場合、サーバーが実行中でないことを確認するか、サーバーが必要に応じてテーブルファイルをロックし、テーブルへのアクセスを myisamchk によって調整するように、サーバーで外部ロックが有効になっていることを確認する必要があります。 同じことが、MyISAM
テーブルをパックするために myisampack を使用する場合にも当てはまります。外部ロックを有効にしてサーバーを実行する場合、テーブルのチェックなどの読み取り操作のために、いつでも myisamchk を使用できます。 この場合、myisamchk が使用しているテーブルをサーバーが更新しようとすると、サーバーは myisamchk が終了するまで待機してから続行します。
テーブルの修復や最適化などの書き込み操作のために myisamchk を使用する場合、または myisampack を使用してテーブルをパックする場合は、mysqld サーバーがそのテーブルを使用していないことを常に確認する必要があります。 mysqld を停止しない場合は、少なくとも mysqladmin flush-tables を実行してから myisamchk を実行します。 サーバーと myisamchk が同時にテーブルにアクセスすると、テーブルが破損する可能性があります。
外部ロックが有効になっていると、テーブルへのアクセスを必要とする各プロセスは、テーブルへのアクセスに進む前にテーブルファイルに対するファイルシステムロックを獲得します。 必要なすべてのロックを獲得できない場合、(現在ロックを保持しているプロセスがそれらを解放したあとに) ロックを取得できるまで、プロセスはテーブルへのアクセスをブロックされます。
サーバーは場合によってテーブルにアクセスできるまでほかのプロセスを待機する必要があるため、外部ロックはサーバーのパフォーマンスに影響します。
単一のサーバーを実行して特定のデータディレクトリにアクセスする場合 (これは通常のケースです) およびサーバーの実行中に 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
とともに使用することです。 (これは、多くのセットアップで、前述のオプションを組み合わせることが有用であるため、デフォルトで実行されません。)