2010년 12월 31일 금요일
MySQL 서버의 주요 버그
MySQL 서버에서 발생되는 버그는 모두 http://bugs.mysql.com 을 통해서 보고되며,
버그인지 아니면 사용자 실수인지 그리고 버그인 경우, 패치 진행 현황까지 모두 관리되고 있다.
하지만, 한번이라도 그 내용을 찾아본 사용자는 그 어려움을 절감 하고 있을 것이다.
MySQL 의 보고되었고, 현재 해결되지 않은 버그가 300개 가량이다. 어떤 버그가 있는지 어느 버전에 해결되었는지 알아낸다는 것은 적지 않은 시간을 요하는 작업임에는 틀림이 없다.
하지만, 주요 버그들에 대해서는 알아 두는 것이 MySQL의 버전을 선택할 때 또는 개발을 할 때 많은 도움이 될 것이라 생각한다.
l JOIN UPDATE와 ALTER TABLE 의 충돌로 인한 MySQL server crash (http://bugs.mysql.com/bug.php?id=38691)
- 버그 내용
JOIN UPDATE 쿼리 문과 ALTER TABLE 문이 동일 InnoDB 테이블에 대해서 동시에 실행될 경우,
JOIN UPDATE가 대기하게 되고 ALTER TABLE이 종료되면서 JOIN UPDATE 쿼리 문이 Lock을
점유하려는 순간 Server crash (Segmentation fault)가 발생됨
- 대상 버전
MySQL 5.0.72 버전, MySQL 5.1.30, MySQL 6.0.8-alpha 버전부터 패치 되었으며,
각 Major 버전 별로 그 이전의 버전 대에서는 발생 가능함
- 회피 방법
JOIN UPDATE 쿼리의 사용의 자제 (포기하기에는 너무 절실한 기능임 ㅠㅠ) 또는
ALTER TABLE 작업을 사용자의 요청이 없는 특정 점검 시간에 진행
l Query cache purge 오류로 인한 MySQL server crash (http://bugs.mysql.com/saved/all_query_cache_bugs)
- 버그 내용
Slave 장비에서 Relay log를 실행하는 Slave SQL thread가 INSERT, UPDATE, DELETE 문장을 실행하면서
QueryCache의 내용을 제거하는 도중 MySQL server crash 발생. View 에 INSERT, UPDATE, DELETE 등이
실행되면서, QueryCache에서 해당 View의 내용을 제거하는 도중에서 MySQL server가 Crash되는 버그도
있음
- 대상 버전
MySQL 5.1.0 ~ MySQL 5.1.54 버전,
그리고 이 버전들에서는 이 이외에도 수많은 형태의 Query cache 관련된 버그가 있는 것으로 보고됨)
- 회피 방법
MySQL 5.1.54 이후 버전으로의 업그레이드가 당장 어려운 경우,
MySQL server의 Query cache를 비활성화(Disable) 후 서비스 투입
query_cache_size = 0
query_cache_type = 0
l SELECT ... FROM tab WHERE idx_fd IN (SELECT ... FROM tab1 WHERE ...) 쿼리의 인덱스 사용 불가
- 버그 내용
MySQL 버그 시스템에 등록되어 있는지 모르겠지만, 현재 대 부분의 MySQL 버전 대에서 위의 쿼리에서
tab 테이블의 idx_fd 컬럼에 인덱스가 준비되어 있어도 그 인덱스를 이용하지 못하고 Full Scan을
하게 되는 버그가 있음. (왜 아직 고쳐지지 않는지 잘 모르겠음) MySQL 서버의 구조상의 문제라고
이야기 되기도 하는데...
- 대상 버전
현재 Release된 거의 모든 버전
- 회피 방법
현재로써는 MySQL의 버전 업그레이드로 해결될 수 없기 때문에
만약, tab 테이블의 레코드 건수가 적다면 그대로 유지하고,
그렇지 않다면, 서브 쿼리 부분을 별도의 쿼리로 실행해서 그 결과를 IN (...) 조건에 직접 추가
(Application을 통해서 처리)
앞으로도 일반적으로 겪을 가능성이 있는 주요 버그들에 대해서 보완하도록 하겠다.
댓글 없음:
댓글 쓰기