Neo Inspiration

Avatar

中の人:jakkrokk (HN統一しました) がphp,javascript,air,flex などなど好き勝手書いてます。仕事は主にWEBシステムの設計と開発、SEO全般など。

sakuraサーバで 2013:Lost connection to MySQL server エラー

さくらで運用しているアプリを弄っていたら
突然こんなエラーが

ERROR 2013: Lost connection to MySQL server at 'reading initial communication packet' Error 61

無論DBにアクセスできない状態になったので、なんなのかなーと探っていたら
10分ほどして勝手に直った。

直った?っていうか本当に直ったの?ってことで
一応作業を終えた後色々調べていたら
どうもプロセスが死んでリスタートされてる間にアクセスすると
こんなエラーになるらしい。

このエラーが出た間に裏側ででたmysqlのエラーログはこんなかんじ。

Server shutdown in progress

Lost connection to MySQL server during query

Can't connect to MySQL server on '***.db.sakura.ne.jp'

てっきり作業でUPDATE文とかINSERT文とか1000行単位でぶちこんでいたから
それのせいなのかと思ってただけによかったよかった。
なんかのタイミングでmysqlサーバが再起動してたぽいですね

ということでまたおきた時の為にメモ。

さくらサーバで Client does not support authentication protocol ~ エラー

新しく契約したサーバでDB(mysql5)使おうとしたらこんなのがでた。

Client does not support authentication protocol requested by server; consider upgrading MySQL client

phpのほうは同じなのにmysql4.1 > 5 の違いでエラーが出てるので
なんでだろうとおもったら、パスワードのハッシュの長さがうんたらかんたらだった。
さくらサーバだとDBのアカウント作成する際に自動でやってくれるんだけど
それが4.1用のやつなのかな。
mysql5をさくらで使うの初めてだから毎回こうなるのかはわからないんだけど。

で、まあこんなかんじで解決

UPDATE user-name SET password = OLD_PASSWORD('**********')

ユーザネームとパスワードを上の構文に入れてあげるだけでした。

エラーの詳細はここら辺を参考にどうぞ
パスワードハッシュ

php + mysql でランダムデータの抽出方法

DBからランダムデータを10個抽出するのに

SELECT id,contents FROM table ORDER BY rand() LIMIT 10;

みたいな書き方をしていたんですが、

最初のうちはよかったんですが、
テーブルが1万越えてきたあたりからやったら遅くなってきて、
Copying to tmp table連発で激重+コネクション圧迫が
ひどくなってきたので改善することに。

とりあえず当該テーブルで explain するとこんなかんじ

EXPLAIN SELECT id,contents FROM table ORDER BY rand() LIMIT 10

table 	        table
type 	        ALL
possible_keys 	NULL
key 	        NULL
key_len 	NULL
ref 	        NULL
rows 	        29302
Extra	        Using temporary; Using filesort

rows :29302 なので全件走査(良く考えたら当たり前か。。)
なので Using temporary してるわけで、
SQLでなんかできるかなというのは無理だったので、
phpで対応することに。
対応っていっても、簡単にこんな感じで直しただけで劇的に速度が上がりました。

//件数を取得して $count にいれて、
SELECT count(*) as count FROM table;

//0 ~ $count までの配列を作ってそれをランダムに10個取り出して , で join してIN句に突っ込む
"SELECT id,contents FROM table WHERE id IN (".join(',',array_rand(range(0,$count),10));"

Continue Next page

Twitter