MySQL Online DDL로 인한 글로벌 잠금 테이블 사례 분석

3464 단어
MySQL Online DDL로 인한 글로벌 잠금 테이블 사례 분석
나한테 무슨 문제가 생겼어?
온라인에서 어떤 테이블에 새로운 인덱스SQL을 실행한 후에 전체 데이터 CPU가 100%까지 치솟았고 연결 수가 극한까지 폭증하여 모든 데이터베이스에 접근하는 응용 프로그램이 무너졌다.
SQL은 다음과 같습니다.
ALTER TABLE `book` 
ADD INDEX `idx_sub_title` (`sub_title` ASC);

뭐가 보여요?
'10063293', 'root', '10.0.0.1:35252', 'novel', 'Query', '50', 'Waiting for table metadata lock', 'ALTER TABLE `lemon_novel`.`book` 
ADD INDEX `idx_sub_title` (`sub_title` ASC)' '10094494', 'root', '172.16.2.112:42808', 'novel', 'Query', '31', 'Waiting for table metadata lock', 'SELECT
book_trend.book_id AS book_id,

이상하게도 양쪽에서 "Waiting for table metadata lock"을 기다리고 있습니다.
'Waiting for table metadata lock'이 무엇인지 백핸드로 찾아보세요.
  • MySQL에 Waiting for table metadata lock이 나타나는 이유 및 해결 방법
  • mysql: Waiting for table metadata lock
  • How do I find which transaction is causing a “Waiting for table metadata lock” state?
  • MySQL:8.11.4 Metadata Locking
  • MySQL:14.13.1 Online DDL Operations

  • 초보적인 결론들
    다음과 같은 몇 가지 결론을 살펴봅니다.
  • MySQL 5.6 이후 버전은 온라인 DDL을 지원하고 index/삭제 index 같은 것은 직접 InPlace 조작을 할 수 있으며 리build 전체 표가 필요하지 않으며 이론적으로 효과가 빠르다. 상세한 자료는 온라인 DDL Operations
  • 참조
  • DDL add index 작업회 lock table metadata, 이 작업은 저희 서비스를 사용할 수 없는 원인
  • lock tabel matadata가 MySQL autocommit와 관련이 있다고 의심한 적이 있지만 실천해 보니 관련이 없는 것 같다.

  • 나중에 아리운 위에서 그들이 특정한 유사한 답변을 쓴 것을 보았다.
  • MDL 잠금으로 인해 데이터베이스를 조작할 수 없는 문제 해결
  • MySQL 온라인 DDL 용 RDS for 사용
  • 아리운은 주로 이렇게 조작하자고 제안했다.
  • MDL 잠금 해제를 기다리는 세션이 아니라 이 테이블을 계속 사용하고 있는 세션을 찾아야 합니다. 구분에 주의하십시오.State 열의 상태와 Info 열의 명령 내용에 따라 분석 판단할 수 있습니다.
  • 당신은 다음 명령으로 장시간 동안 완성하지 못한 업무를 조회할 수 있습니다. 만약에 막힌 문장을 초래한 사용자가 현재 사용자와 다르면 막힌 문장을 초래한 사용자 로그인을 사용하여 세션을 종료하십시오.
  • select concat('kill ',i.trx_mysql_thread_id,';') from information_schema.innodb_trx i,
      (select 
             id, time
         from
             information_schema.processlist
         where
             time = (select 
                     max(time)
                 from
                     information_schema.processlist
                 where
                     state = 'Waiting for table metadata lock'
                         and substring(info, 1, 5) in ('alter' , 'optim', 'repai', 'lock ', 'drop ', 'creat'))) p
      where timestampdiff(second, i.trx_started, now()) > p.time
      and i.trx_mysql_thread_id  not in (connection_id(),p.id);
    
    

    그러나 내 장면에서 위의 SQL은 프로세스 출력이 없었다.
    교착 상태에 빠지다.
    그러나 위에서 몇 가지 아이디어를 주었습니다. 현재 우리는 주로 테이블 메타데이터 lock을 점용하고 있기 때문에 현재의 모든 것이 실행되지 않았습니다.
    show full processlist;
    한 번 보면 아무런 소용이 없다. 그 두 개의 이상한 웨이트 록을 처리하면 다른 것은 모두 정상이다.
    그럼, 지금 누가 자물쇠를 점용하고 있는지 봅시다.
    어떻게 보지?
    select * from information_schema.innodb_trx;
    

    신기해, 자물쇠를 차지하는 게 두 개나 있어.
    그럼 킬이야. 봐봐.
    어, 해결됐어.
    최종 결론
    어떤 이상한 프로그램이 검색을 하거나 이상한 조작을 하였는데, lock은 테이블 메타데이터를 켰고, 이후 연결이 풀리지 않아 위와 같은 여러 가지 문제를 초래하였다.
    지금의 문제가 왔다. 도대체 어느 프로그램이나 어느 코드가 일으킨 것일까?
    미안하지만, 나도 아직 몰라..
    이론적으로는 찾아볼 수 있지만 지난번에 찾아갔을 때 데이터베이스에 표시된host가 기계에 대응하는 포트에 이미 물건이 없어서 대조할 수 없는 것을 발견했다.
    마지막 건의
  • online DDL 전에 현재 데이터베이스에 유사한 lock이 존재하는지 확인하는 것이 좋습니다
  • 가장 좋은 방안은 주종 전환을 하는 것이다
  • 전문이 끝나다.

    좋은 웹페이지 즐겨찾기