Mysql

MySQL複製臨時表填充磁碟,如何刪除臨時文件?

  • January 20, 2020

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

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% /

家政服務會開始還是我應該手動清理我弄的爛攤子?最安全的方法是什麼?

首先,從 mysql 命令行工具:

kill 145904211;

應該把事情清理乾淨。如果沒有,請四處尋找以#sql.... 其中一個將是巨大的,帶有ALTER執行時間的時間戳。只需將其刪除。

為了安全起見ALTER,至少在 5.5 天內,它的工作方式如下:

  1. 像現有表一樣創建一個新的空表。
  2. 更改架構(在您的情況下添加一列)
  3. 將現有表中的所有數據複製到新表中。(慢的部分)
  4. 做一些表重命名。
  5. 放下舊桌子。

您可能正處於第 3 步的中間。

唯一有風險的時間是在第 4 步,這非常快。在此之前,舊桌子還活著。之後,新表已替換它。

引用自:https://serverfault.com/questions/999506