MySQL 복사 임시 테이블이 디스크로 채워져 있습니다. 임시 파일을 어떻게 제거합니까?

MySQL 복사 임시 테이블이 디스크로 채워져 있습니다. 임시 파일을 어떻게 제거합니까?

가장 안전한 청소 방법은 무엇입니까?

복제가 없는 Debian 8의 MySQL 서버 5.5.62-0.

실수를 해서 26GB 테이블에 새 열을 만들었습니다. SHOW PROCESSLISTMySQL이 100% CPU로 데이터를 tmp 테이블에 복사하고 있음을 보여주었습니다.

+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| Id        | User | Host      | db     | Command | Time | State             | Info             |
+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| 145904211 | root | localhost | huge   | Query   |  160 | copy to tmp table | ALTER TABLE ...  |
| 145905739 | root | localhost | NULL   | Query   |    0 | NULL              | show processlist |
+-----------+------+-----------+--------+---------+------+-------------------+------------------+

몇 분 후 기본 파티션이 가득 차고 CPU가 0으로 떨어졌습니다. systemctl stop mysql임시 파일을 정리할 수 있기를 바랐습니다. 서비스도 다시 시작되지 않습니다.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        79G   75G 1000K 100% /

$ sudo systemctl start mysql
Job for mysql.service failed. See 'systemctl status mysql.service' and 'journalctl -xn' for details.

VPS를 종료하고 디스크를 확장했습니다. 서버가 정상적으로 다시 시작되었고 MySQL 프로세스를 시작하고 연결할 수 있었습니다. 모든 것이 작동하는 것 같습니다.

그러나 20분 전 사건 이후 디스크 사용량은 줄어들지 않았습니다.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       158G   75G   75G  50% /

하우스키핑이 시작되나요, 아니면 제가 만든 엉망진창을 수동으로 정리해야 하나요? 가장 안전한 방법은 무엇입니까?

답변1

먼저 mysql 명령줄 도구에서 다음을 수행합니다.

kill 145904211;

저것~해야 한다물건을 청소하십시오. 그렇지 않은 경우 다음과 같이 시작하는 파일을 찾아보세요 #sql.... 그 중 하나는 실행 당시의 타임스탬프와 함께 거대할 것입니다 ALTER. 간단히 삭제하세요.

안전을 위해 ALTER적어도 5.5일 안에 다음과 같이 작동했습니다.

  1. 기존 테이블과 같은 비어 있는 새 테이블을 만듭니다.
  2. 스키마 변경(귀하의 경우 열 추가)
  3. 기존 테이블의 모든 데이터를 새 테이블에 복사합니다. (느린 부분)
  4. 테이블 이름을 바꾸세요.
  5. 이전 테이블을 삭제합니다.

아마도 3단계 중간에 중단되었을 것입니다.

유일하게 위험한 시간은 매우 빠른 4단계입니다. 그 전에는 오래된 테이블이 아직 살아 있고 건강합니다. 그 후 새 테이블이 교체되었습니다.

관련 정보