MySQL 에서 load data 구문 으로 잠 금 이 걸 린 해결 사례
배경
이것 은 데이터 분석 과 유사 한 항목 으로 데 이 터 는 LOAD DATA 문 구 를 통 해 InnoDB 표 에 완전히 가 져 옵 니 다.설명 하기 편리 하도록 표 구 조 는 다음 과 같이 간략화 되 었 다.
Create table tb(id int primary key auto_increment, c int not null) engine=innodb;
데 이 터 를 가 져 오 는 문 구 는 다음 과 같 습 니 다.
Load data infile ‘data1.csv' into table tb;
Load data infile ‘data2.csv' into table tb;
cat Data1.csv
1 100
2 100
3 100
Cat data2.csv
10 100
11 100
12 100
잠 금 이 생 긴 증 거 는 show engine innodb status 의 LATEST DETECTED DEADLOCK 세그먼트 에서 잠 금 정 보 를 보 았 다 는 것 입 니 다.다음 과 같이 간략화 되 었 습 니 다.설명 하 다.
위 표 에서 보 듯 이 사무 1 은 한 줄 의 자 물 쇠 를 기다 리 고 있다.사무 2 는 이 줄 의 자 물 쇠 를 가지 고 있 지만 대기 표 의 자동 증가 자물쇠(AUTOINC),잠 금 으로 판단,트 랜 잭 션 스크롤 백.
여기 사무 1 은 쓰 여 있 지 않 지만 사무 1 은 이 표 의 자동 잠 금 을 가지 고 있 는 것 으로 추정 된다.(그렇지 않 으 면 잠 금 이 되 지 않 는 다.)
2,배경 지식 1:AUTOINC lock 및 그 옵션
InnoDB 표 에 자체 증가 필드 가 존재 하면 표 단계 의 자 물 쇠 를 유지 합 니 다.여 기 를 자체 증가 자물쇠 라 고 합 니 다.새 데 이 터 를 삽입 하거나 update 문 구 를 수정 할 때마다 이 자 물 쇠 를 가 져 와 야 합 니 다.
하나의 업무 에 여러 개의 문 구 를 포함 할 수 있 기 때문에 모든 문 구 는 자체 증가 필드 와 관련 이 있 는 것 이 아니 라 InnoDB 는 하나의 문 구 를 추가 한 후에 바로 풀 려 났 다.특수 처리 라 고 하 는 이 유 는 일반적인 자물쇠 가 모두 업무 가 끝 난 후에 풀 리 기 때문이다.
표 에 자체 증가 필드 가 있 으 면 insert 문 구 는 이 필드 의 값 을 지정 하지 않 거나 NULL 로 지정 할 때 InnoDB 는 현재 AUTO 로 값 을 부여 합 니 다.INCREMENT 의 값,그리고 AUTOINCREMENT 플러스 1.
이 자물쇠 와 관련 된 매개 변 수 는 innodb 입 니 다.autoinc_lock_mode.기본 값 은 1 이 고 0,1,2 로 선택 할 수 있 습 니 다.
이 값 이 0 으로 설정 되 었 을 때 필드 가 있 는 표 가 한 줄 의 데 이 터 를 삽입 하 는 행 위 를 살 펴 보 겠 습 니 다.
1)AUTO 신청INC 자물쇠
2)현재 AUTO 획득INCREMNT 값 n,AUTOINCREMENT 더하기 1
3)삽입 작업 을 수행 하고 새로 추 가 된 줄 의 대응 필드 에 n 을 채 웁 니 다.
4)AUTO 방출INC 자물쇠
우 리 는 이 과정 에서 InnoDB 가 자물쇠 의 입 도 를 줄 이기 위해 문 구 를 실행 하고 바로 풀 었 지만 이 자 물 쇠 는 너무 크다.DD 는 삽입 작업 시간 을 포함한다.이 로 인해 두 개의 insert 문 구 를 만 들 었 고 실제로 병행 할 수 없 었 다.
이 인자 가 없 기 전에 행동 은 0 으로 설정 한 것 과 같 습 니 다.0 이 옵션 은 호 환 되 어 있 습 니 다.
1 로 설정 할 때 3)과 4)를 맞 추 는 것 이 라 고 생각 하기 쉽다.그러나 본 고 는 0 의 상황 을 토론 해 야 한다.왜냐하면 우리 의 전 제 는 LOAD 문장 이 고 LOAD 문장 과 같은 여러 줄 의 문장 에 삽입 되 기 때문이다(insert..select..포함).1 로 설정 해도 소 용이 없고 0 의 모델 로 퇴화 된다.
3.배경 지식 2:LOAD DATA 문장의 주종 행위
왜 여러 줄 의 문 구 를 삽입 하 는 지 innodbautoinc_lock_mode 를 1 로 설정 해도 0 으로 할 까요?
주요 원인 은 역시 주종 일치 성 을 위 한 것 이다.구상 binlogformat='statement',LOAD DATA 문 구 는 메 인 라 이브 러 리 의 binlog 에 구문 자체 로 직접 기록 되 어 있 습 니 다.라 이브 러 리 에서 어떻게 재생 합 니까?
1)load data 에 사용 할 파일 을 slave 에 보 내 고 slave 는 임시 디 렉 터 리 에 파일 을 저장 합 니 다.
2)슬 레이 브 에서 도 LOAD DATA 문 구 를 한 번 실행한다.
그 사이 에 문제 가 있 습 니 다.slave 는 load data 문장의 자체 증가 id 필드 가 master 와 같다 는 것 을 어떻게 보장 합 니까?
이 문 제 를 해결 하기 위해 메 인 라 이브 러 리 의 binlog 에 set SET INSERT 가 있 습 니 다.ID 명령 은 이 LOAD DATA 문구 가 삽 입 된 첫 줄 의 자체 증가 ID 값 을 나 타 냅 니 다.이렇게 slave 는 load data 를 실행 하기 전에 이 set SET INSERT 를 실행 하 였 습 니 다.ID 문 구 는 실행 결과 가 주 라 이브 러 리 와 똑 같 음 을 보증 하 는 데 사 용 됩 니 다.
상기 메커니즘 은 주종 데이터 가 일치 하 는 전 제 를 보장 할 수 있다.주종 라 이브 러 리 에서 LOAD DATA 문 구 를 생 성 하 는 자체 증가 ID 값 은 반드시 연속 적 이 어야 한다.
4.배경 지식 1+2:분석
앞에서 말 한 패턴 0 과 1 의 차이 점 으로 돌아 가면 AUTOINC 자 물 쇠 는 전체 문장 이 시작 되 기 전에 가 져 오고 문장 이 끝 난 후에 야 방출 됩 니 다.그러면 전체 문장 이 생 성 된 id 연속 DD 모드 0 의 보증 을 확보 할 수 있 습 니 다.
1 에 대해 서 는 다음 값 을 받 을 때마다 방출 되 고 데 이 터 를 삽입 한 후 재 신청 이 필요 하면 연속 되 지 않 습 니 다.
1 로 설정 하 더 라 도 여러 줄 의 조작 에 대해 0 으로 퇴화 하 는 이유 다.
이로써 우 리 는 이 자물쇠 가 나타 난 이 유 를 알 게 되 었 다.이 두 LOAD DATA 문 구 는 같은 기록 뿐만 아니 라 같은 AUTO 도 방문 할 수 있 기 때문이다.INC 자물쇠,서 로 를 기다 리 게 합 니 다.
여기 서 끝 이 없습니다.두 스 레 드 가 두 개의 자 물 쇠 를 방문 하면 잠 금 이 생 길 수 있 지만 잠 금 은 또 다른 조건 이 있 습 니 다.신청 순서 와 관련 이 있다 는 것 을 알 고 있 기 때 문 입 니 다.AUTOINC 는 시계 자물쇠 입 니 다.누가 먼저 받 든 같은 표 의 LOAD DATA 의 실행 을 막 을 수 있 습 니 다.또 왜 어떤 기록 에 자물쇠 가 나타 나 기 를 기다 리 고 있 습 니까?
5,배경 지식 3:AUTOINC 의 잠 금 추가 시기
앞에서 우 리 는 새로운 데 이 터 를 삽입 할 때마다 AUTO 를 요구한다 고 말 했다.INC 에 자 물 쇠 를 추가 하고 절 차 를 보 여 줍 니 다.그러나 이 절 차 는 InnoDB 에서 자가 부가 가치 로 열 값 을 설정 해 야 하 는 경우 다.다른 상황 은 문장 에 이 열의 값 을 지정 한 것 이다.
예 를 들 어 이 표 에 대해 insert into tb values(9,100)를 실행 합 니 다.이때 id 의 값 은 9 로 명확 합 니 다.값 을 가 져 와 서 채 울 필 요 는 없 지만 이 줄 을 삽입 하면 AUTO 를 바 꿔 야 할 수도 있 습 니 다.INCREMENT 의 값(원래<10 이 라면 10 으로 바 꿔 야 합 니 다)때문에 이 자 물 쇠 는 절약 할 수 없습니다.흐름:
1)데이터 삽입
2)실패 시 절차 종료
3)성공 하면 AUTO 신청INC 자물쇠
4)set 호출max...함수,필요 하 다 면 AUTO 수정INCREMENT
5)문장 종료 시 AUTO 방출INC 자물쇠.
6、AUTO 왜 수정INC 순서
이렇게 조정 하 는 장점 은 무엇 입 니까?불필요 한 잠 금 접근 을 줄 이기 위해 서다.데 이 터 를 삽입 하 는 동안 오류 가 발생 하면 다른 필드 에서 DUPLICATE KEY error 를 만 들 면 AUTO 에 접근 하지 않 아 도 됩 니 다.INC 자물쇠.
7.잠 금 해제 과정 재현
'문구 가 끝 날 때'라 고 강조해 야 한다.이렇게 해서 우 리 는 모든 줄 이 증가 열 값 을 지정 한 LOAD DATA 문장의 절 차 를 살 펴 보 겠 습 니 다(즉,본 고의 예 입 니 다).
1)첫 번 째 데이터 삽입
2)AUTO 신청INC 자물쇠
3)두 번 째 줄 삽입
4)AUTO 신청INC 자물쇠(이미 자신의 것 이기 때문에 직접 성공)
5) 。。。。。。남 은 모든 줄 삽입
6)AUTO 방출INC 자물쇠.
그래서 이 절 차 는 첫 줄 삽입,AUTO 신청 으로 간단하게 설명 합 니 다.INC 자 물 쇠 를 잠 그 고 남 은 줄 을 모두 삽입 한 후 방출 합 니 다.
앞에서 말 했 듯 이 첫 번 째 데 이 터 를 삽입 할 때 방문 해 야 할 기록 자 물 쇠 는 전체 업무 가 끝 난 후에 야 풀 려 납 니 다.
위의 이러한 배경 지식 이 있 으 니,우 리 는 자물쇠 가 나타 나 는 과정 을 재현 해 보 자.
트리거 조건 이 까다 로 운 것 을 볼 수 있 습 니 다.특히 session 2 는 session 1 이 잠 겨 있 는 기록 자 물 쇠 를 사용 해 야 합 니 다.설명 이 필요 하 다.InnoDB 내부 에서 기록 에 대한 표시 로 인해 같은 기록 자 물 쇠 는 메 인 키 값 이 반드시 같다 는 것 을 나타 내지 않 는 다.
8.해결 방안 1:불필요 한 AUTO 제거입력 필드
이 업무 에 서 는 모든 데이터 가 LOAD DATA 를 통 해 들 어가 고 자체 증가 필드 의 값 이 지정 되 어 있 기 때문에 이 AUTO)INCREMENT 속성 은 필요 하지 않 습 니 다.
하나 가 없 으 면 잠 글 수 없다.
9.해결 방안 2:강제 모드 1
앞에서 저희 가 innodb 라 고 했 잖 아 요.autoinc_lock_mode 이 매개 변수의 선택 값 은 0,1,2 입 니 다.1 로 설정 하면 LOAD DATA 문 구 는 모드 0 으로 퇴화 합 니 다.단,2 로 설정 하면 모드 1 을 어떻게 든 사용 합 니 다.
앞에서 말 했 듯 이 사용 모드 1 은 LOAD DATA 가 생 성 하 는 자체 증가 id 값 이 연속 되 지 않 아 binlogformat 는 1 시 주종 이 일치 하지 않 기 때문에 2 로 설정 하 는 전 제 는 binlog 입 니 다.format 는 row 입 니 다.
binlog 에서format='row'시 innodb 설정autoinc_lock_모드 2 는 안전 합 니 다.
허용 된다 면 방안 2 는 방안 1 보다 가 볍 고 데이터 와 표 구 조 를 수정 할 필요 가 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.