2013-06-10 2 views
3

MySQL에 문제가 있습니다.큰 테이블에서 alter table 명령을 실행할 때 MySQL이 모든 것을 잠금합니다.

큰 테이블 (850 만 레코드)을 가지고 있는데 alter table add index 명령을 실행했습니다. 내가 할 때 모든 테이블이 잠겨있는 것처럼 보입니다.

내가했을 때 list processlist 나는 모든 프로세스가 수면 단계에 있고 변경이 실행 중임을 알 수 있습니다.

왜 데이터베이스의 모든 테이블이 잠겨 있습니까? 시간 초과 오류가 발생하기 시작합니다.

내 마지막 구성 오류가 있습니까? 이 일이 다시 일어나지 않도록하려면 어떻게해야합니까?

+0

[이 오라클 블로그] MySQL의 데이터 정의 언어의 변화에 ​​잠금 꽤 현재의 설명이 (있다 https://blogs.oracle.com/mysqlinnodb/entry/ online_alter_table_in_mysql). 아마도 사용중인 버전 및 저장소 엔진을 지정해야합니다. – hardmath

+0

[이 비슷한 질문은 오래 전 여기에서 물었습니다] (http://stackoverflow.com/questions/463677/alter-table-without-locking-the-table), 새로운 답변을 계속해서받습니다. 가치가있는 아이디어에 대한 조사 ... – hardmath

+0

hardmath. 답변 해 주셔서 감사합니다. 나는 아직도이 문제에 대한 해결책을 보지 못했다. 그것은 MySQL이 좋은 일을하지 못하거나 뭔가입니까? – Mike

답변

0

ALTER TABLE...ADD INDEX 명령에 ALGORITHM = INPLACE 절을 추가하는 것만 큼 간단한 해결책 일 수 있습니다.

작년에 소개 된 Online ALTER TABLE in MySQL 5.6은보고 한 영향의 종류를 최소화하는 데 목적이 있습니다. DDL 명령을 사용하면 다른 프로세스에 지연과 시간 초과가 발생할 수 있습니다.

certain limitations에 영향을 미치지 않을 가능성이 있으므로 변경할 테이블의 배타적 잠금에 필요한 기간을 "시작과 끝의 짧은 기간"으로 줄일 수 있습니다.

Overview of Online DDL은 일부 이전 버전에서 사용 된 시간 소모적 인 테이블 복사없이 색인을 작성하거나 삭제하는 일부 히스토리 및 메커니즘을 스케치합니다.

ALTER TABLE에 대한 자세한 구문은 ALGORITHM = INPLACE이이 명령의 구성표에 해당합니다. 위 링크 된 개요는 a Summary Grid for Online Status of DDL Operations입니다. ALTER TABLE 구문을 사용하면 LOCK=NONE (또는 LOCK=SHARED)을 지정할 수 있지만 기본적으로 MySQL 5.6은 온라인 작업에이 모드를 사용하려고 시도합니다.

0

INFORMATION_SCHEMA 데이터베이스/스키마의 INNODB_LOCKS 테이블에서 테이블 잠금을 가져올 수 있습니다. 벌이 잠겨 있거나 잠긴 레코드가있는 테이블은 위의 테이블에서 'LOCK_TABLE'열에서 가져올 수 있습니다.

언제든지 수동으로 수행 할 필요가 없으므로 Monyog을 사용하여이 작업을 수행합니다. 그것은 뭔가가 잠겨 있는지 여부와 어떤 테이블인지를 보여줍니다.

또한, 테이블/컬럼에 인덱스를 추가 할 때, MySQL은 중복 레코드에 대한 모든 레코드를 확인하고 확인해야하며 많은 업데이트가 필요합니다. 또한

, 참조 MySQL의 문서 -> https://dev.mysql.com/doc/refman/5.5/en/innodb-create-index.html