質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.98%

  • PHP

    17807questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5110questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • CakePHP

    2129questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

【Mysql、PHP】mysql.sockが消えてしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 158

katsuo77

score 28

お世話になります。
CakePHP+Mysqlで開発をしています。

ある時ページを読み込んでいると、

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

というエラーが表示されてしまいました。
調べると、mysql.sockがあるべき場所にない場合に起こるエラーということだったので、

touch /var/lib/mysql/mysql.sock

のあとmysqlを再起動することでまた動くようになったのですが、その後もいくつかのページを読み込むとmysql.sockが消えてしまうという状況が頻発するようになりました。

直近の変更がなにか影響しているのではないかと思い、元に戻したりしているのですが状況は改善しません。

また同じページでも問題なく読み込める時とそうでない時があり、ちょっと原因がわからず行き詰まってしまっています。。。

どんな時にmysql.sockが消えてしまうのか、どうすればこれは解決するのか、お心当たりのある方がいらっしゃればお力を貸していただきたいです。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

DB接続のあるページでの症状だとすると、正しいソケット接続指定しているコードと、そうでないコードが混在しているために発生していると思われます。DBへの接続方法を揃えるように修正することで解決できると思います。DB接続設定ファイルConfig/database.phpも確認してみてください。

下記のソケットファイルの場所確認も行って、MySQLの設定(/etc/my.cnf or /var/lib/mysql/my.cnf)、php.iniの設定、CakePHPのDB設定もすべて揃えるように修正を行います。

また、MySQLへの接続方法には、ソケットで接続を行う方法の他に、TCP 3306番ポートを使って接続する方法もあります。

サーバー環境に左右されにくいので変更が面倒でなければ、TCP接続が良いと思います。(個人的に馴染んでいるだけが理由かもしれませんが)記憶が定かではありませんが、コンパイルインストールするとソケットファイルは/var/lib/mysql/mysql.sockがデフォルトだった気がします。

ちなみに、ソケットは普通のファイルではないので、touch /var/lib/mysql/mysql.sockのように作成してはいけません。普通のファイルはレギュラーファイルと呼ばれ、ソケットはソケットファイルと呼ばれます。

SSHなどのターミナルで下記のようなコマンドを実行すると、ファイル名の後に=と表示されるファイルはソケットファイルです。

ls -lF /tmp/ /var/run

 ソケットファイルの場所確認

普通、MySQLをパッケージからインストールした場合は、ソケットファイルは/tmp/mysql.sockにあります。ソケットファイルを確認するにはMySQLにログインして、下記SQLコマンドを実行してみてください。

SHOW VARIABLES LIKE 'sock%';

下記は、私の環境での実行結果です。

+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| socket        | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)

ターミナルで下記コマンドを実行して実際のファイルパスを確認してみます。

ls -lF /tmp/mysql.sock

