web-dev-qa-db-ja.com

my.cnfのMySQLソケット構成の問題

アプリケーションで非常に長い「データベースの時間」を引き起こしている問題があります。

DBはPercona MySQL 5.5.35です。

アプリケーションは完全に動作し、データベースからの読み取り/書き込みは問題なく行えます。問題は、非常に長いDB応答時間があり、クエリの実行に費やされる時間ではないことです。これらはすべて単純で、キャッシュされています。

たとえば、応答時間がランダムに数秒になる場合もあれば、数ミリ秒かかる場合もあります。クエリログの設定が遅く、クエリも遅くありません。これらはすべて、小さなデータの単純な挿入と約80%の読み取りであり、DB全体はわずか20 MBです。これはインターネットフォーラムです。

New Relic app graph showing huge spikes in DB connect time

My.cnfのmysqldセクションでソケットを指定できないので、問題はソケットにあると確信しています。その場合、データベースの再起動時に次のエラーが表示されます。

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

したがって、たとえば、次は、関係のない部分が削除された、my.cnfのライブの作業用コピーです。

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/mysql.sock


[mysqld]

# General #
default-storage-engine         = InnoDB

# Database replication #
server-id=1895149
log-bin=mysql-bin
log-error=mysql-bin.err
binlog_do_db=reefbase1

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

Mysqldセクションでポートとソケットが指定されていないことに注意してください。

これを次のように変更した場合:

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/mysql.sock


[mysqld]

port                           = 3306
socket                         = /var/lib/mysql/mysql.sock

# General #
default-storage-engine         = InnoDB

# Database replication #
server-id=1895149
log-bin=mysql-bin
log-error=mysql-bin.err
binlog_do_db=reefbase1

# MyISAM #
key-buffer-size                = 32M
myisam-recover                 = FORCE,BACKUP

これは、何度も何度も見ています。my.cnfを設定すると、サーバーが「接続できません」エラーで起動に失敗します。

どんなアドバイスもいただければ幸いです。

3
i-CONICA

ここで覚えておくべき最初のポイントは、クライアントがlocalhostを使用するように構成されている場合、多くのmysqlクライアント(phpを含む)がデフォルトでUNIXソケットスタイルの通信になることです。サーバーがこのソケットを正しく設定していない場合、クライアントはソケットに接続しようとして失敗している可能性があります。

残りはコメントでの議論から要約されています。

いずれにせよ、サーバーがソケットを作成するように構成されておらず、クライアントがUbuntuシステムでは通常とは異なる場所をポイントしていたため、pidとソケットの標準のDebian/Ubuntuの場所をポイントするように最初に変更する必要があると思いますファイル。 /var/run/mysqld/mysqld.sock、または最近の/run/mysqld/mysqld.sock

他の場所は理論的には機能するはずですが、許可や何かに関しては、何かが完全に書かれていないと思います。

4
Zoredache

私の問題は少し異なりましたが、この質問が検索に現れました。ソケットの代わりにTCPを介して接続すると、私の問題が修正されました。また、他の人にも役立ちます。

つまりあなたのクライアントセクションに以下を入れてください:

Host=127.0.0.1

および/または

protocol=tcp
0
kqw