親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

cronで定期的にMySQLを起動


定期的にMySQLを起動させる背景

需要は少ないかもしれませんが、記事を上げておきます。
cronで定期的にMySQLを起動させた背景としては、Dos攻撃によるものが理由です。
最近海外からアタックを受けてしまい、データベースを落とされることがたまにありまして...
アタック元を調べてIPの制御はしているのですが、また別なIPからアタックされてしまうことがあり、イタチごっこになってしまって。
根本解決では決してないのですが、クライアントのサーバだと予算も限られているので安易にメモリを上げることもできないため、既存の環境のままでデータベースを落とされてしまってもすぐに復旧できるようにこの対応をしました。

対応方法

※私が対応したサーバはCentOS 6.8でした。

まずはMySQLが起動しているのか確認し、起動していなければ起動させるシェルファイルを作成します。

mkdir /var/www/cron
cd /var/www/cron
vim database_cron.sh
pcnt=`ps -ef | grep mysqld | grep -v grep | wc -l`
if [ $pcnt = 0 ]; then
    /sbin/service mysqld start
    echo `date` 'start' >> /var/log/database_cronlog
fi

ログの書き方などは自由ですが、今回は上記の通り、起動がされた時点で「/var/log/database_cronlog」に現在事項と「start」という文字が表示されるようになっております。

なので、ログファイルを作成しましょう。

touch /var/log/database_cronlog

この時点で一度MySQLを停止させて動作確認をしてみてください。

sh database_cron.sh

MySQLが起動し、ログも書き出されていれば動作はOKです。

cronの設定

最後にcronの設定です。
何分おきに起動させるか、といったところですが、今回は5分おきに設定するようにしています。

まずはcronが起動しているか確認しましょう。

service crond status

ここで実行中となっていなければcronを起動させてください。

service crond start

そしてcronの登録です。

crontab -e

以下の記述をして保存してください。

*/5 * * * * /bin/sh /var/www/cron/database_cron.sh

最後にcronが反映されていることを確認しましょう。

crontab -l

以上です。

まとめ

簡単に設定できますよね。
もちろんこれは根本解決ではないです。
本来であれば攻撃を仕掛けてくるIPアドレスを特定してブロックをしたり、一定時間あたりのアクセスが異常に多い場合にアクセス元をブロックしたりなど、対処法はあります。

この対応は時間がない場合など一時的なものと思ってください。

それにしてもDos攻撃仕掛けてくる奴はほんとにムカつきますね。
こんなに人に迷惑をかけてるんだから重罪にすればいいのに。


基礎からのMySQL 第3版 (基礎からシリーズ)

基礎からのMySQL 第3版 (基礎からシリーズ)

3ステップでしっかり学ぶ MySQL入門 [改訂2版]

3ステップでしっかり学ぶ MySQL入門 [改訂2版]

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE)

詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE)