MySQL の ibdata1 をシュリンク

昔 AWS で作った Webアプリサーバ。 安いプランなのでストレージが8Gしかない。
そこでMysqlのデータが肥大して、3.3G になっているのでアレコレ支障が出る。

```

-rw-rw----  1 mysql mysql 3.3G Aug  2 03:12 ibdata1
-rw-rw----  1 mysql mysql 5.0M Aug  2 03:12 ib_logfile0
-rw-rw----  1 mysql mysql 5.0M Jul 27 23:13 ib_logfile1

```
もともとこんなに容量が入っているわけはないので、単にトランザクションデータが貯まっているだけだろう。
データをバックアップ＆リストアで構築しなおしを行う。

## 環境

- Ubuntu 14.04LTS
- Apache2
- Mysql5.5.46

## 下準備

まずはMySqlにアクセスするのはApacheだけなのでそれをストップ。

```

# /etc/init.d/apache2 stop

```

## ダンプ

実は、実運用は 8G のストレージだがバックアップのためにマウントしているストレージが 30G ある。そこにバックアップ。

```

root@www:/var/lib/mysql# mysqldump -p -u root -x --all-databases >  /mnt/xvdf/mysql/backup20170802.sql
Enter password: 

```

収穫したバックアップはこのサイズ。

```

-rw-r--r--  1 root  root  164M Aug  2 03:52 backup20170802.sql

```

# ibdata1を削除

まずは mysqld をストップ
```

root@www:/var/lib/mysql# /etc/init.d/mysql stop
 * Stopping MySQL database server mysqld                                                                                                                                         [fail] 

```
あれ。

```

root@www:/var/lib/mysql# ps -auxww | grep mysql
root     17399  0.0  0.0   4440   748 pts/0    S    03:15   0:00 /bin/sh /usr/bin/mysqld_safe
mysql    17746  3.0  9.0 812240 186408 pts/0   Sl   03:15   1:09 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root     18029  0.0  0.0  10460   932 pts/0    S+   03:53   0:00 grep --color=auto mysql
```

プロセスも残っている。root権限でシャットダウンできないようになっているのだろう。
以下の方法で停止させる。

```

root@www:/var/lib/mysql# mysqladmin -u root -p shutdown
root@www:/var/lib/mysql# ps -auxww | grep mysql
root     18039  0.0  0.0  10460   928 pts/0    S+   03:54   0:00 grep --color=auto mysql

```
うむ、停止しましたね。
ibdata1と、logfileも削除。

```

root@www:/var/lib/mysql# rm ibdata1 ib_logfile?
```

# 復旧

Mysqlを起動してibdata1を作りなおす。

```

root@www:/var/lib/mysql# /etc/init.d/mysql start
 * Starting MySQL database server mysqld                                                                                                                                         [ OK ] 
 * Checking for tables which need an upgrade, are corrupt or were 
not closed cleanly.
root@www:/var/lib/mysql# ERROR 1045 (28000): Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)

```

ちょっと時間がかかります・・・って30分ぐらい待っててあれーと思ってエンター押したら終わってた。実際には3分ぐらいだったらしい。

```

-rw-rw----  1 mysql mysql  18M Aug  2 03:55 ibdata1
-rw-rw----  1 mysql mysql 5.0M Aug  2 03:55 ib_logfile0
-rw-rw----  1 mysql mysql 5.0M Aug  2 03:55 ib_logfile1

```
空っぽの状態で、先ほどのダンプを入れ込みます。

```

root@www:/var/lib/mysql# mysql -u root -p < /mnt/xvdf/mysql/backup20170802.sql 

```
無事、ファイルサイズも減りました。

```

-rw-rw----  1 mysql mysql 186M Aug  2 04:23 ibdata1
-rw-rw----  1 mysql mysql 5.0M Aug  2 04:23 ib_logfile0
-rw-rw----  1 mysql mysql 5.0M Aug  2 04:23 ib_logfile1

```
webサーバを起動しておしまい。

```

mysql# /etc/init.d/apache2 start
 * Starting web server apache2                                                                                                                                                          ```