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
'program story' 카테고리의 다른 글
국소 최댓값과 최솟값 찾기 (0) | 2020.11.30 |
---|---|
내 로컬 Git 저장소를 원격 Git 저장소로 이동하려면 어떻게해야합니까? (0) | 2020.11.30 |
FrameLayout은 무엇을합니까? (0) | 2020.11.29 |
JavaScript에서 문자열 이스케이프 (0) | 2020.11.29 |
0은 C에서 8 진수 또는 10 진수입니까? (0) | 2020.11.29 |