>  기사  >  데이터 베이스  >  MySQL 데이터베이스의 테이블 구조를 온라인으로 수정하는 방법

MySQL 데이터베이스의 테이블 구조를 온라인으로 수정하는 방법

WBOY
WBOY앞으로
2022-09-05 17:45:282455검색

추천 학습: mysql 비디오 튜토리얼

1. MDL 메타데이터 잠금

테이블 구조를 수정하기 전에 발생할 수 있는 문제를 살펴보겠습니다.

1. MDL 잠금이란

MySQL에는 MDL 메타데이터 잠금이라는 잠금 기능이 있습니다. 테이블이 수정되면 이 잠금이 자동으로 테이블에 추가됩니다. 즉, 명시적으로 사용할 필요가 없습니다.

  • 테이블을 추가, 삭제, 수정, 쿼리할 때 MDL 읽기 잠금이 추가됩니다.
  • 테이블 구조가 수정되면 MDL 쓰기 잠금이 추가됩니다.

읽기와 읽기는 상호 배타적이지 않습니다. 쓰기, 쓰기 및 쓰기는 상호 배타적이므로

  • 스레드가 테이블에 추가, 삭제 및 변경을 수행하면 다른 스레드의 테이블 구조 수정 요청이 차단됩니다.
  • 스레드가 테이블 구조를 수정하는 경우. , 테이블 추가, 삭제, 수정 및 쿼리에 대한 다른 스레드의 요청을 차단합니다

2. MDL 잠금 문제

그리고 MDL이 잠기면 현재 요청된 트랜잭션이 제출된 후에만 해제됩니다. 긴 트랜잭션 또는 대량의 온라인 데이터가 있으며 테이블 구조를 수정할 때 기본적으로 MDL 쓰기 잠금이 잠기므로 시간이 많이 걸리고 다른 후속 요청을 차단합니다.

A(select), B(alter), C(select), D(select)...가 동일한 MySQL 테이블에 대한 요청이 차례로 대기열을 형성하는 시나리오를 상상해 보세요.
A(선택)가 테이블의 MDL 읽기 잠금을 획득하면 B가 MDL 쓰기 잠금을 추가해야 하기 때문에 B(변경)가 차단됩니다. B가 차단된 후에는 대기 대기열의 다른 요청이 차단됩니다. , 결국 Mysql의 사용 가능한 연결이 고갈되고 요청 시간 초과 및 기타 문제가 발생합니다.

2. MySQL 테이블 구조를 온라인으로 수정하는 방법

위의 MDL 잠금을 고려하여 테이블 구조를 변경하면 다른 정상적인 요청이 차단되므로 수정 작업은 피크 시간이 아닌 시간에 수행되어야 함을 알고 있습니다. 보통 오전 2~4시에 놔두세요.

구체적인 단계:

  • 테이블에 읽기-쓰기 잠금을 추가하여 현재 테이블이 읽기 전용이 되도록 합니다.
  • 원래 테이블의 물리적 구조를 복사합니다.
  • 새 테이블의 물리적 구조를 수정합니다. 새 필드 추가 또는 다른 테이블 구조 수정 포함
  • 테이블 구조를 새 테이블로 가져오기, 데이터 동기화 완료, 중간 테이블 잠그기, 원본 테이블 삭제
  • 새 테이블 이름을 원래 테이블 이름으로 바꾸기
  • 잠금 해제

위 솔루션의 문제점은 데이터의 양이 많을 경우 데이터를 가져오는 데 시간이 걸리고 이 과정에서 서비스에 액세스할 수 없다는 것입니다.

개선 사항:

데이터 구독을 통해 원래 테이블 A를 구독하고, 온라인 테이블 A의 데이터를 A_new의 새 테이블에 동기화하는 새 테이블 A_new를 만듭니다. , 이 프로세스는 계속 진행되며 이 과정에서 테이블 A가 추가, 삭제, 수정 및 확인될 수 있습니다. 두 테이블의 데이터가 완전히 동기화되는 순간은 항상 발생하며 데이터에는 차이가 없습니다. 이번에는 원본 테이블 이름 A가 수정되고 새 테이블 A_new가 원본 테이블 A로 수정됩니다. 이 작업은 짧은 작업이며 큰 영향 없이 즉시 완료될 수 있습니다.
장점과 단점:

  • 장점은 동기화 프로세스가 원본의 정상적인 비즈니스에 영향을 미치지 않는다는 것입니다.
  • 단점은 이름 변경이 완료된 후 기존 테이블이 삭제될 수 있다는 점입니다.

추천 학습: mysql 비디오 튜토리얼

위 내용은 MySQL 데이터베이스의 테이블 구조를 온라인으로 수정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제