#---- ↓実行結果↓ ----
srwxrwxrwx 1 mysql mysql 0 Dec 19 17:03 /tmp/mysql.sock=

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 22:24

    Tomak様

    さっそく丁寧なご回答をいただきありがとうございます。
    まず、ソケットファイルの場所を確認すると、私の環境では
    /var/lib/mysql/mysql.sock
    にありました。

    その上で教えていただいたファイルを確認し、以下の変更をしました。

    ・/etc/my.cnf
    クライアント側のソケット指定がなかったので、以下を追記。

    [client]
    socket=/var/lib/mysql/mysql.sock

    ・/etc/php.ini
    mysql.default_socketが指定されていなかったので、以下のように変更。

    mysql.default_socket = /var/lib/mysql/mysql.sock


    ここまでした上でhttpdおよびmysqlの再起動をしましたが、まだ改善は見られませんでした。
    ちなみに同じサーバー上にCakeを使っていない別のサイトも載っており、Cakeの方は触らず別サイトの読み込みを行っただけでソケットファイルが消えていたので、Cake側以外に問題があるのかもしれません。

    またソケットファイルが消える際コマンドラインに以下のログが出力されていることに気が付いたのですが、何か関係があるのでしょうか?

    /usr/bin/mysqld_safe: line 181: 492 Killed nohup /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock < /dev/null > /dev/null 2>&1

    お聞きしてばかりで恐縮ですが、これでもしまた何かわかりましたらご教授いただけますと幸いです。

    キャンセル

  • 2017/12/20 06:01

    このエラーログからすると、単純にPHPソースが悪いわけではなく、MySQLがクラッシュしているために起きている現象のようです。MySQLがクラッシュすると当然ソケットファイルもなくなります。下記のMySQLエラーログをみてクラッシュする原因を見つけてみてください。
    ----
    エラーログ:/var/log/mysqld.log

    下記も参考になるかもしれません。
    ----
    https://teratail.com/questions/60699

    キャンセル

  • 2017/12/20 06:23

    上記コメントの追加です。MySQLクラッシュの原因はログファイルを見てみないとわかりませんが、下記も確認してみると良いかもしれません。

    私の環境の「/usr/bin/mysqld_safe」と同じでないようなので何とも言えませんが、MySQLエラーログパスのオーナー権限は大丈夫でしょうか? 普通はオーナー、グループともに「mysql」です。
    ----
    オーナー権限:mysql:mysql /var/log/mysqld.log

    また、ファイルサイズも確認したほうが良いかもしれません。ログローテートされていないと、ログファイルが肥大化してOSで扱える最大サイズになり、書き込みできないことがあります。

    私の環境だと「mysqld_safe」の181行目は、shスクリプトの「eval_log_error()」という関数です。なんらかのエラーが出たけれと、エラーを吐き出せないためにMySQLがクラッシュしているとも考えられます。

    キャンセル

  • 2017/12/21 18:49

    Tomak様

    返信が遅れて申し訳ありません。
    詳しいコメントありがとうございます。

    結論からいうと、まだ問題の解決には至っておりません。
    以下のようなことを確認、変更しました。

    ・エラーログ/var/log/mysqld.logの確認
    mysqlの立ち上げからクラッシュまで、以下のようなログが出力されていました。

    2017-12-21 18:07:03 9067 [Note] Plugin 'FEDERATED' is disabled.
    2017-12-21 18:07:03 9067 [Note] InnoDB: Using atomics to ref count buffer pool pages
    2017-12-21 18:07:03 9067 [Note] InnoDB: The InnoDB memory heap is disabled
    2017-12-21 18:07:03 9067 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
    2017-12-21 18:07:03 9067 [Note] InnoDB: Memory barrier is not used
    2017-12-21 18:07:03 9067 [Note] InnoDB: Compressed tables use zlib 1.2.3
    2017-12-21 18:07:03 9067 [Note] InnoDB: Using Linux native AIO
    2017-12-21 18:07:03 9067 [Note] InnoDB: Using CPU crc32 instructions
    2017-12-21 18:07:03 9067 [Note] InnoDB: Initializing buffer pool, size = 128.0M
    2017-12-21 18:07:03 9067 [Note] InnoDB: Completed initialization of buffer pool
    2017-12-21 18:07:03 9067 [Note] InnoDB: Highest supported file format is Barracuda.
    2017-12-21 18:07:03 9067 [Note] InnoDB: The log sequence numbers 2231251817 and 2231251817 in ibdata files do not match the log sequence number 2231766984 in the ib_logfiles!
    2017-12-21 18:07:03 9067 [Note] InnoDB: Database was not shutdown normally!
    2017-12-21 18:07:03 9067 [Note] InnoDB: Starting crash recovery.
    2017-12-21 18:07:03 9067 [Note] InnoDB: Reading tablespace information from the .ibd files...
    2017-12-21 18:07:03 9067 [Note] InnoDB: Restoring possible half-written data pages
    2017-12-21 18:07:03 9067 [Note] InnoDB: from the doublewrite buffer...
    2017-12-21 18:07:04 9067 [Note] InnoDB: 128 rollback segment(s) are active.
    2017-12-21 18:07:04 9067 [Note] InnoDB: Waiting for purge to start
    2017-12-21 18:07:04 9067 [Note] InnoDB: 5.6.36 started; log sequence number 2231766984
    2017-12-21 18:07:04 9067 [Note] Server hostname (bind-address): '*'; port: 3306
    2017-12-21 18:07:04 9067 [Note] IPv6 is available.
    2017-12-21 18:07:04 9067 [Note] - '::' resolves to '::';
    2017-12-21 18:07:04 9067 [Note] Server socket created on IP: '::'.
    2017-12-21 18:07:04 9067 [Note] Event Scheduler: Loaded 0 events
    2017-12-21 18:07:04 9067 [Note] /usr/sbin/mysqld: ready for connections.
    Version: '5.6.36' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server (GPL)

    気になるログは検索にかけてみましたが、特に問題になるようなものはこちらでは見つかりませんでした。

    ・/var/log/mysqld.logのオーナー権限
    こちらはmysql:mysqlに設定されています。

    ・ログファイルのファイルサイズ
    一度/var/log/mysqld.logのバックアップを取った上で、新しくmysqld.logを作成してmysqlの再起動を行いましたが、同じようにクラッシュしました。

    ・メモリの確認
    free -hの結果は以下のようになりました。

    total used free shared buffers cached
    Mem: 490M 307M 183M 60K 12M 33M
    -/+ buffers/cache: 260M 229M
    Swap: 2.0G 446M 1.6G

    メモリの使用状況は60%程度で、スワップ領域も残っているので、ここもそれほど問題はないかと思っています。


    何かmysqlの設定がおかしくなっているのかな、とは思うのですが、もう少しやってみてダメなら最悪バックアップを取った上でのmysqlの入れ直しも検討しています。

    キャンセル

  • 2017/12/21 19:38

    ログは多分「クラッシュ後~立ち上げ」のログだと思います。注目しなければならないのは「クラッシュ前」のログです。多分「[Note] InnoDB ...」じゃなくて「[error] InnoDB ...」のようなログが残っているかと思います。

    > 2017-12-21 18:07:03 9067 [Note] InnoDB: The log sequence numbers 2231251817 and 2231251817 in ibdata files do not match the log sequence number 2231766984 in the ib_logfiles!

    これは、ざっくり言うとMySQLがクラッシュしたことにより、LSN(Log Sequence Number)が違うというメッセージですが、下記のように正常にリカバリーできているようなのでMySQLの設定ファイルが問題かもしれません。

    > 2017-12-21 18:07:03 9067 [Note] InnoDB: Restoring possible half-written data pages
    > 2017-12-21 18:07:03 9067 [Note] InnoDB: from the doublewrite buffer...
    > 2017-12-21 18:07:04 9067 [Note] InnoDB: 128 rollback segment(s) are active.
    > 2017-12-21 18:07:04 9067 [Note] InnoDB: Waiting for purge to start
    > 2017-12-21 18:07:04 9067 [Note] InnoDB: 5.6.36 started; log sequence number 2231766984

    キャンセル

  • 2017/12/22 14:10

    Tomak様

    コメントありがとうございます。
    こちらの問題解決いたしました。

    ログにはなぜかエラーが吐き出されておらず、クラッシュ前後を見ても上に貼ったようなログが繰り返し出力されているだけでした。

    しかしdf -hTしてみると、
    Filesystem Type Size Used Avail Use% Mounted on
    /dev/vda3 ext4 18G 17G 16M 100% /
    tmpfs tmpfs 246M 0 246M 0% /dev/shm
    /dev/vda1 ext4 239M 129M 97M 58% /boot

    とディスクの使用率が100%になっていたので、不要ファイルを削除して空きを作ったところ、mysqlは正常に動くようになりました。

    おかげさまで問題を解決でき、また解決の手法についても勉強することができました。
    本当にありがとうございました。

    キャンセル

  • 2017/12/22 19:37

    解決できたようでよかったです。思わぬ落とし穴といったところですね。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17807questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • MySQL

    5110questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • CakePHP

    2129questions

    CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。