ShellScript
MySQL
cron
crontab

ShellScriptでsqlを定期実行

やりたいこと

MySQLに何かを定期的に実行させるということをShellScriptで実現させる。

環境

  • MySQL 5.5
  • Bash 4.2.46

手順

  1. mysqlのコマンドを実行するShellScriptを書く
  2. 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