やりたいこと
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