シェルでMYSQLを実行したい

このQ&Aのポイント
  • CRONを使用して定期的にMYSQLのコマンドを実行する方法を質問します。
  • シェルスクリプトの記述方法がわからず、MYSQLの接続、データベースの選択、テーブルのカウントとフィールドの比較、更新をする方法を教えてください。
  • CRONのcorontabの設定についても確認したいです。OSはLinux RedHatES3.0です。
回答を見る
  • ベストアンサー

シェルでMYSQLを実行したい

お世話になっております。 CRONを使用して定期的にMYSQLのコマンドを実行したいと思っています。 シェルスクリプトの記述方法がどうしても分からず、質問させて頂きます。 シェル(test.sh)でやりたいことは、 1.MYSQLに接続する。 2.データベースAを選択する。 3.テーブル【aaa】の総数をカウントし、変数に入れる。   → select count(*) from aaa; 4.テーブル【aaa】内のフィールド「date」と今日の日付を比較し、過ぎていたらフィールド「flg」に1を立てる。   → select to_days(now()) - to_days(date) from aaa where id=i;   → update aaa set flg=1 where id=1; 5.iが総数を上回るまで繰り返す。 以上の処理を、毎日0:05に行いたいのです。 CRONのcorontabの設定は、 5 0 * * * root /usr/local/bin/test.sh で合っていますでしょうか。 OSはLinux RedHatES3.0です。 今までLinuxに触れたこともなく、質問文もおかしいかもしれません。 お手数ですが、どうぞよろしくお願いいたします。

noname#99462
noname#99462

質問者が選んだベストアンサー

  • ベストアンサー
noname#24096
noname#24096
回答No.1

MySQLが5.0以降ならストアドプロシジャが使えるはずなので SQLだけのファイルを作って、リダイレクトさせて mysql -D データベース < test.sql のようにすればできるはずです。 http://www.atmarkit.co.jp/flinux/special/mysql5/mysql5d.html それ以前のバージョンの場合は、 シェルから直接MySQLにはアクセスできないので PHPなどMySQLにアクセスできる言語で作るしかないのではないでしょうか。 >5 0 * * * root /usr/local/bin/test.sh rootはいらないですね。 root権限で実行したいのであれば、rootでcrontab -eを使って編集すればいいはずです。

noname#99462
質問者

お礼

早速のご回答ありがとうございます。 MySQLのVerは3.23.58でした。 なので、PHPで別ファイルを作成してアクセスしようと思います。 crontabについてもご助言ありがとうございました。 大変助かりました!

