추천 학습: mysql 비디오 튜토리얼
테이블 구조를 수정하기 전에 발생할 수 있는 문제를 살펴보겠습니다.
MySQL에는 MDL 메타데이터 잠금이라는 잠금 기능이 있습니다. 테이블이 수정되면 이 잠금이 자동으로 테이블에 추가됩니다. 즉, 명시적으로 사용할 필요가 없습니다.
읽기와 읽기는 상호 배타적이지 않습니다. 쓰기, 쓰기 및 쓰기는 상호 배타적이므로
그리고 MDL이 잠기면 현재 요청된 트랜잭션이 제출된 후에만 해제됩니다. 긴 트랜잭션 또는 대량의 온라인 데이터가 있으며 테이블 구조를 수정할 때 기본적으로 MDL 쓰기 잠금이 잠기므로 시간이 많이 걸리고 다른 후속 요청을 차단합니다.
A(select), B(alter), C(select), D(select)...가 동일한 MySQL 테이블에 대한 요청이 차례로 대기열을 형성하는 시나리오를 상상해 보세요.
A(선택)가 테이블의 MDL 읽기 잠금을 획득하면 B가 MDL 쓰기 잠금을 추가해야 하기 때문에 B(변경)가 차단됩니다. B가 차단된 후에는 대기 대기열의 다른 요청이 차단됩니다. , 결국 Mysql의 사용 가능한 연결이 고갈되고 요청 시간 초과 및 기타 문제가 발생합니다.
위의 MDL 잠금을 고려하여 테이블 구조를 변경하면 다른 정상적인 요청이 차단되므로 수정 작업은 피크 시간이 아닌 시간에 수행되어야 함을 알고 있습니다. 보통 오전 2~4시에 놔두세요.
구체적인 단계:
위 솔루션의 문제점은 데이터의 양이 많을 경우 데이터를 가져오는 데 시간이 걸리고 이 과정에서 서비스에 액세스할 수 없다는 것입니다.
개선 사항:
데이터 구독을 통해 원래 테이블 A를 구독하고, 온라인 테이블 A의 데이터를 A_new의 새 테이블에 동기화하는 새 테이블 A_new를 만듭니다. , 이 프로세스는 계속 진행되며 이 과정에서 테이블 A가 추가, 삭제, 수정 및 확인될 수 있습니다. 두 테이블의 데이터가 완전히 동기화되는 순간은 항상 발생하며 데이터에는 차이가 없습니다. 이번에는 원본 테이블 이름 A가 수정되고 새 테이블 A_new가 원본 테이블 A로 수정됩니다. 이 작업은 짧은 작업이며 큰 영향 없이 즉시 완료될 수 있습니다.
장점과 단점:
추천 학습: mysql 비디오 튜토리얼
위 내용은 MySQL 데이터베이스의 테이블 구조를 온라인으로 수정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!