外部ロックは、複数のプロセスによる MyISAM
データベーステーブルの競合を管理するためのファイルシステムロックの使用です。外部ロックは、MySQL サーバーなどの単一のプロセスが、テーブルへのアクセスを必要とする唯一のプロセスであると想定できない状況で使用されます。次にいくつかの例を示します。
同じデータベースディレクトリを使用する複数のサーバーを実行する場合 (推奨されません)、各サーバーで外部ロックが有効になっている必要があります。
-
myisamchk を使用して
MyISAM
テーブルに対して保守操作を実行する場合、サーバーが実行中でないことを確認するか、サーバーが必要に応じてテーブルファイルをロックし、テーブルへのアクセスを myisamchk によって調整するように、サーバーで外部ロックが有効になっていることを確認する必要があります。同じことが、MyISAM
テーブルをパックするために myisampack を使用する場合にも当てはまります。外部ロックを有効にしてサーバーを実行する場合、テーブルのチェックなどの読み取り操作のために、いつでも myisamchk を使用できます。この場合に、サーバーが myisamchk で使用しているテーブルを更新しようとする場合、サーバーは myisamchk が終了するまで待ってから、続行します。
テーブルの修復や最適化などの書き込み操作のために myisamchk を使用する場合、または myisampack を使用してテーブルをパックする場合は、mysqld サーバーがそのテーブルを使用していないことを常に確認する必要があります。mysqld を停止しない場合、myisamchk を実行する前に、少なくとも mysqladmin flush-tables を実行してください。サーバーと myisamchk が同時にテーブルにアクセスすると、テーブルが破損する可能性があります。
外部ロックが有効になっていると、テーブルへのアクセスを必要とする各プロセスは、テーブルへのアクセスに進む前にテーブルファイルに対するファイルシステムロックを獲得します。必要なすべてのロックを獲得できない場合、(現在ロックを保持しているプロセスがそれらを解放したあとに) ロックを取得できるまで、プロセスはテーブルへのアクセスをブロックされます。
サーバーは場合によってテーブルにアクセスできるまでほかのプロセスを待機する必要があるため、外部ロックはサーバーのパフォーマンスに影響します。
単一のサーバーを実行して特定のデータディレクトリにアクセスする場合 (これは通常のケースです) およびサーバーの実行中に myisamchk などのほかのプログラムでテーブルを変更する必要がない場合、外部ロックは不要です。ほかのプログラムでテーブルを読み取るだけである場合、外部ロックは不要ですが、myisamchk がテーブルを読み取っている間にサーバーがテーブルを変更すると、myisamchk が警告をレポートすることがあります。
外部ロックが無効になっていて、myisamchk を使用するには、myisamchk の実行中にサーバーを停止するか、myisamchk を実行する前にテーブルをロックし、フラッシュする必要があります。(セクション8.11.1「システム要素およびスタートアップパラメータのチューニング」を参照してください。)この要件を回避するには、CHECK TABLE
および REPAIR TABLE
ステートメントを使用して、MyISAM
テーブルをチェックし、修復します。
mysqld の場合、外部ロックは skip_external_locking
システム変数の値で制御されます。この変数が有効にされている場合、外部ロックは無効になり、その逆も同じです。MySQL 4.0 以降、外部ロックはデフォルトで無効にされます。
外部ロックの使用は、サーバーの起動時に --external-locking
または --skip-external-locking
オプションを使用して制御できます。
多数の MySQL プロセスから MyISAM
テーブルを更新できるようにするために外部ロックオプションを使用する場合、次の条件を満たしていることを確認する必要があります。
別のプロセスによって更新されるテーブルを使用するクエリーには、クエリーキャッシュを使用しないでください。
サーバーを
--delay-key-write=ALL
オプションで起動したり、共有テーブルに対してDELAY_KEY_WRITE=1
テーブルオプションを使用したりしないでください。そうでないと、インデックスが破損する可能性があります。
これらの条件をもっとも簡単に満たす方法は、常に --external-locking
を --delay-key-write=OFF
および --query-cache-size=0
と一緒に使用することです。(これは、多くのセットアップで、前述のオプションを組み合わせることが有用であるため、デフォルトで実行されません。)