外部ロックでは、複数のプロセスによるデータベーステーブルの競合を管理するために、ファイルシステムロックが使用されます。外部ロックは、テーブルへのアクセスを必要とするプロセス (MySQL サーバーなど) が 1 つだけ存在すると仮定できない場合に使用されます。次に例を示します。
同じデータベースディレクトリを使用する複数のサーバーを実行する場合 (これは推奨されない)、各サーバーで外部ロックが有効になっている必要があります。
myisamchk を使用して
MyISAM
テーブルに対して保守処理を実行する場合、サーバーが実行されていないことを確認するか、サーバーで外部ロックが有効になっていることを確認する必要があります。外部ロックが有効になっていると、サーバーは必要に応じてテーブルファイルをロックし、テーブルへのアクセスを
myisamchk
と調整できます。これは、myisampack
を使用して MyISAM
テーブルを圧縮する場合にも当てはまります。
外部ロックを有効にしてサーバーを実行する場合は、いつでも myisamchk を使用してテーブルの確認などの読み取り操作を実行できます。この場合、サーバーが myisamchk で使用しているテーブルを更新しようとすると、サーバーが myisamchk を優先して、待機します。
テーブルの修復や最適化などの書き込み操作に myisamchk を使用する場合、または myisampack を使用してテーブルを圧縮する場合は、mysqld サーバーがそのテーブルを使用していないことを常に確認してください。mysqld を停止できない場合は最低限として、myisamchk を実行する前に mysqladmin flush-tables を実行してください。サーバーと myisamchk が同時にテーブルにアクセスすると、破損の原因になります。
外部ロックが有効になっていると、テーブルへのアクセスを必要とする各プロセスは、テーブルにアクセスする前にテーブルファイルに対するファイルシステムロックを取得します。必要なロックをすべて取得できない場合、(現在ロックを保持しているプロセスがロックを解放したあとで) ロックを取得できるまで、プロセスはテーブルへのアクセスをブロックされます。
外部ロックを使用すると、場合によりサーバーはほかのプロセスを待機してからテーブルにアクセスする必要があるため、サーバーのパフォーマンスに影響します。
単一のサーバーを実行して特定のデータディレクトリにアクセスする場合で (これが通常のケース)、サーバーの実行中に myisamchk などのほかのプログラムでテーブルを変更する必要がないときは、外部ロックは不要です。ほかのプログラムでテーブルの「読み取り」だけを行う場合、外部ロックは不要です。ただし、myisamchk がテーブルを読み取っているときにサーバーがテーブルを変更すると、myisamchk が警告を報告する場合があります。
外部ロックが無効になっている場合、myisamchk
を使用するには、myisamchk
の実行中はサーバーを停止するか、myisamchk
を起動する前にテーブルのロックとフラッシュを行う必要があります。詳細は、項4.5.2. 「システム、コンパイル時間およびスタートアップパラメータのチューニング」
を参照してください。これを不要にするには、CHECK
TABLE
および
REPAIR TABLE
ステートメントを確認に使用して、MyISAM
テーブルを修正する。
mysqld
の場合、外部ロックは
skip_external_locking
システム変数の値で制御されます。この変数が有効になっている場合、外部ロックは無効になり、逆に変数が無効の場合は、外部ロックが有効になります。MySQL
4.0
以降、外部ロックはデフォルトで無効になります。MySQL
4.0 より前では、Linux で使用する場合、あるいは
MySQL が MIT-pthread
を使用するように設定されている場合、外部ロックはデフォルトで有効になります。
外部ロックの使用は、サーバーの起動時に
--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
と併用することです。(様々なステップにおいて、前述オプションを組み合わせることが有用であることから、デフォルトでは設定をしていない。)