가장 안전한 청소 방법은 무엇입니까?
복제가 없는 Debian 8의 MySQL 서버 5.5.62-0.
실수를 해서 26GB 테이블에 새 열을 만들었습니다. SHOW PROCESSLIST
MySQL이 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일 안에 다음과 같이 작동했습니다.
- 기존 테이블과 같은 비어 있는 새 테이블을 만듭니다.
- 스키마 변경(귀하의 경우 열 추가)
- 기존 테이블의 모든 데이터를 새 테이블에 복사합니다. (느린 부분)
- 테이블 이름을 바꾸세요.
- 이전 테이블을 삭제합니다.
아마도 3단계 중간에 중단되었을 것입니다.
유일하게 위험한 시간은 매우 빠른 4단계입니다. 그 전에는 오래된 테이블이 아직 살아 있고 건강합니다. 그 후 새 테이블이 교체되었습니다.