대형 MySQL InnoDB 테이블 변경
행 수가 1,000만 개가 넘는 MySQL의 대형 innob 테이블의 경우 새 열을 추가하거나 인덱스를 추가하는 데 몇 시간과 며칠이 걸릴 수 있습니다.이 두 가지 경우에 대규모 innob 테이블의 성능을 향상시키는 가장 좋은 방법은 무엇입니까?메모리 추가, 구성 조정(예: sort_buffer_size 또는 innodb_buffer_pool_size 증가) 또는 일종의 트릭?테이블을 직접 변경하는 대신 새 테이블을 생성하고 변경한 다음 이전 데이터를 복사할 수 있습니다. 이는 ISAM 테이블 및 여러 변경 사항에 유용합니다.
CREATE TABLE tablename_tmp LIKE tablename;
ALTER TABLE tablename_tmp ADD fieldname fieldtype;
INSERT INTO tablename_tmp SELECT * FROM tablename;
ALTER TABLE tablename RENAME tablename_old;
ALTER TABLE tablename_tmp RENAME tablename;
그것이 innodb 테이블에도 권장됩니까, 아니면 단지 ALTER TABLE 명령이 하는 것입니까?
2016년 편집: 최근(2016년 8월) 출시되었습니다.gh-ost
그것을 반영하도록 내 대답을 수정하는 것.
오늘날 MySQL에 대한 온라인 대체 테이블을 수행할 수 있는 몇 가지 도구가 있습니다.다음은 다음과 같습니다.
- 2016: gh-host: GitHub의 트리거 없는 스키마 마이그레이션 도구(거부자:이 도구의 작성자입니다.)
- okak-online-break-table, openark-kit의 일부로 제공됩니다(자:이 도구의 작성자입니다.)
- Percona Toolkit의 일부로 pt-online-schema-change
- MySQL에 대한 Facebook의 온라인 스키마 변경
"정상"의 ALTER 탭을 고려해 보겠습니다.LE':
큰 테이블은 시간이 오래 걸립니다.ALTER
.innodb_buffer_pool_size
다른 변수도 중요하지만 매우 큰 표에서는 모두 무시할 수 있습니다.그냥 좀 시간이 걸린다.
MySQL이 수행하는 작업ALTER
테이블은 새 형식으로 새 테이블을 만들고 모든 행을 복사한 다음 전환하는 것입니다.이 시간 동안 테이블은 완전히 잠깁니다.
자신의 제안을 고려해 보십시오.
아마도 모든 옵션 중에서 최악의 성능을 발휘할 것입니다.왜 그런 것일까요?InnoDB 테이블을 사용하고 있기 때문에INSERT INTO tablename_tmp SELECT * FROM tablename
거래를 만듭니다. 거대한 거래.일반 부하보다 훨씬 더 많은 부하가 발생합니다.ALTER TABLE
.
게다가, 당신은 그 시간에 당신의 애플리케이션을 종료해야만 그것이 기록되지 않을 것입니다 (INSERT
,DELETE
,UPDATE
테이블로 이동합니다.만약 그렇다면 - 당신의 모든 거래는 무의미합니다.
온라인 도구가 제공하는 기능
모든 도구가 동일하게 작동하는 것은 아닙니다.그러나 기본 사항은 다음과 같습니다.
- 변경된 스키마로 "그림자" 테이블을 만듭니다.
- 트리거를 생성하고 사용하여 원래 테이블에서 고스트 테이블로 변경 사항을 전파합니다.
- 테이블에서 섀도 테이블로 모든 행을 천천히 복사합니다.그들은 한 번에 1,000줄씩 이렇게 합니다.
- 사용자가 원본 테이블에 액세스하고 조작할 수 있는 동안 위의 모든 작업을 수행합니다.
- 만족할 경우, 그들은 다음을 사용하여 두 가지를 교환합니다.
RENAME
.
오픈파크 키트 도구는 현재 3.5년 동안 사용되고 있습니다.Percona 도구는 몇 달이 지났지만, 아마도 전자 도구보다 더 테스트될 것입니다.Facebook의 도구는 Facebook에서 잘 작동한다고 하지만 일반 사용자에게 일반적인 솔루션을 제공하지는 않습니다.제가 직접 사용한 적은 없습니다.
2016년 편집: gh-ost
트리거 없는 솔루션으로, 마스터에 대한 마스터 쓰기 로드를 크게 줄여 마이그레이션 쓰기 로드를 일반 로드에서 분리합니다.감사, 제어, 테스트가 가능합니다. 프로덕션 마이그레이션을 GitHub을 통해 . 모든 프로덕션 마이그레이션은 다음을 통해 수행하고 있습니다.gh-ost
오늘. 여기서 더 보기.
각 도구에는 고유한 제한이 있습니다. 설명서를 자세히 살펴보십시오.
보수적인 방법
하여 Active-Passive Master-Master 복제를 입니다.ALTER
하고 "(으)ㄹ 수 있습니다"를 합니다.ALTER
이전에는 활성 서버였지만 지금은 수동 서버로 전환되었습니다.이것도 좋은 선택사항이지만, 추가 서버와 복제에 대한 더 깊은 지식이 필요합니다.
참조된 테이블의 나사 이름을 바꿉니다.
할 말이 있다면,table_2
에게 어린애 같은tablename
ALTER TABLE tablename RENAME tablename_old;
table_2
합니다.tablename_old
.
이제 table_2를 변경하지 않고는 다시 가리킬 수 없습니다.tablename
당신은 모든 아이들과 참조된 표에서 계속해서 수정을 해야 합니다.
언급URL : https://stackoverflow.com/questions/11450089/changing-large-mysql-innodb-tables
'programing' 카테고리의 다른 글
업데이트 쿼리의 SQL 트리거에 오류가 있습니다. (0) | 2023.07.24 |
---|---|
Prepared Statement에서 매개 변수 설정이 작동하지 않음 (0) | 2023.07.24 |
fragment의 onCreate(), onCreateView() 및 onActivityCreated()의 차이점 및 사용 (0) | 2023.07.24 |
브라우저 창 닫기 이벤트를 캡처하는 방법은 무엇입니까? (0) | 2023.07.24 |
springboot에서 feignclient를 찾을 수 없습니다. (0) | 2023.07.24 |