program story

ALTER TABLE ADD COLUMN은 시간이 오래 걸립니다.

inputbox 2020. 11. 29. 10:26
반응형

ALTER TABLE ADD COLUMN은 시간이 오래 걸립니다.


데이터베이스의 테이블 (main_table)에 "location"이라는 열을 추가하려고했습니다. 내가 실행 한 명령은

ALTER TABLE main_table ADD COLUMN location varchar (256);

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

mytop이 데이터베이스의 활동을 모니터링하여 쿼리가 다른 쿼리 프로세스에 의해 잠겨 있지 않은지 확인 하려고 시도했지만 그렇지 않은 것 같습니다. 시간이 오래 걸릴까요? 실제로이 명령을 실행하기 전에 컴퓨터를 재부팅했습니다. 이제이 명령이 여전히 실행 중입니다. 무엇을해야할지 모르겠습니다.


귀하의 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;

이렇게하면 빈 테이블에 열을 추가하고 기본적으로 많은 리소스를 잠그지 않고는 아무도 보지 않을 것이라고 확신하는 새 테이블에 데이터를 작성합니다.


이에 대한 적절한 대답은 pt-online-schema-change 또는 gh-ost 와 같은 기능을 사용하는 것 입니다.

이를 통해 40 억 개 이상의 행을 마이그레이션했지만 최대 10 일이 걸릴 수 있으며 가동 중지 시간은 1 분 미만입니다.

Percona는 위와 매우 유사한 방식으로 작동합니다.

  • 임시 테이블 만들기
  • 임시 테이블에 복제되도록 첫 번째 테이블 (삽입, 업데이트, 삭제 용)에 트리거를 생성합니다.
  • 소규모 배치로 데이터 마이그레이션
  • 완료되면 테이블 이름을 새 테이블로 변경하고 다른 테이블을 삭제하십시오.

Alter table은 귀하의 경우와 같은 빅 데이터로 오랜 시간이 걸리므로 이러한 상황에서 사용하지 말고 다음과 같은 코드를 사용하십시오.

select main_table.*, 
  cast(null as varchar(256)) as null_location, -- any column you want accepts null
  cast('' as varchar(256)) as not_null_location, --any column doesn't accept null
  cast(0 as int) as not_null_int, -- int column doesn't accept null
into new_table 
from main_table;

drop table main_table;
rename table new_table TO main_table;

참고 URL : https://stackoverflow.com/questions/7599519/alter-table-add-column-takes-a-long-time

반응형