関連するQ&A

  • mysql_num_rowを繰り返したい

    ラジオボタン選択肢アンケートのデータをMySQLのテーブルに入れて、 mysql_num_row()で各選択肢の件数を抽出したいのですが。 選択肢は1~5の数値(int型)でanテーブルに入っています。 for ($i = 1; $ <= 5; $++) { $rst = mysql_query("SELECT * FROM an WHERE field=$i", $con); $kotae.$i = mysql_num_row($rst); } このように書くと 1の選択肢の数しか返してきません。しかも、件数が間違って返ってくる。  文法が間違っているからだと思うのですが。上記のようなことをやりたいのです。  forを使わないでやると、 $rst = mysql_query("SELECT * FROM an WHERE field=1",$con); $kotae1 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=2",$con); $kotae2 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=3",$con); $kotae3 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=4",$con); $kotae4 = mysql_num_rows($rst); $rst = mysql_query("SELECT * FROM an WHERE field=5",$con); $kotae5 = mysql_num_rows($rst); です。  forを使って楽にやりたい場合はどうすればよいでしょうか 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • SQLで他のテーブルに無いIDの抽出

    MySQLを使っています。 下記は、 1.テーブルaaaには、存在するidのものが、 2.テーブルbbbには、存在しない、 3.テーブルaaaのレコードを抽出したいものです。 "SELECT DISTINCT aaa.*" + " FROM aaa" + " WHERE (aaa.flag = false)" + " AND NOT EXISTS (SELECT * FROM bbb" + " WHERE (aaa.id = bbb.id) AND (bbb.flag = false))" ですが、実行すると、下記エラーがでます。 SQLException:Base table or view not found, message from server: \"Unknown table 'bbb' in where clause" どうすればよいのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLのデータをシェルの変数に入れる方法

    お世話になります。 ユーザ名とパスワードを入力させるフォームをPHPで作成し、 MySQLのSpoolに書き込むものを作りました。 やりたいことはシェルスクリプト(bash)を用いて、Spoolの データをシェルの変数に入れ、その変数を基にLinuxのユーザを 作成しようと思っています。 以下シェルスクリプトでMySQLのデータを表示することは出来たのですが、 echo 'use test;select * from spool'|mysql -u root -ppassword 表示したデータを変数に入れることが出来ません。 $test='use test;select * from spool'|mysql -u root -ppassword echo $test どのようにしたら上手くできるでしょうか? 皆様のテクニックを御教授下さい。 環境 OS-CentOS4.4 MySQL-4.1.20

  • 複数のテーブルから同じ条件で検索したい。

    例えば、テーブルがA,B,C,Dとあって、レイアウトはそれぞれ違います。 ですが、全てのテーブルに共通の項目もあります。 共通項目名:FLG このような前提で、 A,B,C,Dのデータを同じ検索条件で全ての内容を表示させたいのですができませんか? ベタに書くと select * from A where FLG='2'; select * from B where FLG='2'; select * from C where FLG='2'; select * from D where FLG='2'; と言う感じで結果を表示させたいのです。 実際にはテーブル名がものすごい数なので、ベタに書きたくないので、この部分をtab テーブルのtnameとかを使っていっぺんに検索結果が出せればありがたいのですけが・・・ こういうのはシェルとか使わないとだめですかね?(DBはオラクルです。)

  • 条件式にtrimを入れたい

    Mysqlでselectする時に、条件で指定した値とDB内のデータをtrim(空白除去)した値が一致したレコードを抽出されるようにしたいのですが・・・ 例えば、 あるテーブルの項目aaaの値が'あ いうえお'だとします。 条件式を where aaa='あいうえお' とした場合でもヒットさせたいのですが、どうすれば良いのでしょうか? aaaの値の空白を除去したものと一致すればいい、という事で select aaa from テーブル where trim(aaa)='あいうえお' ↑このようなイメージなのですが・・・ どなたか簡単なやり方を知っていれば教えて頂けませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • シェルの引数を、実行するパラメータに指定するには?

    シェル初心者です。 シェルの実行パラメータを、その中で実行する処理のパラメータに再び指定したいのですが可能でしょうか。 ただし、パラメータの数は可変です。 環境はSolarisです。 aaa.sh aaa bbb ccc aaa.shの中 bbbコマンド aaa bbb ccc ということを行いたいです。 パラメータ数が固定であれば問題なさそうですが 可変の場合、どのような記述をすればよいでしょうか?

  • select されたレコードの操作

    以下のようなuser_idとuser_pwのtableがあります。 |id(ai)|user_id|user_pw|flg| |1|AAA|111|0| |2|BBB|222|0| select id from table where user_id = AAA をされると 1 を返し、 update table set flg = 1 where id = 1 かまたは update table set flg = 1 where user_id = AAA を発行したいと思っています。 ただ、sql 発行元から2個のsqlを出せない事情があり、DB側で対応しなければなりません。 トリガはselectでは使えませんよね?  最悪、query_logを監視しながらselectが来たら自分でupdateを発行するスクリプト しかないのかと考えています。 アドバイスお願いします。

  • cronでシェルスクリプトが実行されない

    Linuxでファイルのバックアップを取るため backup.shというシェルスクリプトを組み、コマンドから実行する場合問題ないことを 確認しています。ところがcronに設定し自動実行すると内容が実行されておりません。 /var/log/cronを確認したところ時間通り実行されているというログは残っています。 /var/spool/cron/にrootというファイルを作成し 00 23 * * * /BACKUP/backup.shを実行させたいのです。 なぜ、手動の場合は問題がないのにcronで設定すると問題が生じるのでしょう? もし、お分かりの方は教えてください。 OSはRed Hat Linux release 8.0 (Psyche)です。

  • MySQLで日本語検索

    MySQL初心者のものです。 今PHPとMySQLを利用して検索システムを作っています。 しかし日本語検索がどうしてもうまくいきません。 一応「教えてgoo」でも探してみたのですが、解決しませんでした。 MySQLで、 テーブル名 table フィールド名 field とすると、 select * from table where field like '%キーワード%'; のように検索してみたのですが、思うような結果が返ってきません。 ネットで検索すると「senna」をインストールと書かれていましたが、 そういったものをインストールしなければMySQLで日本語検索は出来ないものなのでしょうか? ちなみに MySQL5.0 PHP5.2.1 を利用しています。

  • テーブル上に存在しないデータの一覧を取りたい。

    mysql+phpで開発を行っています。 テーブル id 101 102 104 106 109 110 の様にデータが入っているテーブルaaaがあります。 プログラムで取得したid一覧が上記テーブルにレコードがあるのか確認するSQLは 例)select id from aaa where id in (101,102) で取得できるということは分かっています。 ここで select id from aaa where id in (102,103) とやると102の1件が取得できます。 今回知りたいことは 逆に取得できなかった103という値を取得する方法はないのかという事です。 select id from aaa where id=102; select id from aaa where id=103; 2回SQLを実行して値が戻ってこないSQL=テーブルにそのレコードが無いというプログラムを書けばいい事は分かっています。 しかし、処理が少なくとも数千回発生してしまう予定ですのでできれば別の方法がいいと思っています。 また、in区で使っている一覧はテーブルには入っておらず、また、こちらも数千個あるので、一時テーブルに入れるといってもかなりの時間がかかってしまうと思います。 何か一発で取得できるいい方法などありますでしょうか? ちなみにaaaテーブルは5万件ほどなので全件php側でメモリに展開してサーチも避けたいです よろしくお願いいたします。

専門家に質問してみよう