8.10.5 외부 잠금(External Locking)
외부 잠금은 여러 프로세스에 의한 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
과 함께 사용하는 것입니다. (이것은 많은 설정에서 위의 옵션을 결합 할 수 유용하기 때문에 기본적으로 실행되지 않습니다.)