詳細検索

MySQL에서 ALTER TABLE에서 인덱스를 생성할 때의 주의사항

아바타
글쓴이 komi
6분 읽기

MySQL에서 ALTER TABLE에서 인덱스를 생성할 때의 주의사항
日本語에서 번역 • 원문 보기

안녕하세요. OPS 쪽 코미야입니다.
어느 날 아침, 갑자기 개발자로부터 상담을 받았고, 나중에 기록해 두겠습니다.

상담 세부 사항:
저는 Jenkins에서 프로덕션 배포를 했지만, 과정이 중간에 멈췄습니다.
(Cake의 DB 마이그레이션 스크립트와 함께 배포됨)
INDEX 항목을 KEY 열에 넣으려 했지만 DB가 응답하지 않아 연결할 수 없었습니다.
그 결과 테이블이 손상되어 RDS 기능을 사용해 시간을 지정하고 롤백했습니다.
(ALTER가 끝난 건지 모르겠어요, 왜냐하면 롤백했거든요)
같은 기록 수로 테스트 환경에서 같은 작업을 수행한 후, 이상 없이 원활하게 종료되었습니다.
현실에서도 똑같은 일을 다시 하고 싶은데, 어떻게 해야 할까요?
MySQL 버전은 5.5.27입니다.

제 개인적인 생각:
보통 ALTER를 돌리면 잠금이 걸리고,
동일한 구성과 케이스 수로 테스트 환경에서 미리 걸리는 시간을 추정하세요.
서비스를 중단하고 그 기간 동안 유지보수를 요청해야 합니다.
(*5.5까지) 5.6 버전부터는 일부 ALTER가 온라인에서 괜찮아진 것 같습니다. )
Sorry 디스플레이로 전환해서 업데이트가 없는 환경에서 시도해 보세요.
(기존 ELB 아래 모든 웹을 제거하고, vhost를 다른 서브도메인의 웹으로 끊고, 불필요한 콘텐츠는 ELB에 넣는 식으로 처리하세요.)
중간에 강제 종료하면 MyISAM으로 테이블이 쉽게 깨질 것 같습니다.
전체 프로세스리스트 표시; 현재 쿼리와 소요 시간을 확인할 수 있습니다.
하지만 저는 살인이 최후의 수단이라고 생각합니다.

alter table mysql이나 plus 5.6을 구글링하면 많은 정보를 얻을 수 있습니다.

sh2 블로그를 보면 다음과 같습니다.
MySQL - SH2의 일기에서 ALTER TABLE 문들의 진행 상황을 확인하세요
----------------
MySQL에서는,
수정된 정의를 바탕으로 작업 테이블을 만듭니다.
작업 테이블로 변경하기 전에 테이블에서 데이터를 복사하세요,
마지막으로 두 테이블이 바뀌었다.
테이블에 인덱스를 추가하는 기능도 현재 대부분에서 지원되고 있습니다
ALTER TABLE 문은 케이스 내에서 내부적으로 실행되고 있습니다.

얼마나 자고 있는지 확인하는 방법:
'핸들러_write'처럼 전 세계 상태 표시;
작업을 시작하기 전에 Handler_write 값과 목표 테이블의 레코드 수를 유지한다면,
과정이 얼마나 진전되었는지 확인할 수 있습니다.

InnoDB에서 innotop을 사용하면 행 연산 뷰에 Ins/Sec가 있어서
마찬가지로, ALTER TABLE의 완성 예측도 할 수 있습니다.
직접 차이를 계산할 필요가 없고, 표준 도구라 편리합니다
----------------

이 책은 Allied의 블로그에서 다음과 같이 소개되었습니다.
MySQL 5.6의 새로운 기능을 확인해 보세요! | Allied Architects 엔지니어 블로그
----------------
잠금을 방지하기 위해 InnoDB의 일부 ALTER TABLE 작업을 개선했습니다

지금까지는 인덱싱을 시도하면 중간에 있는 INSERT와 UPDATE가 잠겨 있었습니다.
예배 중에는 공연을 조율할 수도 없어서 유지해야 했어요.
5.6부터는 DML을 막지 않고 ALTER 테이블을 만들 수 있습니다.
정말 도움이 많이 됩니다.

하지만 모든 ALTER TABLE 연산에 해당하는 것은 아니며, 다음과 같은 것들에 한정되는 것으로 보입니다.

  • 열 추가, 삭제 및 이름 변경
    ・2차 인덱스에 대해 CREATE 및 DROP
  • 자동 증가 값 변경
  • 외래키 제약 조건 추가와 제거
    … 기타

하지만 그것만으로도 충분하다.
운영이 훨씬 쉬워질 거예요.
----------------

‧만약 ALTERN을 중간에 죽이면 어떻게 돼?
MySQL :: MySQL 5.1 참고 매뉴얼 :: 12.5.5.3 KILL 문법
ALTER 테이블 중에는 원래 테이블에서 행의 각 블록을 읽기 전에 킬 플래그를 확인합니다.
킬 플래그가 설정되면 문장이 비정상적으로 종료되고 임시 테이블이 삭제됩니다.
경고: MyISAM 테이블에서 REPAIR TABLE 또는 OPTIMIZE TABLE 작업을 종료하면 테이블이 손상되어 사용 불가가 됩니다.
인터럽트 없이 최적화하거나 복구하지 않는 한, 그런 테이블에 대한 쓰기와 읽기는 실패할 것입니다.

·최적화 테이블↓ 같은 효과
분석 테이블 인덱스 통계 업데이트에 사용됩니다
OPTIMYZE 테이블 MyISAM의 가변 길이 형식(테이블 정의에 가변 길이 열) 및 InnoDB의
        데이터 부분의 단편화를 제거하기 위해 실행하세요
        MyISAM의 경우, 인덱스 통계가 업데이트되고 조각 모음되며, 인덱스 페이지가 재정렬됩니다.
        InnoDB의 경우, 내부적으로 ALTER TABLE이 실행되고 테이블이 다시 생성됩니다.
        인덱스 정보와 데이터 모두 재생성되어 조각 모음을 제거합니다.
CHECK TABLE 손상되었을 수 있는 테이블을 확인하는 데 사용됩니다
복구 테이블 손상이 확인되면 복원을 시도합니다
ALTER TABLE 테이블을 다시 생성하면 인덱스 정보와 데이터가 모두 재생성되어 조각 모음이 제거됩니다

・About pt-online-schema-change (참고문헌)
서비스를 중단하지 않고, Alter Table | C.A.Mobile 엔지니어 블로그 PerconaToolkit이 있다면 꼭 사용해 보세요. 매우 유용한 도구입니다. KEY가 중복된 것도 확인할 수 있습니다.

12/13 후신:
아래도 확인해 주세요
한의 컴퓨터 경로: 테이블 변경을 잘 마스터하자. MySQL에서 열과 인덱스를 추가하고 삭제할 때 잠금에 대해 이야기하다 - (゚∀゚)오彡 sasata299의 블로그

지금은 여기까지입니다.
시청해 주셔서 감사합니다.

Related Articles