Проблема конфигурации MySQL Socket в my.cnf
У меня есть проблема, которая приводит к очень долгому "времени в базе данных" в моем приложении.
БД Percona MySQL 5.5.35.
Приложение работает отлично, и может читать / писать из базы данных просто отлично. Проблема в том, что у меня необычайно большое время отклика БД, которое определенно не тратится на выполнение запросов, которые просты и кэшированы.
Например, я случайно получу время отклика в несколько секунд, а в других случаях это займет всего несколько миллисекунд. Существует медленная настройка журналов запросов, и никакие запросы не являются медленными, все они представляют собой простые вставки крошечных данных и около 80% операций чтения, вся БД занимает всего 20 МБ, это интернет-форум.
Я уверен, что проблема заключается в сокете, так как я не могу указать сокет, указанный в разделе mysqld my.cnf. Если я это сделаю, я получаю ошибку при перезапуске базы данных, говоря:
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 должен быть настроен, мой сервер не запускается с ошибкой "невозможно подключиться".
Любой совет будет очень признателен.
2 ответа
Первое, что следует помнить, это то, что многие клиенты mysql (включая php) по умолчанию будут использовать Unix-стиль общения, если клиент настроен на использование localhost. Если ваш сервер неправильно настраивает этот сокет, возможно, клиенты пытаются подключиться к этому сокету и отказывают.
Остальное суммировано из нашего обсуждения в комментариях.
В любом случае, так как ваш сервер не был настроен на создание сокета, а клиент указывал местоположение, которое является необычным для системы Ubuntu, я думаю, вам следует попробовать изменить его, чтобы он указывал на стандартное расположение Debian/Ubuntu для pid и сокета файлы. Который /var/run/mysqld/mysqld.sock
или совсем недавно /run/mysqld/mysqld.sock
,
Другое местоположение должно теоретически работать, хотя я предполагаю, что что-то не совсем так, как пишут, в отношении разрешений или чего-то еще.
Моя проблема была немного другой, но этот вопрос обнаружился в поиске. И подключение по TCP вместо сокетов устранило мою проблему. Это также помогает другим.
Т.е. в ваш клиентский раздел положите:
host=127.0.0.1
и / или
protocol=tcp