MySQLでALTER TABLEしている時に「ERROR 1114 (HY000): The table ‘#sql-XXXX’ is full」が出た時にやったこと

開発環境のVMWareで意気揚々と5GBくらいのテーブルにALTER TABLEをしたところ、以下のエラーが出ました。

mysql> ALTER TABLE hoge ADD `foo` INTEGER AFTER bar;
ERROR 1114 (HY000): The table '#sql-XXXXXX' is full

どうやらmysqlに割り当てているドライブのディスク容量がいっぱいになったようです。

まずはディスク容量を確認

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                      7.2G  3.6G  3.3G  52% /
/dev/sda1              99M   19M   76M  20% /boot
tmpfs                 506M     0  506M   0% /dev/shm
.host:/               112G  100G   12G  90% /mnt/hgfs
/dev/mapper/VolGroup00-LogVol02
                      9.8G  9.3G     0 100% /data

MySQL用のdataフォルダが100%に。

とりあえずmysqldumpを取ります。

# mysqldump --all-databases --single-transaction --flush-logs --quick -u root -p > /tmp/`date +%Y%m%d`.sql
Enter password:
mysqldump: Couldn't execute 'show fields from `hogehoge`': Got error 28 from storage engine (1030)

どうやらディスク容量がいっぱいだとshow fieldsすらエラーになる模様。

しかたがないので消せそうなファイルを消します。

# ls -lat /data/lib/mysql
total 9517484
drwxr-xr-x 6 mysql mysql       4096 Oct 23 17:05 .
-rw-rw---- 1 mysql mysql   25153536 Oct 23 17:05 slow_query.log
-rw-rw---- 1 mysql mysql 9576960000 Oct 23 17:05 ibdata1
-rw-rw---- 1 mysql mysql   67108864 Oct 23 17:05 ib_logfile0
-rw-rw---- 1 mysql mysql   67108864 Oct 23 16:52 ib_logfile1
srwxrwxrwx 1 mysql mysql          0 Jan 18  2013 mysql.sock
drwx------ 2 mysql mysql       4096 Dec  7  2012 hoge
drwx------ 2 mysql mysql       4096 Dec  7  2012 mysql
drwx------ 2 mysql mysql       4096 Dec  7  2012 test
drwxr-xr-x 3 root  root        4096 Jan  7  2011 ..

とりあえずslow_query.logをカラにします。

# cp /dev/null  /data/lib/mysql/slow_query.log

改めてダンプを取った上でMySQLを停止します。

# service mysqld stop

ファイルを削除します。hogeデータベースのフォルダもバックアップを取った上で削除します。

# cd /var/lib/mysql
# mv ib* /tmp
# mv hoge/* /tmp/hoge
# rm -R hoge

MySQLを起動します。

# service mysqld start

ダンプからリストアします。

mysql -u root -p < /tmp/`date +%Y%m%d`.sql