MySQL 큰 테이블 에 열 을 추가 합 니 다.

문 제 는 https://www.zhihu.com/question/440231149,my sql 에서 한 장의 표 에 3 억 데이터 가 있 고 표 가 나 뉘 지 않 으 며 이 큰 표 에 데 이 터 를 추가 하 라 고 요구 합 니 다.데이터 베 이 스 를 멈 출 수 없 을 뿐만 아니 라,삭제 와 수정 작업 도 있다.어떻게 조작 합 니까?정 답 은 개인 오리지널.
이전 버 전의 MySQL 에 열 을 추가 하 는 방법:

ALTER TABLE     ADD COLUMN    char(128);
잠 금 표를 만 들 수 있 습 니 다.간단 한 과정 은 다음 과 같 습 니 다.
  • Table 1 과 완전히 같은 구 조 를 가 진 Table 2
  • 을 새로 만 듭 니 다.
  • 테이블 1 더하기 자물쇠
  • 표 Table 2 에서 ALTER TABLE ADD COLUMN char(128)
  • 을 실행 합 니 다.
  • Table 1 의 데 이 터 를 Table 2
  • 으로 복사 합 니 다.
  • Table 2 를 Table 1 로 바 꾸 고 Table 1 을 제거 하 며 관련 된 모든 자 물 쇠 를 방출 합 니 다
  • 데이터 양 이 특히 많 으 면 잠 금 시간 이 길 고 그 동안 모든 표 업데이트 가 막 혀 온라인 업 무 를 정상적으로 수행 할 수 없다.
    MySQL 5.6(포함 되 지 않 음)이전 버 전에 대해 트리거 를 통 해 한 표 의 업 데 이 트 를 다른 표 에 반복 하고 데이터 동기 화 를 진행 합 니 다.데이터 동기 화가 완료 되면 업무 상 표 이름 을 새 표 로 수정 하여 발표 합 니 다.업 무 는 중단 되 지 않 습 니 다.트리거 설정:
    
    create trigger person_trigger_update AFTER UPDATE on     for each row 
    begin set @x = "trigger UPDATE";
    Replace into    SELECT * from     where   .id =    .id;
    END IF;
    end;
    
    MySQL 5.6(포함)이후 버 전 은 온라인 DDL 기능 을 도 입 했 습 니 다.
    
    Alter table     , ALGORITHM [=] {DEFAULT|INSTANT|INPLACE|COPY}, LOCK [=] { DEFAULT| NONE| SHARED| EXCLUSIVE }
    
    매개 변수:
    ALGORITHM:
  • DEFAULT:기본 방식 으로 MySQL 8.0 에서 지정 한 ALGORITHM 이 표시 되 지 않 으 면 INSTANT 알고리즘 을 우선 선택 합 니 다.INPLACE 알고리즘 을 다시 사용 하지 않 으 면 INPLACE 알고리즘 을 지원 하지 않 으 면 COPY 방식 으로
  • 을 완성 합 니 다.
  • INSTANT:8.0 에 새로 추 가 된 알고리즘 입 니 다.열 을 추가 하면 바로 돌아 갑 니 다.하지만 가상 열 은 안 됩 니 다.이 원 리 는 매우 간단 합 니 다.새로 만 든 열 에 대해 표 의 모든 기 존 데 이 터 는 즉각 변화 하 는 것 이 아니 라 표 사전 에 이 열 과 기본 값 을 기록 할 뿐 기본 적 인 Dynamic 줄 형식(사실은 Compressed 의 변종)에 대해 서 는 이 열 을 업데이트 하면 원래 데이터 표 시 는 마지막 에 추가 로 업 데 이 트 된 기록 을 삭제 하 는 것 입 니 다.이렇게 하면 미리 줄 공간 을 예약 하지 않 고 업 데 이 트 를 하면 줄 기록 공간 변동 이 자주 발생 할 수 있다.하지만 대부분의 업무 에 대해 서 는 최근 시간의 기록 이 수정 되 기 때문에 문제 가 크 지 않다.
  • INPLACE:원래 표 에서 직접 수정 하고 임시 표를 복사 하지 않 으 며 조목조목 기록 하여 수정 할 수 있 으 며 대량의 undolog 와 redolog 가 발생 하지 않 으 며 많은 buffer 를 차지 하지 않 습 니 다.재건 축 표 에 따 른 IO 와 CPU 소 모 를 피 할 수 있 고 기간 동안 좋 은 성능 과 병행 을 보장 합 니 다.
  • COPY:임시 새 표 에 복사 하여 수정 합 니 다.기록 복사 로 인해 대량의 undolog 와 redolog 가 발생 하고 많은 buffer 를 차지 하여 업무 성능 에 영향 을 줄 수 있 습 니 다.
  • LOCK:
  •  DEFAULT:ALGORITHM 의 DEFAULT 와 유사
  • NONE:잠 금 이 없 으 며,동시에 읽 고 업데이트 할 수 있 습 니 다.
  • 공유 잠 금,읽 기 허용,업데이트 허용 하지 않 음
  • EXCLUSIVE:읽 기와 업데이트 가 허용 되 지 않 습 니 다
  • 각 버 전이 지원 하 는 온라인 DDL 수정 에 사용 되 는 알고리즘 의 비교:
    image
    참고 문서:
    MySQL 5.6: https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-operations.htmlMySQL
    5.7: https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.htmlMySQL
    8.0: https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-operations.html
    통과 가능:
    
    ALTER TABLE     ADD COLUMN    char(128), ALGORITHM=INSTANT, LOCK=NONE;
    유사 한 문 구 는 온라인 증가 필드 를 실현 합 니 다.ALGORITHM 과 LOCK 을 명 확 히 하 는 것 이 좋 습 니 다.이렇게 DDL 을 수행 할 때 온라인 업무 에 얼마나 큰 영향 을 미 치 는 지 명확 하 게 알 수 있 습 니 다.
    동시에 온라인 DDL 을 실행 하 는 과정 은 다음 과 같 습 니 다.
    image
    이 를 통 해 알 수 있 듯 이 시작 단계 에 metadata lock 이 필요 하 다.metadata lock 은 5.5 에 야 my sql 에 도입 되 었 고 이전에 도 메타 데 이 터 를 보호 하 는 체제 가 있 었 으 나 metadata lock 개념 을 명확 하 게 제시 하지 않 았 을 뿐이다.그러나 5.5 이전 버 전(예 를 들 어 5.1)과 5.5 이후 버 전 은 메타 데 이 터 를 보호 하 는 데 현저 한 차이 점 이 있다.5.1 메타 데이터 에 대한 보 호 는 구문 등급 이 고 5.5 메타 데이터 에 대한 보 호 는 사무 등급 이다.구문 단계 란 구문 이 실 행 된 후에 업무 가 제출 되 거나 스크롤 백 되 든 그 표 구 조 는 다른 세 션 에 의 해 업 데 이 트 될 수 있 습 니 다.트 랜 잭 션 단 계 는 트 랜 잭 션 이 끝 난 후에 야 metadata lock 을 방출 합 니 다.
    metadata lock 을 도입 한 후에 주로 두 가지 문 제 를 해결 했다.하 나 는 사무 격 리 문제 이다.예 를 들 어 중복 격 리 가능 한 단계 에서 세 션 A 는 2 번 조회 하 는 동안 세 션 B 가 표 구 조 를 수정 하면 두 번 조회 결과 가 일치 하지 않 고 중복 읽 을 수 있 는 요 구 를 만족 시 킬 수 없다.또 하 나 는 데이터 복사 문제 입 니 다.예 를 들 어 세 션 A 가 여러 개의 업데이트 문 구 를 실행 하 는 동안 다른 세 션 B 가 표 구조 변경 을 하고 먼저 제출 하면 slave 가 다시 할 때 alter 를 다시 한 다음 에 update 를 다시 할 때 복사 오류 가 발생 할 수 있 습 니 다.
    만약 현재 많은 업무 가 실행 되 고 있 고 큰 조 회 를 포함 하 는 업무 가 있다 면,예 를 들 어:
    
    START TRANSACTION;
    select count(*) from    
    이런 유사 한 것 은 비교적 긴 시간 동안 업 무 를 수행 할 수도 있 고 막 을 수도 있다.
    그래서 원칙적으로:
  • 큰 사 무 를 피하 다
  • 업무 저 봉 에서 표 구조 변 화 를 하 다
  • 여기에 MySQL 큰 테이블 에 열 을 추가 하 는 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 MySQL 큰 테이블 에 열 을 추가 하 는 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기