やりたいこと
MySQLに何かを定期的に実行させるということをShellScriptで実現させる。
環境
- MySQL 5.5
- Bash 4.2.46
手順
- mysqlのコマンドを実行するShellScriptを書く
- crontabに定期実行のタスクを登録する
1. mysqlのコマンドを実行するShellScriptを書く
mysql.sh的なファイルを作成する。
作成したら、中に以下を記述していく
# !/bin/bash
# ------------------------------------------------
# date variables
# ------------------------------------------------
YEAR=$(date +%Y)
MONTH=$(date +%-m)
DAY=$(date +%-d)
UNIX_TIME=$(date +%s)
# ------------------------------------------------
# mysql variables
# ------------------------------------------------
MYSQL_USER='hoge'
MYSQL_PASSWORD='hoge'
MYSQL_HOST='localhost'
MYSQL_DATABASE='hoge_db'
# 以下に実行したいsql文を書く
MYSQL_SQL="UPDATE articles SET update_y = $YEAR, update_m = $MONTH, update_d = $DAY WHERE publish_status = \"public\";"
# ------------------------------------------------
# do
# ------------------------------------------------
eval "mysqldump -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_DATABASE --password='$MYSQL_PASSWORD' > ~/hoge-backup.sql"
eval "mysql -h $MYSQL_HOST -u $MYSQL_USER -p $MYSQL_DATABASE --password='$MYSQL_PASSWORD' -e '$MYSQL_SQL'"
注意が必要な部分
- ShellScriptからMySQLのクライアントを操作する場合、パスワードの入力を手動でしないように--password='パスワード'としなければならない。
- 
MYSQL_SQLのSQL文の最後の方でpublic_status(公開設定のフラグ)をbool型で定義していないのはわざとで、文字列の場合上記のようにダブルクウォーテーションをエスケープする必要がある
- シングルクウォーテーションとダブルクウォーテーションで変数の宣言がふた通りあるのは、変数内でさらに変数を呼び出したい場合や式を展開したい場合は、後者を使い、それ以外は前者ということ。
2. crontabに定期実行のタスクを登録する
まずはcronが使えるかどうか確認していきます。
$ sudo service crond status
上記でrunningと返って来ればいいと思います。
様々なサイトでcrontab -eでエディタを開いてタスクを登録する方法が記載ありますが、crontab -rでタスクが全て消えてしまうので、タスクをファイルに記述して、登録をするという方法をで行いたいと思います。
cron.scheduleファイルを作成
ファイル名はなんでもいいのですが、cron.scheduleとしておきましょう。
自分はvimを使って編集するので、vi cron.scheduleとしてエディタを開きます。
SHELL=/bin/bash
MAILTO=""
0 9 * * 1 sh mysql.sh
シェルをbashと指定し、cronが実行された際にメールの送信は不要なので、MAILTO=""としています。
0 9 * * 1 sh mysql.shの部分が定期的に実行したいタスクです。
文法は* * * * * 実行したいコマンドとなります。
上記の例ですと、毎週月曜日の午前9時00分にmysql.shのシェルスクリプトを実行するというようになっています。
実行タイミングに関しては、こちらの記事が大変参考になります。
crontabに登録
// 先ほど作ったcron.scheduleを登録
$ crontab cron.schedule
// 以下で登録出来ているか確認出来る
$ crontab -l
// 登録しているタスクを削除したい場合は以下
$ crontab -r
理解が怪しい部分が多々あるので、ツッコミお待ちしておりますm(_ _)m