Mysql

MySQL 使用了執行 ALTER 的所有驅動器空間,現在無法啟動

  • July 15, 2016

我試圖在不注意大小的情況下更改表,MySQL 佔用了驅動器上的所有可用空間。我刪除了大約一百萬條舊記錄,但空間仍在使用中。

Google搜尋建議重新啟動 MySQL 伺服器會有所幫助,但伺服器不會啟動: [FAIL] /etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full! ... failed!

所以現在我有點卡住了。我的數據庫只有一個(非常大)表:

# ls -lh
total 18G
-rw-r--r-- 1 mysql mysql    0 Sep 25  2014 debian-5.5.flag
-rw-rw---- 1 mysql mysql  18G Jul 13 15:17 ibdata1
-rw-rw---- 1 mysql mysql 5.0M Jul 13 15:17 ib_logfile0
-rw-rw---- 1 mysql mysql 5.0M Jul 13 15:15 ib_logfile1
drwx------ 2 mysql mysql 4.0K Jul 13 11:44 log
drwx------ 2 mysql mysql 4.0K Sep 25  2014 mysql
-rw------- 1 mysql mysql    6 Sep 25  2014 mysql_upgrade_info
drwx------ 2 mysql mysql 4.0K Sep 25  2014 performance_schema
drwx------ 2 mysql mysql 4.0K Dec  4  2013 test

所以,具體來說,我的問題是:當我試圖改變一個大表時,如何釋放 MySQL 使用的驅動器空間?

$$ edit $$我應該提一下,我在任何其他驅動器上都沒有空間,而且我也無法更改驅動器的大小:-( $$ edit2 $$回應評論:

mysql> OPTIMIZE TABLE `emails`;
+------------+----------+----------+-------------------------------------------------------------------+
| Table      | Op       | Msg_type | Msg_text                                                          |
+------------+----------+----------+-------------------------------------------------------------------+
| log.emails | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| log.emails | optimize | error    | The table '#sql-8aa_25' is full                                   |
| log.emails | optimize | status   | Operation failed                                                  |
+------------+----------+----------+-------------------------------------------------------------------+
3 rows in set, 1 warning (1 hour 12 min 10.62 sec)

# df -h
Filesystem      Size  Used Avail Use% Mounted on
rootfs           20G   19G     0 100% /
udev             10M     0   10M   0% /dev
tmpfs           100M  128K  100M   1% /run
/dev/xvda1       20G   19G     0 100% /
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           200M     0  200M   0% /run/shm

找到文件#sql-8aa_25並將其刪除。它可能在數據庫所在的同一目錄中。

如果您執行了kill -9,則 mysqld 沒有機會刪除 tmp 文件。

我會做兩件事之一:

使用 zip 驅動器或類似驅動器將數據庫複製到另一個系統。由於磁碟如此便宜——歐洲 12 歐元的 32GB USB 記憶棒,你不能使用其中一個嗎?然後,將你的 datadir 複製到它上面,在另一台機器上恢復它。如今,即使是最弱的筆記型電腦(或像樣的平板電腦)也應該能夠應付 32GB 的 db。您可能希望在複製之前先對其進行 gzip 壓縮。

如果做不到這一點,您可以安裝更多 RAM 並設置記憶體文件系統,如這兩篇文章(第一篇,第二篇)中很好解釋的那樣- Google搜尋“ linux put a partition in ram ”上的其他連結。

此外,在恢復我的數據後,我會將那台機器託付給天空中的偉大伺服器機房。它顯然已經到了使用壽命的盡頭(儘管看到這個:-))。

最後,請記住,如果您沒有保留一些磁碟空間,Unix 往往會進行大量記憶體和交換,並且會變得非常暴躁。因此,請設置某種監控,當磁碟空間使用率超過 75% 時會向您發出警告。

ps出於好奇,這台機器是什麼,你執行的是什麼作業系統?

引用自:https://dba.stackexchange.com/questions/143761