Я пытался настроить производительность работающего mysql-сервера, выполнив эту команду:
mysqld_safe --key_buffer_size=64M --table_cache=256 --sort_buffer_size=4M --read_buffer_size=1M &
После этого я не могу подключить mysql с сервера, на котором запущен mysql. Я получаю такую ошибку:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)
Однако, к счастью, я все еще могу подключиться к mysql удаленно. Таким образом, все мои веб-серверы по-прежнему имеют доступ к mysql и работают без проблем. Однако из-за этого я не хочу пытаться перезапустить сервер mysql, поскольку это, вероятно, все испортит.
Теперь я знаю, что mysqld_safe запускает mysql-сервер, и, поскольку сервер mysql уже был запущен, я предполагаю, что это какая-то проблема с двумя запущенными серверами mysql и прослушиванием одного и того же порта.
Есть ли способ решить эту проблему без перезапуска исходного сервера mysql?
ОБНОВИТЬ: Это то, что ps xa | grep "mysql" говорит:
11672 ? S 0:00 /bin/sh /usr/bin/mysqld_safe
11780 ? Sl 175:04 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
11781 ? S 0:00 logger -t mysqld -p daemon.error
12432 pts/0 R+ 0:00 grep mysql
ОБНОВЛЕНИЕ 2: Пытался перезапустить сейчас. Остановка работала нормально, но запуск не удался. К моему удивлению, mysql-сервер все еще работает без проблем, поэтому я действительно не знаю, что он остановил.
ОБНОВЛЕНИЕ 3: Я почти уверен, что это проблема сейчас: когда я запустил mysql в первый раз, он записал свой идентификатор процесса в /var/run/mysqld/mysqld.pid, а сокет в /var/run/mysqld/mysqld.sock.
Затем, когда я запустил команду mysqld_safe, она удалила эти файлы. Теперь я не могу остановить mysql-сервер, так как команде остановки нужны эти файлы. Есть ли способ восстановить эти файлы? Полагаю, pid-файл - это просто файл с идентификатором процесса? Я не хочу просто убивать процесс, потому что на этот сервер очень много записей, и убийство mysql обычно заканчивается повреждением баз данных.
Проверить bind-address
в твоем my.cnf
. Так должно быть 0.0.0.0
чтобы разрешить как локальные, так и удаленные подключения.
Проверить с ps xa | grep mysql
сколько экземпляров запущено.
редактировать
Очевидно:
Клиент MySQL в Unix может подключаться к серверу mysqld двумя разными способами: с помощью файла сокета Unix для подключения через файл в файловой системе (по умолчанию /tmp/mysql.sock) или с помощью TCP / IP, который подключает через номер порта. Соединение файла сокета Unix быстрее, чем TCP / IP, но может использоваться только при соединении с сервером на том же компьютере. Файл сокета Unix используется, если вы не указываете имя хоста или если вы указываете специальное имя хоста localhost.
Проверьте Вот за полезный совет.
Edit2
Одна из возможных причин Can't connect to local MySQL server
, похоже, проблема здесь:
Кто-то удалил файл сокета Unix, который использует mysqld (по умолчанию /tmp/mysql.sock). Например, у вас может быть задание cron, которое удаляет старые файлы из каталога / tmp. Вы всегда можете запустить mysqladmin version, чтобы проверить, действительно ли существует файл сокета Unix, который mysqladmin пытается использовать. Исправление в этом случае состоит в том, чтобы изменить задание cron, чтобы не удалять mysql.sock или не помещать файл сокета в другое место. См. Раздел B.5.4.5, «Как защитить или изменить файл сокета MySQL Unix».
Мартин, убедитесь, что у вас есть socket = /var/run/mysqld/mysqld.sock
в my.cnf, я считаю, что перезапуск mysqld решит вашу проблему, он должен воссоздать mysqld.sock, и вы сможете подключиться локально.
Что находится в вашем журнале ошибок mysql (разные дистрибутивы имеют разные местоположения)?
Какие у вас настройки экземпляра? Подключитесь к mysql и запустите команду
show global variabes
Следите за переменными socket
и log-error
РЕДАКТИРОВАТЬ: Если mysql запущен и вы можете подключиться к нему, вы можете выключить его с помощью команды
mysqladmin shutdown
Просто добавьте флаг -h с вашим именем хоста при подключении, чтобы увидеть, работает ли он. Также попробуйте добавить флаг --socket = в MySQLd
mysql -h myserver.null.com -P 3306 -u bob -P имя_бд