8.2.22 Устранение неполадок при подключении к MySQL
Если у вас возникли проблемы при попытке подключения к серверу MySQL, следующие пункты описывают некоторые действия, которые вы можете предпринять для исправления проблемы.
-
Убедитесь, что сервер запущен. Если он не запущен, клиенты не могут подключиться к нему. Например, если попытка подключения к серверу завершается с сообщением, подобным одному из приведенных ниже, одной из причин может быть то, что сервер не запущен:
$>
mysqlERROR 2003: Can't connect to MySQL server on 'host_name' (111) $>mysqlERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111) -
Возможно, сервер запущен, но вы пытаетесь подключиться с использованием TCP/IP-порта, именованного канала или файла Unix-сокет, отличного от того, на котором сервер прослушивает. Чтобы исправить это при вызове клиентской программы, укажите параметр
--portдля указания номера порта или параметр--socketдля указания правильного именованного канала или файла Unix-сокет. Чтобы определить расположение файла сокета, вы можете использовать следующую команду:$>
netstat -ln | grep mysql Убедитесь, что сервер не настроен на игнорирование сетевых подключений или (если вы пытаетесь подключиться удалённо) что он не настроен на прослушивание только локально на своих сетевых интерфейсах. Если сервер был запущен с включенной системной переменной
skip_networking, то TCP/IP-соединения не принимаются. Если сервер был запущен с системной переменнойbind_address, установленной в значение127.0.0.1, он прослушивает TCP/IP-соединения только локально на интерфейсе обратной связи и не принимает удалённые подключения.Убедитесь, что брандмауэр не блокирует доступ к MySQL. Ваш брандмауэр может быть настроен в зависимости от выполняемого приложения или номера порта, используемого MySQL для связи (по умолчанию 3306). В Linux или Unix проверьте конфигурацию таблиц IP (или аналогичных) для того, чтобы убедиться, что порт не заблокирован. В Windows для этого необходимо настроить приложения, такие как ZoneAlarm или брандмауэр Windows, чтобы они не блокировали порт MySQL.
-
Таблицы разрешений должны быть правильно настроены, чтобы сервер мог использовать их для управления доступом. Для некоторых типов дистрибутивов (таких как двоичные дистрибутивы для Windows или RPM и DEB-дистрибутивы для Linux) процесс установки инициализирует каталог данных MySQL, включая системную базу данных
mysql, содержащую таблицы разрешений. Для дистрибутивов, которые этого не делают, необходимо вручную инициализировать каталог данных. Подробности см. в Разделе 2.9, “Настройка и тестирование после установки”.Чтобы определить, нужно ли инициализировать таблицы разрешений, найдите каталог
mysqlв каталоге данных. (Каталог данных обычно называетсяdataилиvarи находится в каталоге вашей установки MySQL.) Убедитесь, что в каталоге базы данныхmysqlесть файл с именемuser.MYD. Если нет, инициализируйте каталог данных. После этого и запуска сервера вы должны иметь возможность подключиться к серверу. -
После свежей установки, если вы пытаетесь войти на сервер как
rootбез использования пароля, вы можете получить следующее сообщение об ошибке.$>
mysql -u rootERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)Это означает, что пароль root уже был задан во время установки и его необходимо указать. См. Раздел 2.9.4, “Защита начального учётной записи MySQL” о различных способах назначения пароля и, в некоторых случаях, о том, как его найти. Если вам нужно сбросить пароль root, см. инструкции в Разделе B.3.3.2, “Как сбросить пароль root”. После того как вы нашли или сбросили пароль, снова войдите как
root, используя параметр--password(или-p):$>
mysql -u root -pEnter password:Однако, сервер позволит вам подключиться как
rootбез пароля, если вы инициализировали MySQL с помощью mysqld --initialize-insecure (подробнее см. Раздел 2.9.1, “Инициализация каталога данных”). Это представляет собой угрозу безопасности, поэтому вы должны установить пароль для учётной записиroot; см. Раздел 2.9.4, “Защита начального учётной записи MySQL” для получения инструкций. Если вы обновили существующую установку MySQL до новой версии, выполнили ли вы процедуру обновления MySQL? Если нет, выполните её. Структура таблиц разрешений иногда изменяется при добавлении новых возможностей, поэтому после обновления всегда необходимо убедиться, что ваши таблицы имеют текущую структуру. Инструкции см. в Главе 3, Обновление MySQL.
-
Если клиентская программа получает следующее сообщение об ошибке при попытке подключения, это означает, что сервер ожидает пароли в более новом формате, чем клиент способен сгенерировать:
$>
mysqlClient does not support authentication protocol requested by server; consider upgrading MySQL client -
Помните, что клиентские программы используют параметры подключения, указанные в файлах параметров или переменных среды. Если клиентская программа, кажется, отправляет некорректные параметры подключения по умолчанию, когда вы их не указали в командной строке, проверьте соответствующие файлы параметров и вашу среду. Например, если при запуске клиента без каких-либо параметров вы получаете
Access denied, убедитесь, что вы не указали старый пароль ни в одном из файлов параметров!Вы можете запретить использование файлов параметров клиентской программой, вызвав её с параметром
--no-defaults. Например:$>
mysqladmin --no-defaults -u root versionФайлы параметров, используемые клиентами, перечислены в Разделе 6.2.2.2, “Использование файлов параметров”. Переменные среды перечислены в Разделе 6.9, “Переменные окружения”.
-
Если вы получаете следующую ошибку, это означает, что вы используете неверный
rootпароль:$>
mysqladmin -u root -pAccess denied for user 'root'@'localhost' (using password: YES)xxxxverЕсли предшествующая ошибка возникает даже когда вы не указали пароль, это означает, что вы указали неверный пароль в некотором файле параметров. Попробуйте параметр
--no-defaults, как описано в предыдущем пункте.Информацию о смене паролей см. в Разделе 8.2.14, “Присваивание паролей учётной записи”.
Если вы потеряли или забыли пароль
root, см. Раздел B.3.3.2, “Как сбросить пароль root”. -
localhost— это синоним вашего имени хоста и также является хостом по умолчанию, к которому клиенты пытаются подключиться, если вы явно не указали хост.Вы можете использовать параметр
--host=127.0.0.1для явного указания имени хоста сервера. Это вызывает TCP/IP-соединение с локальным сервером mysqld. Вы также можете использовать TCP/IP, указав параметр--host, который использует фактическое имя хоста локального компьютера. В этом случае имя хоста должно быть указано в строке таблицыuserна хосте сервера, даже если вы запускаете клиентскую программу на том же хосте, что и сервер. Сообщение об ошибке
Access deniedсообщает вам, от имени кого вы пытаетесь войти, хост клиента, с которого вы пытаетесь подключиться, и использовали ли вы пароль. Обычно у вас должна быть одна строка в таблицеuser, которая точно соответствует имени хоста и имени пользователя, указанным в сообщении об ошибке. Например, если вы получаете сообщение об ошибке, содержащееusing password: NO, это означает, что вы пытались войти без пароля.-
Если при попытке подключения к базе данных с помощью
mysql -uвозникает ошибкаuser_nameAccess denied, у вас может быть проблема с таблицейuser. Проверьте это, выполнивmysql -u root mysqlи выдав следующую SQL-команду:SELECT * FROM user;
Результат должен включать строку со столбцами
HostиUser, соответствующими имени хоста клиента и вашему имени пользователя MySQL. -
Если при попытке подключения с хоста, отличного от хоста, на котором запущен сервер MySQL, возникает следующая ошибка, это означает, что в таблице
userнет строки со значениемHost, соответствующим хосту клиента:Host ... is not allowed to connect to this MySQL server
Это можно исправить, создав учётную запись для комбинации имени хоста клиента и имени пользователя, которые вы используете при попытке подключения.
Если вы не знаете IP-адрес или имя хоста машины, с которой вы подключаетесь, вы должны добавить строку со значением
'%'в качестве значения столбцаHostв таблицеuser. После попытки подключения с машины клиента используйте запросSELECT USER(), чтобы увидеть, как вы действительно подключились. Затем измените значение'%'в строке таблицыuserна фактическое имя хоста, которое отображается в журнале. В противном случае ваша система остаётся небезопасной, так как она допускает подключения с любого хоста для данного имени пользователя.В Linux ещё одной причиной возникновения этой ошибки может быть использование двоичной версии MySQL, скомпилированной с другой версией библиотеки
glibc, чем та, которую вы используете. В этом случае вам следует либо обновить свою операционную систему илиglibc, либо скачать исходный дистрибутив MySQL версии и скомпилировать его самостоятельно. Скомпилировать и установить исходный RPM обычно не сложно, поэтому это не большая проблема.
-
Если вы указываете имя хоста при попытке подключения, но получаете сообщение об ошибке, где имя хоста не отображается или является IP-адресом, это означает, что сервер MySQL получил ошибку при попытке разрешить IP-адрес клиентского хоста в имя:
$>
mysqladmin -u root -pAccess denied for user 'root'@'' (using password: YES)xxxx-hsome_hostnameverЕсли вы пытаетесь подключиться как
rootи получаете следующую ошибку, это означает, что у вас нет строки в таблицеuserсо значением столбцаUserравным'root'и что mysqld не может разрешить имя хоста для вашего клиента:Access denied for user ''@'unknown'
Эти ошибки указывают на проблему DNS. Чтобы исправить это, выполните mysqladmin flush-hosts для сброса внутреннего кэша хостов DNS. См. Раздел 7.1.12.3, «DNS-запросы и кэш хостов».
Некоторые постоянные решения:
Определите, что не так с вашим DNS-сервером, и исправьте это.
Укажите IP-адреса, а не имена хостов в таблицах предоставления прав доступа MySQL.
Добавьте запись для имени клиентской машины в
/etc/hostsв Unix или\windows\hostsв Windows.Запустите mysqld с включенной системной переменной
skip_name_resolve.Запустите mysqld с
--host-cache-size=0.В Unix, если вы запускаете сервер и клиент на одной машине, подключитесь к
localhost. Для подключений кlocalhostпрограммы MySQL пытаются подключиться к локальному серверу, используя файл сокета Unix, если только не указаны параметры подключения, гарантирующие, что клиент устанавливает TCP/IP-соединение. Для получения дополнительной информации см. Раздел 6.2.4, «Подключение к серверу MySQL с использованием параметров командной строки».В Windows, если вы запускаете сервер и клиент на одной машине, и сервер поддерживает подключения через именованные каналы, подключитесь к имени хоста
.(точка). Подключения к.используют именованный канал, а не TCP/IP.
Если
mysql -u rootработает, ноmysql -hприводит кyour_hostname-u rootAccess denied(гдеyour_hostname— фактическое имя хоста локального хоста), у вас может быть неправильное имя для вашего хоста в таблицеuser. Распространенная проблема здесь заключается в том, что значениеHostв строке таблицыuserуказывает неполное имя хоста, но процедуры разрешения имен вашей системы возвращают полное доменное имя (или наоборот). Например, если у вас есть строка с хостом'pluto'в таблицеuser, но ваш DNS сообщает MySQL, что ваше имя хоста —'pluto.example.com', строка не работает. Попробуйте добавить строку в таблицуuser, которая содержит IP-адрес вашего хоста в качестве значения столбцаHost. (В качестве альтернативы вы можете добавить строку в таблицуuserсо значениемHost, содержащим подстановочный знак (например,'pluto.%'). Однако использование значенийHost, заканчивающихся на%, небезопасно и не рекомендуется!)Если
mysql -uработает, ноuser_namemysql -uнет, вы не предоставили доступ данному пользователю к базе данных с именемuser_namesome_dbsome_db.Если
mysql -uработает при выполнении на хосте сервера, ноuser_namemysql -hне работает при выполнении на удаленном клиентском хосте, вы не предоставили доступ к серверу для данного имени пользователя с удаленного хоста.host_name-uuser_nameЕсли вы не можете понять, почему вы получаете
Access denied, удалите из таблицыuserвсе строки, которые имеют значенияHost, содержащие подстановочные знаки (строки, которые содержат символы'%'или'_'). Очень распространенная ошибка — вставить новую строку сHost='%'иUser=', полагая, что это позволяет указатьsome_user'localhostдля подключения с той же машины. Причина, по которой это не работает, заключается в том, что привилегии по умолчанию включают строку сHost='localhost'иUser=''. Поскольку эта строка имеет значениеHost'localhost', которое более специфично, чем'%', оно используется предпочтительнее новой строки при подключении сlocalhost! Правильная процедура — вставить вторую строку сHost='localhost'иUser='или удалить строку сsome_user'Host='localhost'иUser=''. После удаления строки не забудьте выполнить операторFLUSH PRIVILEGESдля перезагрузки таблиц предоставления прав доступа. См. также Раздел 8.2.6, «Контроль доступа, этап 1: Проверка подключения».Если вы можете подключиться к серверу MySQL, но получаете сообщение
Access deniedвсякий раз, когда вы выполняете операторSELECT ... INTO OUTFILEилиLOAD DATA, ваша строка в таблицеuserне имеет включенной привилегииFILE.Если вы изменяете таблицы предоставления прав доступа напрямую (например, используя операторы
INSERT,UPDATEилиDELETE), и ваши изменения, похоже, игнорируются, помните, что вы должны выполнить операторFLUSH PRIVILEGESили команду mysqladmin flush-privileges, чтобы сервер перезагрузил таблицы привилегий. В противном случае ваши изменения не вступят в силу до следующего перезапуска сервера. Помните, что после изменения пароляrootс помощью оператораUPDATEвам не нужно указывать новый пароль до тех пор, пока вы не сбросите привилегии, потому что сервер до этого не знает, что вы изменили пароль.Если ваши привилегии, кажется, изменились в середине сеанса, возможно, администратор MySQL изменил их. Перезагрузка таблиц предоставления прав доступа влияет на новые клиентские подключения, но также влияет на существующие подключения, как указано в Разделе 8.2.13, «Когда вступают в силу изменения привилегий».
Если у вас есть проблемы с доступом в программе Perl, PHP, Python или ODBC, попробуйте подключиться к серверу с помощью
mysql -uилиuser_namedb_namemysql -u. Если вы можете подключиться с помощью клиента mysql, проблема заключается в вашей программе, а не в правах доступа. (Междуuser_name-ppassworddb_name-pи паролем нет пробела; вы также можете использовать синтаксис--password=для указания пароля. Если вы используете параметрpassword-pили--passwordбез значения пароля, MySQL предложит вам ввести пароль.)В тестовых целях запустите сервер mysqld с параметром
--skip-grant-tables. Затем вы можете изменить таблицы предоставления прав доступа MySQL и использовать операторSHOW GRANTS, чтобы проверить, имеют ли ваши изменения желаемый эффект. Когда вы будете удовлетворены своими изменениями, выполните mysqladmin flush-privileges, чтобы сообщить серверу mysqld о перезагрузке привилегий. Это позволит вам начать использовать новое содержимое таблицы предоставления прав доступа без остановки и перезапуска сервера.Если все остальное не удается, запустите сервер mysqld с параметром отладки (например,
--debug=d,general,query). Это выведет информацию о хосте и пользователе о попытках подключения, а также информацию о каждой выполненной команде. См. Раздел 7.9.4, «Пакет DBUG».
Если у вас возникли другие проблемы с таблицами разрешений MySQL и вы задаете вопрос на MySQL Community Slack, всегда предоставляйте дамп таблиц разрешений MySQL. Вы можете сделать дамп таблиц с помощью команды mysqldump mysql. Чтобы отправить отчет об ошибке, ознакомьтесь с инструкциями в разделе Раздел 1.6, «Как сообщить об ошибках или проблемах». В некоторых случаях вам может потребоваться перезапустить mysqld с параметром
--skip-grant-tables, чтобы запустить mysqldump.
© 2025 Oracle
Licensed under the GPLv2 License.