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
statement는 mysql이 새 열을 포함하여 테이블의 모든 행을 다시 써야 함을 의미합니다.200만 개 이상의 행이 있기 때문에 상당한 시간이 걸릴 것으로 예상되며, 이 기간 동안 서버는 대부분 IO바인드 상태가 될 것입니다.일반적으로 다음과 같은 작업을 수행하는 것이 더 좋습니다.
CREATE TABLE main_table_new LIKE main_table;
ALTER TABLE main_table_new ADD COLUMN location VARCHAR(256);
INSERT INTO main_table_new SELECT *, NULL 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억 행 이상의 마이그레이션을 수행했지만 다운타임은 1분도 채 걸리지 않고 최대 10일이 소요될 수 있습니다.
Percona는 위와 같은 방식으로 작업합니다.
- 임시 테이블 생성
- 첫 번째 테이블(삽입, 업데이트, 삭제용)에 트리거를 생성하여 임시 테이블로 복제합니다.
- 소규모 배치로 데이터 마이그레이션
- 완료되면 테이블 이름을 새 테이블로 변경하고 다른 테이블을 삭제합니다.
고유 검사 및 외부 키 검사를 일시적으로 해제하여 프로세스 속도를 높일 수 있습니다.사용되는 알고리즘을 변경할 수도 있습니다.
새 열을 테이블 끝에 배치하려면algorithm=instant
:
SET unique_checks = 0;
SET foreign_key_checks = 0;
ALTER TABLE main_table ADD location varchar(256), algorithm=instant;
SET unique_checks = 1;
SET foreign_key_checks = 1;
그렇지 않으면 컬럼을 특정 위치에 배치해야 할 경우algorithm=inplace
:
SET unique_checks = 0;
SET foreign_key_checks = 0;
ALTER TABLE main_table ADD location varchar(256) AFTER othercolumn, algorithm=inplace;
SET unique_checks = 1;
SET foreign_key_checks = 1;
참고로 inplace 알고리즘을 사용하여 2000만 행의 테이블을 변경하는 데 2분 정도 걸렸습니다.Workbench와 같은 프로그램을 사용하는 경우 작업을 시작하기 전에 설정에서 기본 시간 초과 기간을 늘릴 수 있습니다.
조작이 무기한으로 행하고 있는 것을 발견했을 경우는, 프로세스의 리스트를 참조해, 테이블에 잠겨 있는 프로세스를 모두 종료할 필요가 있습니다.이를 수행하려면 다음 명령을 사용합니다.
SHOW FULL PROCESSLIST;
KILL PROCESS_NUMBER_GOES_HERE;
변경 테이블은 사용자의 경우와 같이 빅데이터에 시간이 오래 걸리므로 이러한 상황에서는 사용하지 말고 다음과 같은 코드를 사용하십시오.
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;
DB2 z/OS는 열을 가상으로 즉시 추가합니다.테이블을 Advisory-Reg 상태로 만듭니다.reorg 전에 실행되는 모든 것.기본값이 없는 경우 null이 됩니다.업데이트가 완료되면 업데이트된 행을 확장합니다.삽입이 확장됩니다.다음 reorg는 전개되지 않은 모든 행을 전개하고 전개되는 모든 행에 기본값을 할당합니다.
이것은 실제 데이터베이스만이 잘 처리합니다.DB2 z/OS.
언급URL : https://stackoverflow.com/questions/7599519/alter-table-add-column-takes-a-long-time
'programing' 카테고리의 다른 글
MySQL 오류 2006: mysql 서버가 사라졌습니다. (0) | 2023.01.08 |
---|---|
올바른 결과를 반환하지 않음으로써 그룹이 포함된 MySQL 수 (0) | 2023.01.08 |
Ajax를 사용하여 @RequestBody의 여러 변수를 Spring MVC 컨트롤러로 전달 (0) | 2022.12.24 |
소스 파일을 더 이상 사용할 수 없습니다. (0) | 2022.12.24 |
Java의 DAO(Data Access Object) (0) | 2022.12.24 |