MySQL複製臨時表已滿磁碟,如何刪除臨時檔案?

MySQL複製臨時表已滿磁碟,如何刪除臨時檔案?

最安全的清理方法是什麼?

Debian 8 上的 MySQL 伺服器 5.5.62-0,無複製。

我犯了一個錯誤,在 26GB 表上建立了一個新列。SHOW PROCESSLIST顯示 MySQL 正在以 100% CPU 的速度將資料複製到臨時表。

+-----------+------+-----------+--------+---------+------+-------------------+------------------+
| 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 步,時間非常快。在此之前,舊桌子還活著並且完好無損。之後,新表取代了它。

相關內容