>  기사  >  백엔드 개발  >  MySQL 데이터베이스 테이블을 잠그는 방법

MySQL 데이터베이스 테이블을 잠그는 방법

巴扎黑
巴扎黑원래의
2016-11-30 10:01:251618검색

테이블 확인/복구 프로그램을 동시에 실행하는 경우 MySQL 서버와 유틸리티가 동시에 테이블에 액세스하는 것을 원하지 않을 것입니다. 두 프로그램 모두 테이블에 데이터를 쓰면 당연히 많은 문제가 발생하고 예상치 못한 상황도 발생할 수 있습니다. 한 프로그램에서 테이블을 쓰는 경우 동시에 다른 프로그램을 읽으면 혼란스러운 결과가 발생할 수 있습니다. 이 문서에서는 주로 MySQL 데이터베이스 테이블을 잠그는 방법을 설명합니다.

테이블 잠금 방법

클라이언트 요청이 서로 간섭하지 않도록 하거나 서버와 유지 관리 프로그램이 서로 간섭하지 않도록 하는 방법에는 여러 가지가 있습니다. 데이터베이스를 닫으면 서버와 myisamchk 및 isamchk 사이에 상호 작용이 없음을 확인할 수 있습니다. 하지만 서버를 중지하는 것은 좋은 생각이 아닙니다. 그렇게 하면 결함이 없는 데이터베이스와 테이블을 사용할 수 없게 되기 때문입니다. 이 섹션에서 논의되는 주요 프로세스는 서버와 myisamchk 또는 isamchk 간의 상호 작용을 피하는 것입니다. 이 기능을 달성하는 방법은 테이블을 잠그는 것입니다.

서버에는 두 가지 테이블 잠금 방법이 있습니다.

1. 내부 잠금

내부 잠금은 클라이언트 요청이 서로 간섭하는 것을 방지할 수 있습니다. 예를 들어 클라이언트의 SELECT를 방지합니다. 쿼리가 다른 클라이언트의 UPDATE 쿼리로 인해 방해를 받았습니다. myisamchk 또는 isamchk를 사용하여 테이블을 확인하거나 복구하는 동안 서버가 테이블에 액세스하는 것을 방지하기 위해 내부 잠금 메커니즘을 사용할 수도 있습니다.

구문:

테이블 잠금: LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…]

테이블 잠금 해제: UNLOCK TABLES

LOCK TABLES는 현재 스레드의 테이블을 잠급니다. UNLOCK TABLES는 현재 스레드가 보유하고 있는 모든 잠금을 해제합니다. 스레드가 또 다른 LOCK TABLES를 발행하거나 서버 연결이 닫히면 현재 스레드에 의해 잠긴 모든 테이블이 자동으로 잠금 해제됩니다.

스레드가 테이블에 대해 READ 잠금을 획득하면 해당 스레드(및 다른 모든 스레드)는 테이블에서만 읽을 수 있습니다. 스레드가 테이블에 대해 WRITE 잠금을 획득하면 잠금을 보유한 스레드만 테이블을 읽거나 쓰며 다른 스레드는 차단됩니다.

각 스레드는 요청한 모든 잠금을 획득할 때까지 시간 초과 없이 기다립니다.

변경 사항이 최대한 빨리 처리되도록 일반적으로 WRITE 잠금이 READ 잠금보다 우선순위가 높습니다. 즉, 한 스레드가 READ 잠금을 획득한 후 다른 스레드가 WRITE 잠금을 요청하면 후속 READ 잠금 요청은 WRITE 스레드가 잠금을 획득하고 해제할 때까지 대기합니다.

분명히 확인을 위해서는 읽기 잠금만 획득하면 됩니다. 또한 Zhongqingqiaoxia는 테이블을 읽을 수만 있고 수정할 수는 없으므로 다른 클라이언트도 테이블을 읽을 수 있도록 허용합니다. 수리를 위해서는 테이블 작업 중에 클라이언트가 테이블을 수정하는 것을 방지하는 장치를 확보해야 합니다.

2. 외부 잠금

서버는 테이블을 사용하는 동안 다른 프로그램이 파일을 수정하지 못하도록 외부 잠금(파일 수준 잠금)을 사용할 수도 있습니다. 일반적으로 서버는 테이블 확인 작업 중에 myisamchk 또는 isamchk와 함께 외부 잠금을 사용합니다. 그러나 일부 시스템에서는 외부 잠금이 안정적으로 작동하지 않기 때문에 비활성화됩니다. myisamchk 또는 isamchk를 실행하기 위해 선택한 절차는 서버가 외부 잠금을 사용할 수 있는지 여부에 따라 다릅니다. 사용하지 않는 경우 내부 잠금 프로토콜을 사용해야 합니다.

--skip-locking 옵션을 사용하여 서버를 실행하면 외부 잠금이 비활성화됩니다. 이 옵션은 Linux와 같은 일부 시스템에서는 기본값입니다. mysql 관리 변수 명령을 실행하여 서버가 외부 잠금을 사용할 수 있는지 여부를 확인할 수 있습니다. Skip_locking 변수의 값을 확인하고 다음과 같이 진행하세요.

Skip_locking이 꺼져 있으면 외부 잠금이 적용된 상태이며, 사람과 유틸리티를 실행하여 테이블을 확인할 수 있습니다. 서버와 유틸리티는 테이블에 액세스하기 위해 협력합니다. 그러나 두 유틸리티 중 하나를 실행하기 전에 mysqladmin 플러시 테이블을 사용해야 합니다. 테이블을 복구하려면 테이블의 복구 잠금 프로토콜을 사용해야 합니다.

skip_locating이 켜져 있으면 외부 잠금이 비활성화되므로 myisamchk 또는 isamchk에서 수정 사항을 확인하면 서버가 이를 인식하지 못하므로 서버를 종료하는 것이 가장 좋습니다. 서버가 지속되면 이를 사용하기 전에 서버에 액세스하는 클라이언트가 없는지 확인하십시오. 카드 당사자의 잠금 프로토콜을 사용하여 다른 클라이언트가 해당 테이블에 액세스할 수 없음을 서버에 알려야 합니다.

테이블의 잠금 프로토콜을 확인하세요

이 섹션에서는 테이블의 내부 잠금을 사용하는 방법만 설명합니다. 체크 테이블의 잠금 프로토콜의 경우 이 프로세스는 테이블 점검에만 해당되며 테이블 복구에는 해당되지 않습니다.

1. mysql을 호출하여 다음 문을 실행합니다.

$mysql –u root –p db_namemysql>LOCK TABLE tbl_name READ;mysql>FLUSH TABLES;

이 잠금은 방지합니다. 기타 클라이언트 시스템은 테이블에 쓰고 검사 중에 테이블을 수정합니다. FLUSH 문은 서버가 테이블의 파일을 닫도록 하며, 캐시에 남아 있는 기록되지 않은 변경 사항을 모두 플러시합니다.

2. 확인 프로세스 실행

$myisamchk tbl_name$ isamchk tbl_name

3. 테이블 잠금 해제

mysql>UNLOCK TABLES;

myisamchk 또는 isamchk가 테이블에 문제가 있음을 나타내는 경우 테이블 수리를 수행해야 합니다.

이 글은 위의 소개를 요약한 것입니다. 위에서 언급한 내용은 MySQL 데이터베이스 테이블을 잠그는 방법에 대해 설명하고 싶은 내용입니다. 위에서 언급한 내용이 여러분에게 도움이 되기를 바랍니다. 누구나 도울 수 있습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.