私のシステムはcentos 6.5です。
mysqlがクラッシュしていることを確認し、サービスを再起動するための単純なbashシェルを作成しました。私はそれを置き、/home/myspace/mysql.sh
chown root:root /home/myspace/mysql.sh
crontabを通して毎分実行します。
#!/bin/bash
mysql --host="localhost" --user="root" --password="password" --database="test" --execute="select id from test limit 1"
if [ $? -eq 0 ]; then echo "";
else
/usr/bin/sudo service mysql stop
pkill mysql
/usr/bin/sudo service mysql start
echo "error $(date)" >> /home/myspace/restart_log.txt
fi
今、2つの質問があります。
私のコードではなぜ動作しませんか
if ... else ...
?つまり、mysqlサーバーには問題がなく、実行されて"select id from test limit 1"
結果が得られますが、もし備えてスクリプトはまだコードを実行しますelse
。で
/var/log/sucure
表示root : sorry, you must have a tty to run sudo ; TTY=unknown ; PWD=/root ; USER=root ; COMMAND=/sbin/service mysql stop
...root : sorry, you must have a tty to run sudo ; TTY=unknown ; PWD=/root ; USER=root ; COMMAND=/sbin/service mysql start
。そしてmysqlサーバーがダウンしました。
修正する: これで@Anthonが提供したコードを試してみました。
#!/bin/bash
RESULT=`mysql --host="localhost" --user="root" --password="password" --database="test" --execute="select browser from test limit 1"`
if [ $? -eq 0 ]; then
echo "mysql select ok"
else
/usr/bin/echo "mysql select failed"
sudo service mysql stop
pkill mysql
/usr/bin/sudo service mysql start
echo "error $(date)" >> /home/myspace/restart_log.txt
fi
部分的にはうまくSSH
いきます。 (mysql select okを返します。)
しかし、うまくいきませんcronjob
(1分ごとにエラーを書き、/home/myspace/restart_log.txt
mysqlサーバーが起動しません)。
この問題の原因は何ですかPATH
?またはprivileges
?どうやって解決しますか?ありがとうございます。
解決する みんなありがとうございました。 @Sigiのアプローチは良いかもしれませんが、私の場合はうまくいきません。 @Anthonの答えは私の答えよりもよく書かれていますが、まだ動作しません。 @Emmanuel、答えが他のものよりも近いことを考えると。長い期間のテストを経て、最終的に動作するコードをあなたと共有します。
#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/local/bin
# cronjob need clear where is the path
# mysql under path /usr/local/bin
mysql --host="localhost" --user="root" --password="password" --database="test" --execute="select id from test limit 1"
if [ $? -eq 0 ]; then echo "";
# mysql run well nothing to do, make a
else
sudo /etc/init.d/mysql stop
pkill /usr/local/bin/mysql
# It should be pkill /usr/local/bin/mysql, not pkill mysql, wrong write will cause below code not working
sudo /etc/init.d/mysql start
sudo /etc/init.d/httpd restart
# Some strange behave, after mysql restart, apache will die, so should add httpd restart
echo "error $(date)" >> /home/myspace/restart_log.txt
fi
ベストアンサー1
あなたが望むのは、データベースサーバープロセスがまだ存在していることを確認することです。 MySQLはこれにコマンドを提供します。mysqladmin ping
システムcrontab(ファイルの編集/etc/crontab
)に次のように入力することをお勧めします。
* * * * * root /usr/bin/mysqladmin --host="localhost" --user="root" --password="password" ping || /usr/sbin/service mysql restart
その後、1分ごとにデータベースをpingし、応答がない場合は「再起動」メッセージを発行します。
データベースがアクティブであることを確認するために、任意のテーブルを照会して結果をテストする必要はありません。
これは何ですか?公式文書私が言うべきことは平らなサブコマンド:
平らな
サーバーが利用可能であることを確認してください。 mysqladminの戻り状態は、サーバーが稼働している場合は0、実行していない場合は1です。 Access Deniedなどのエラーが発生しても、値は0です。これは、サーバーが稼働しているが接続を拒否するという意味で、サーバーが稼働していないこととは異なります。
より良い方法は、専用のプロセスウォッチャーを使用することです(例:監視装置、突然現れるまたはシステム) 維持mysqlその過程が生きています。