たまたま職場でsyslogサーバが機能していないのを見つけました。
mysqlとか触ったことなかったので、その時の対応についてメモ。
状態の確認
ps -ef | grep mysql
-> mysqldが起動しているか
cat /etc/mysql/my.cnf
-> datadirやsoketのディレクトリを確認
df
->ディスクの空き容量が0になっていないか。
自分がみたときはディスクの空き容量が0になっており、/var/run/配下に作成されるはずのsocketファイルがなく、mysqldプロセスが落ちてました。
DBのファイルサイズは300GBを超えておりました。(明らかに大きすぎる)
mysqldの起動
無理やり容量を空けて復活させる。
/var/log/配下などの過去の圧縮ファイルを削除し、ほんの少しだけ容量を確保。
/etc/init.d/mysql start
でプロセスを起動。
(環境によって違うと思います)
dumpの取得
dumpをとりたいけど、置き場がないので、
別のサーバの空きディスクにフルダンプを置くことにしました。
①待受ポートを作る
保存側: nc -l 9998 | gzip -d > ibdata1_20180628.txt
9998番が待受として当たります。
②mysqlのdumpをネットワーク経由で送信する
DB側: /usr/bin/mysqldump -u root --password=XXXXXX --all-databases --flush-logs | gzip -c | nc 【保存側IPアドレス】 9998
★時間かかるので&オプションをつけるのが良いと思います。
★自分はtmuxを使用しました。
50GB程度のdumpファイルができました。
肥大化したDBファイル(ibdata1)を削除
まずmysqlの停止
/etc/init.d/mysql stop
rm -f ib*
90%以上空き容量ができました。
dumpファイルを戻す
scpを使い、DBサーバに置きました。
ncコマンドでやり方がイメージできなかったので…。
リストア
mysqlの起動
/etc/init.d/mysql start
mysql -u root --password=XXXXXX < ibdata1_20180628.txt
★時間かかるので&オプションをつけるのが良いと思います。
2億件、50GBくらいのDBで4時間くらいかかりました。
なんとかなったみたいです。
以下のサイトを参考にさせていただきました。
参考:最速を究める! 2つのサーバ間で特盛りデータを30倍速で転送する方法
参考:MySQL ibdataのデータサイズが肥大化した場合の対処方法。