11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ShellScriptでsqlを定期実行

Last updated at Posted at 2018-03-13

やりたいこと

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

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?