MySQLでのPIDファイルの紛失に関するエラーの解決方法

5579 ワード

今日同僚のAさんは私を見つけて、Mysql server Xの負荷が高くて、検索が遅いと言っていました.彼は自分でしばらくいたずらをした後,私たちは一緒に見た.

[root@redhat var]# uname -a
Linux xxx 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux

[root@redhat var]# mysql -u root -p -e “select version();”
+------------+
| version() |
+------------+
| 5.1.32-log |
+------------+


同僚Aの操作:Aはmysql serverを见て问题がある第1反応はmysql serverを再开することで、薄いです.ただし、エラーコマンドを使用しています.

[root@redhat var]# /var/lib/mysql/libexec/mysqld restart ----  ①
100708 14:43:53 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
100708 14:43:53 [ERROR] Aborting
100708 14:43:53 [Note] /var/lib/mysql/libexec/mysqld: Shutdown complete

問題を発見した後、彼はまた次の命令で再起動したはずだと思い出した.

[root@redhat var]# service mysql restart ----  ②
MySQL manager or server PID file could not be found! [FAILED]
Starting MySQL......

CTRL+Cキャンセル
このとき

[root@redhat var]# ps aux | grep mysql

システムはまたMysqlプロセスを開始しましたが、しばらくすると自動的に消えてしまい、ログを見ると以下のエラーが見つかります.

100708 15:26:52 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
100708 15:26:52 [ERROR] Do you already have another mysqld server running on port: 30017 ?
100708 15:26:52 [ERROR] Aborting

そして後ろで一緒に見ましょう.まずclientツールで接続してmysqlが正常であることを発見しました.Webアプリケーション接続データベースも通常はクエリーが遅いだけです.次に、コマンドの下に接続します.

[root@redhat var]# mysql -u root -p

ヒント:

Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

この時、同僚のAさんは私にサービスを再開しても大丈夫だと注意してくれた.彼は私に再起動して問題を解決することを提案しています.はい、彼の望み通りです.そこで私は先に:

[root@redhat var]# service mysql stop
MySQL is running but PID file could not be found

そしてmysql data dirの下に行ってみると、やはりpid fileはありません.このとき、私の最初の反応はプロファイルが間違っていて、正常に停止して再起動できないことです.サーバは良いので、以前バックアップした/etc/myを急いで比較しませんでした.cnf.Bakと/etc/my.cnf. まず負荷が高い原因を調べます.コマンドラインの下でmysqlに入ることができないため、clientの下で使用します

   show processlist; 
 

中にはlockedのクエリーがたくさん見えますが、待機時間が最も長いのはselectクエリーで、sending dataに表示され、残りはlockedです.sending dataのスレッドが「mysqlに割り当てられたすべてのリソース」を占有していると推測され、その後のスレッドはすべて停止し、「クエリー(スレッド)は順次実行される」ため、後のlockedのスレッドは前のsending dataのスレッドが終わるのを待っていた.sending dataのこのスレッドUはselectクエリーで、このselectは6枚のテーブルを接続し(会社の実習生が提出したクエリー)、そのうち2枚のテーブルのデータ量は10 w前後、もう1枚のdataテーブルのデータ量は1000 w前後、またsum(distinct)、groupby、order by...想像してみてください...このクエリーが実行されるまで何年何月になるか分かりません.このsending dataの遅いクエリーのprocessidは799で、立断で実行されます.

   kill 799 
 

そして運転

   show processlist; 
 

前のlockedのスレッドが順番に実行されているのが見えますが、後ろにはスレッドUに似たselectスレッドがたくさんあります.すべてkillが落ちた後、詰まった他の正常ないくつかのUpdate、select、insert操作がすぐに実行されました.その後、webアプリケーションは正常に回復し、速度が速くなります.linuxコマンドラインに戻り、

[root@redhat var]# top

<1   cpu    >

この場合、server負荷が正常に回復していることがわかります.
再起動を正常に閉じることができない場合を解決します.つまり前の同僚の誤操作による

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
 MySQL manager or server PID file could not be found! [FAILED]

に表示されます.プロファイルに認識できないパラメータオプションがあるのではないかと疑っていたのではないでしょうか.に合格

[root@redhat var]# diff /etc/my.cnf /etc/my.cnf.bak

プロファイルに問題はないことがわかりました.
私のserverのhostname、mysql pidファイルのデフォルト名はhostname.pid、/etc/myにいなければcnfで特定とpid filenameとpid file pathを指定すると、このファイルはmysqlデータと一緒になります.

[root@redhat var]# diff /etc/my.cnf /etc/my.cnf.bak

この時点で

#   mysql data dir(mysql        )
#   mysql data dir         ,   /var/lib/mysql/var/
[root@redhat var]# cd /var/lib/mysql/var/

mysqlユーザが実行するmysqlプロセスのpidを取得しhostnameにインポートする.pidファイルの中

[root@redhat var]# echo `ps aux | grep mysql | grep "user=mysql" | grep -v "grep" | awk '{print $2}'`>> redhat.pid
#     redhat.pid hostname  ,     hostname.pid

ファイルの所有者グループと所有者グループをmysql:mysqlに変更

[root@redhat var]# chown mysql:mysql redhat.pid

次に実行

[root@redhat var]# mysql -u root -p

または、次のプロンプトが表示されます.

Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

[root@redhat var]# ls /tmp | grep sock

やっぱりmysqlはいない.sockこのファイル
でもこの時点で運転

[root@redhat var]# service mysql status

表示

MySQL running (10949) [ OK ]

はい、pid fileファイルは正常に戻り、実行します.

[root@redhat var]# service mysql restart
Shutting down MySQL. [ OK ]
Starting MySQL. [ OK ]

この時点で運転します

[root@redhat var]# ls /tmp | grep sock

再起動後、/tmpの下にmysqlがあることがわかります.sockというファイル.
皆さんmysqlを検索してください.sockの用途や使用発生など.
同僚Aの操作1 pidファイルの紛失、操作2 mysqlを招く.sockファイルが失われました.vi mysqldスクリプトとserver mysqlスクリプトに興味があります.その後、service mysql status/stop/start/restartが異常になり、コマンドラインの下でmysql-u root-pがmysql異常にログインします.
That's all.