2008-10-22 6 views
9

저는 현재 mysql/php (모든 테이블은 MYISAM 테이블 타입을 사용하고 있습니다)를 실행하는 웹 사이트를 운영하는 회사에서 일하고 있습니다.mysql 복제 - 테이블 잠금?

우리는 복제를 구현하고 싶습니다만, mysql 문서와 인터넷상의 다른 곳에서 테이블을 잠그는 바이너리 로그 (슬레이브 dbs가 결국 읽을 것입니다)를 읽었습니다.

이러한 잠금으로 인해 쓰기가 많은 라이브 사이트에서 문제가 발생합니까? 또한, 테이블을 잠글 필요없이 복제를 가능하게하는 방법이 있습니까?

답변

6

테이블 유형을 innodb로 변경하면 행 레벨 잠금이 사용됩니다. 또한 업데이트가 트랜잭션이되므로 복제가 더 안정적입니다. MyISAM 복제는 장기적인 고통입니다.

서버의 버전이 일치하고 항상 슬레이브를 종료하기 전에 반드시 마스터를 종료해야합니다. 노예를 폐쇄 한 직후 마스터를 다시 불러올 수는 있지만, 반드시 내려야합니다.

또한 InnoDB에 적절한 자동 확장 옵션을 사용해야합니다. 그리고 여러분이 그곳에 계실 때, 아마 float과 double에서 'decimal'(mysql 5.1을 의미합니다.)로 옮기고 싶을 것입니다. 그러면 복제의 어려움을 덜어 줄 것입니다.

귀하가 요청한 것보다 조금 더 많습니다. 즐겨.

P.s. 예, myisam 잠금으로 인해 문제가 발생할 수 있습니다. 또한, myisam이 거대한 선택을 막지 않는 한, innodb는 myisam보다 느립니다.

+0

아, 마스터에서 복제를 끄기 위해 실행할 수있는 SQL이있을 수 있습니다. 그런 다음 슬레이브의 상태를 따라 잡을 때까지 폴링 한 다음 해제하십시오. – Chris

0

myisam 테이블 유형을 사용하는 솔루션이 '더 우수'하지 않습니다. 그러나, 당신은 그것을 얻을 수 있습니다.

여러분이 할 수있는 최선의 방법은, MySQL 서버에서 동일한 버전 번호를 실행하고 있는지 확인하는 것뿐만 아니라, 슬레이브와 마스터가 동일한 하드웨어 (FPU 차이로 인해 복제 오류가 발생할 수 있음)에서 실행되도록하는 것입니다.

다음 링크는 질문에 대한 답변입니다. 특히, MyISAM 테이블의 잠금은 삭제 작업이 없으면 쓰기를 차단할 기회가 적습니다. 따라서 삭제 된 구멍이없는 테이블은 복제 된 설정에서 더 빨리 수행됩니다. 당신은에 의해 '구멍'의 영향을 완화 할 수

http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html

예약 된 다운 타임 동안 주기적으로 DBA의 내보내기/가져 오기를 (질량이 삭제 특히 후.) 또한, 슬레이브 데이터베이스는 내려 가지 않는다 확인 마스터는 여전히 실행 중입니다. 그러면 많은, 많은 문제를 줄일 수 있습니다.

+0

사실, FPU 차이 복제 오류는 innodb에서도 발생할 수 있습니다. float 또는 double을 사용하는 테이블 열. 정확한 오류 (한 번에 수천 번에 걸쳐 나타납니다)는 열 너비 차이 오류입니다. – Chris

4

내 경험으로 쓰기가 많은 사이트를 DBAing하는 경우 바이너리 로그를 작성하면 잠금 또는 성능에 인식 할 수없는 문제가 발생합니다. 입니다. 벤치마킹하고 싶다면 바이너리 로깅을 켜기 만하면됩니다. 필자는 테이블이 바이너리 로그에 쿼리를 작성하도록 잠겨 있다고 생각하지 않습니다.

슬레이브에 대한 테이블 잠금은 아주 다른 것입니다. 복제는 순차적입니다. 각 쿼리는 완료 될 때까지 실행되어 슬레이브가 다음 쿼리를 실행합니다. 이렇게 오래 업데이트하면 복제가 일시적으로 뒤떨어집니다. 응용 프로그램이 수평 확장을 위해 복제를 사용하려는 경우이를 수용하는 방법을 알아야합니다.