2011-09-29 4 views
52

"데이터베이스"테이블 (main_table)에 "location"이라는 열을 추가하려고했습니다. 내가 실행 한 명령은ALTER TABLE ADD COLUMN은 오랜 시간이 걸립니다.

ALTER TABLE main_table ADD COLUMN location varchar (256); 

입니다. main_table에는> 2,000,000 개의 행이 있습니다. 2 시간 이상 계속 실행되지만 아직 완료되지 않았습니다.

mytop 나는 다른 쿼리 프로세스에서 쿼리가 잠기지 않았 음을 확인하기 위해이 데이터베이스의 활동을 모니터링하려고했지만 그렇지 않은 것 같습니다. 오랜 시간이 걸릴 것인가? 사실,이 명령을 실행하기 전에 컴퓨터를 재부팅했습니다. 이제이 명령이 실행 중입니다. 나는 무엇을해야할지 모르겠다.

+0

다른 테이블을 드롭 인덱스와 테이블에있는 행의 양 때문에 시간이 많이 걸립니다. 참고 : Varchar (255) – Jauzsika

+0

기본 값을 지정해야한다고 생각합니다. 시간이 걸리는 이유가 무엇일까요? – Nilesh

+1

이 경우 기본적으로 'NULL'로 설정되어 있습니다. 오랜 시간이 걸리는 이유는 아닙니다. – Romain

답변

137

ALTER TABLE 문은 mysql이 새로운 열을 포함하여 테이블의 모든 단일 행을 다시 써야 함을 의미합니다. 2 백만 개가 넘는 행을 가지고 있기 때문에 상당한 시간이 걸릴 것으로 예상됩니다.이 기간 동안 서버는 거의 IO 기반이 될 것입니다.

CREATE TABLE main_table_new LIKE main_table; 
ALTER TABLE main_table_new ADD COLUMN location varchar(256); 
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table; 
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; 
DROP TABLE main_table_old; 

이 방법은 빈 테이블에 열을 추가, 기본적으로 당신이 다른 아무도 없을 것입니다 확신이 새 테이블에 데이터를 쓰기 : 당신은 일반적으로는 다음을 수행하는 것이 더 성능이 좋은입니다 찾을 것 많은 자원을 잠그지 않고 바라 보는 것.

+48

+1 'LIKE' 문법은 이전에 보지 못했습니다. – Malvolio

+0

@Malvolio 주목할 가치가있다 : 나는 이것이 MySQL 독점적 인 SQL 확장이라고 생각한다. 그러나 100 % 확실하지는 않다. – Romain

+4

이더라도, MySQL SQL이 아닌 RDBMS를 마지막으로 사용한 사람은 언제입니까? 친구들은 친구들이 오라클을 구입하게하지 않습니다. – Malvolio

9

이 답변은 pt-online-schema-change 또는 gh-ost과 같은 기능을 사용하고 있다고 생각합니다.

가동 중단 시간이 1 분 미만으로 10 일이 걸리지 만 40 억 개가 넘는 행을 마이그레이션했습니다.

Percona는

  • 그들이 임시 테이블
  • 에 복제되도록
  • 이 (삽입, 업데이트에 대한 삭제) 첫 번째 테이블에 트리거를 생성 임시 테이블을 만들기 위로서 매우 유사한 방식으로 작동합니다 소량에서
  • , 마이그레이션 데이터를 수행
  • 는 새 테이블에 테이블의 이름을 변경하고, 그것은 보라 걸릴 것
+1

이것은 투표가 적거나 수락 된 해결책이 때로 가장 좋거나 유일한 해결책 인 경우가 많습니다. 다른 솔루션에 대해 얼마나 많은 사람들이 투표를 잘못했는지 OMG. –

관련 문제