답변:
MySQL 5.6 이상에서는 인덱스가 생성되거나 삭제되는 동안 테이블을 읽기 및 쓰기 작업에 사용할 수 있습니다. CREATE INDEX 또는 DROP INDEX 문은 테이블에 액세스하는 모든 트랜잭션이 완료된 후에 만 완료되므로 인덱스의 초기 상태는 테이블의 가장 최근 내용을 반영합니다. 이전에는 인덱스를 만들거나 삭제하는 동안 테이블을 수정하면 일반적으로 테이블에서 INSERT, UPDATE 또는 DELETE 문을 취소하는 교착 상태가 발생했습니다.
위의 답변에서 :
"데이터베이스가 온라인 상태 일 때 인덱스가 5.1보다 큰 버전을 사용하는 경우 생성됩니다. 따라서 프로덕션 시스템 사용이 중단되지 않을 것이라고 걱정하지 마십시오."
이것은 **** FALSE ****입니다 (최소한 MyISAM / InnoDB 테이블의 경우 99.999 %의 사람들이 사용합니다. Clustered Edition은 다릅니다.)
테이블에서 UPDATE 작업을 수행하면 인덱스가 생성되는 동안 BLOCK 됩니다 . MySQL은 이것에 대해 정말, 정말 어리 석습니다.
테스트 스크립트 :
(
for n in {1..50}; do
#(time mysql -uroot -e 'select * from website_development.users where id = 41225\G'>/dev/null) 2>&1 | grep real;
(time mysql -uroot -e 'update website_development.users set bio="" where id = 41225\G'>/dev/null) 2>&1 | grep real;
done
) | cat -n &
PID=$!
sleep 0.05
echo "Index Update - START"
mysql -uroot website_development -e 'alter table users add index ddopsonfu (last_name, email, first_name, confirmation_token, current_sign_in_ip);'
echo "Index Update - FINISH"
sleep 0.05
kill $PID
time mysql -uroot website_development -e 'drop index ddopsonfu on users;'
내 서버 (InnoDB) :
Server version: 5.5.25a Source distribution
출력 (인덱스 업데이트를 완료하는 데 걸리는 ~ 400ms 동안 6 번째 작업이 어떻게 차단되는지 확인) :
1 real 0m0.009s
2 real 0m0.009s
3 real 0m0.009s
4 real 0m0.012s
5 real 0m0.009s
Index Update - START
Index Update - FINISH
6 real 0m0.388s
7 real 0m0.009s
8 real 0m0.009s
9 real 0m0.009s
10 real 0m0.009s
11 real 0m0.009s
차단하지 않는 읽기 작업 대 (스크립트에서 줄 주석을 바꿉니다) :
1 real 0m0.010s
2 real 0m0.009s
3 real 0m0.009s
4 real 0m0.010s
5 real 0m0.009s
Index Update - START
6 real 0m0.010s
7 real 0m0.010s
8 real 0m0.011s
9 real 0m0.010s
...
41 real 0m0.009s
42 real 0m0.010s
43 real 0m0.009s
Index Update - FINISH
44 real 0m0.012s
45 real 0m0.009s
46 real 0m0.009s
47 real 0m0.010s
48 real 0m0.009s
지금까지 MySql 스키마를 업데이트하고 가용성 중단을 겪지 않는 방법은 하나뿐입니다. 원형 마스터 :
스키마를 업데이트하는 쉬운 방법은 그렇지 않습니다. 심각한 생산 환경에서 실행 가능 네, 그렇습니다. 제발, 제발, 쓰기를 차단하지 않고 MySQL 테이블에 인덱스를 추가하는 더 쉬운 방법이 있다면 알려주세요.
인터넷 검색 은 유사한 기술을 설명하는 이 기사로 연결됩니다. 더 좋은 점은 절차의 동일한 시점에서 술을 마시는 것이 좋습니다 (기사를 읽기 전에 제 답변을 썼다는 점에 유의하세요)!
기사 내가 도구에 대해 이야기 위의 링크는 PT-온라인 스키마 변경은 , 그 작품은 다음과 같습니다 :
이 도구를 직접 사용해 본 적이 없습니다. YMMV
저는 현재 Amazon의 RDS를 통해 MySQL을 사용하고 있습니다. MySQL을 마무리하고 관리하는 정말 멋진 서비스로, 버튼 하나로 새로운 읽기 복제본을 추가하고 하드웨어 SKU에서 데이터베이스를 투명하게 업그레이드 할 수 있습니다. 정말 편리합니다. 데이터베이스에 대한 슈퍼 액세스 권한을 얻지 못하므로 복제를 직접 망칠 수 없습니다 (이것이 축복입니까, 저주입니까?). 그러나 읽기 전용 복제본 승격 을 사용하여 읽기 전용 슬레이브에서 스키마를 변경 한 다음 해당 슬레이브를 새 마스터로 승격 할 수 있습니다. 위에서 설명한 것과 똑같은 트릭으로 실행하기가 훨씬 쉽습니다. 그들은 여전히 컷 오버를 돕기 위해 많은 일을하지 않습니다. 앱을 재구성하고 다시 시작해야합니다.
MySQL 5.6 업데이트 (2013 년 2 월) : 이제 InnoDB 테이블을 사용해도 인덱스가 생성되는 동안 읽기 및 쓰기 작업을 수행 할 수 있습니다-http: //dev.mysql.com/doc/refman/5.6/en/innodb-create-index -overview.html
MySQL 5.6 이상에서는 인덱스가 생성되거나 삭제되는 동안 테이블을 읽기 및 쓰기 작업에 사용할 수 있습니다. CREATE INDEX 또는 DROP INDEX 문은 테이블에 액세스하는 모든 트랜잭션이 완료된 후에 만 완료되므로 인덱스의 초기 상태는 테이블의 가장 최근 내용을 반영합니다. 이전에는 인덱스를 만들거나 삭제하는 동안 테이블을 수정하면 일반적으로 테이블에서 INSERT, UPDATE 또는 DELETE 문을 취소하는 교착 상태가 발생했습니다.
과:
MySQL 5.6에서는이 기능이 더욱 일반화되었습니다. 인덱스가 생성되는 동안 테이블을 읽고 쓸 수 있으며, DML 작업을 차단하지 않고 테이블을 복사하지 않고 더 많은 종류의 ALTER TABLE 작업을 수행 할 수 있습니다. 따라서 MySQL 5.6 이상에서는 일반적으로이 기능 세트를 빠른 인덱스 생성이 아닌 온라인 DDL이라고합니다.
에서 http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_fast_index_creation
pt-online-schema-change는 마이그레이션으로 인해 사이트가 중단되지 않도록 정말로 원하는 경우 사용할 수있는 방법입니다.
위의 의견에서 썼 듯이 프로덕션에서 pt-online-schema-change에 대한 몇 가지 경험이 있습니다. 2,000 만개 이상의 레코드와 마스터-> 2 개의 읽기 전용 복제 슬레이브로 구성된 기본 테이블이 있습니다. pt-online-schema-change를 사용하여 새 열 추가, 문자 집합 변경, 여러 인덱스 추가에 이르기까지 최소한 수십 번의 마이그레이션을 수행했습니다. 마이그레이션 시간 동안에도 많은 트래픽을 처리하며 문제가 발생하지 않았습니다. 물론 프로덕션에서 실행하기 전에 모든 스크립트를 매우 철저하게 테스트해야합니다.
pt-online-schema-change가 데이터를 한 번만 복사하면되도록 변경 사항을 하나의 스크립트로 일괄 처리하려고했습니다. 그리고 데이터를 잃을 수 있으므로 열 이름을 변경할 때는 매우주의해야합니다. 그러나 색인을 추가하는 것은 괜찮습니다.
pt-online-schema-change
. 훌륭하지만 MySQL 5.6+의 온라인 DDL 기능이 이미 잘 작동하는 많은 상황에서는 과잉입니다. 또한 제한 사항 (예 : 트리거를 잘 사용하지 않음)이 있으며 스키마 변경이 진행되는 동안 원본 테이블에 삽입 할 때마다 필요한 쓰기 양이 두 배가됩니다. 이것은 일반적인 온라인 스키마 변경보다 디스크에 많은 부담을 주므로 간단한 방식으로 스키마 변경을 실행하는 것만으로도 문제가없는 상황에서 "사이트를 중단"할 가능성이 있습니다.
pt-online-schema-change
, 유용한 도구이기는하지만 일반적인 온라인 DDL이 좋은 경우가 많고 더 좋은 경우가 많으므로 모든 권장 사항은 보편적이지 않고 신중하게주의해야합니다.