Spec-Zone.ru › MySQL 5.7

6.2.17 Устранение проблем с подключением к MySQL

Если у вас возникли проблемы при попытке подключения к серверу MySQL, следующие пункты описывают некоторые действия, которые можно предпринять для исправления проблемы.

  • Убедитесь, что сервер запущен. Если он не запущен, клиенты не смогут подключиться к нему. Например, если попытка подключения к серверу завершается сообщением, подобным одному из следующих, одной из причин может быть то, что сервер не запущен:

    $> mysql
    ERROR 2003: Can't connect to MySQL server on 'host_name' (111)
    $> mysql
    ERROR 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.) Убедитесь, что у вас есть файл, названный user.MYD, в каталоге базы данных mysql. Если нет, инициализируйте каталог данных. После этого и запуска сервера вы должны иметь возможность подключиться к серверу.

  • После свежей установки, если вы пытаетесь войти на сервер как root без использования пароля, вы можете получить следующее сообщение об ошибке.

    $> mysql -u root 
    ERROR 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 -p
    Enter password:
    

    Однако, сервер позволит вам подключиться как root без использования пароля, если вы инициализировали MySQL с помощью mysqld --initialize-insecure (см. Раздел 2.9.1, «Инициализация каталога данных» для получения более подробной информации). Это представляет собой риск для безопасности, поэтому вы должны установить пароль для учётной записи root; см. Раздел 2.9.4, «Защита начального аккаунта MySQL» для получения инструкций.

  • Если вы обновили существующую установку MySQL до новой версии, вы выполнили процедуру обновления MySQL? Если нет, сделайте это. Структура таблиц грантов периодически изменяется, когда добавляются новые возможности, поэтому после обновления всегда следует убедиться, что ваши таблицы имеют текущую структуру. Инструкции см. в Разделе 2.10, «Обновление MySQL».

  • Если клиентская программа получает следующее сообщение об ошибке при попытке подключения, это означает, что сервер ожидает пароли в более новом формате, чем клиент способен генерировать:

    $> mysql
    Client does not support authentication protocol requested
    by server; consider upgrading MySQL client
    

    Дополнительную информацию о том, как с этим справиться, см. в Разделе 6.4.1.3, «Миграция от хэширования паролей до версии 4.1 и плагин mysql_old_password».

  • Помните, что клиентские программы используют параметры подключения, указанные в файлах параметров или переменных среды. Если клиентская программа, кажется, отправляет неверные параметры подключения по умолчанию, когда вы не указали их в командной строке, проверьте все соответствующие файлы параметров и вашу среду. Например, если вы получаете Access denied при запуске клиента без каких-либо параметров, убедитесь, что вы не указали старый пароль ни в одном из файлов параметров!

    Вы можете запретить использование файлов параметров клиентской программой, вызвав её с параметром --no-defaults. Например:

    $> mysqladmin --no-defaults -u root version
    

    Файлы параметров, которые используют клиенты, перечислены в Разделе 4.2.2.2, «Использование файлов параметров». Переменные среды перечислены в Разделе 4.9, «Переменные среды».

  • Если вы получаете следующую ошибку, это означает, что вы используете неверный root пароль:

    $> mysqladmin -u root -pxxxx ver
    Access denied for user 'root'@'localhost' (using password: YES)
    

    Если вышеупомянутая ошибка возникает даже при отсутствии указанного пароля, это означает, что у вас есть неверный пароль, указанный в каком-либо файле параметров. Попробуйте параметр --no-defaults, как описано в предыдущем пункте.

    Дополнительную информацию о смене паролей см. в Разделе 6.2.10, «Назначение паролей учётным записям».

    Если вы потеряли или забыли пароль 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_name вы получаете ошибку Access denied, у вас может быть проблема с таблицей user. Проверьте это, выполнив mysql -u root mysql и выдав следующую SQL-команду:

    SELECT * FROM user;
    

    Результат должен содержать строку с столбцами Host и User, совпадающими с именем узла клиента и именем пользователя MySQL.

END_OF_DOCUMENT_MARKER
  • Если при попытке подключения с хоста, отличного от того, на котором запущен сервер 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 -pxxxx -h some_hostname ver
    Access denied for user 'root'@'' (using password: YES)
    

    Если вы пытаетесь подключиться как root и получаете следующую ошибку, это означает, что у вас нет строки в таблице user со значением столбца User равным 'root' и что mysqld не может разрешить имя хоста для вашего клиента:

    Access denied for user ''@'unknown'
    

    Эти ошибки указывают на проблему DNS. Чтобы исправить это, выполните команду mysqladmin flush-hosts, чтобы сбросить внутренний кеш хостов DNS. См. Раздел 5.1.11.2, «DNS-запросы и кеш хостов».

    Некоторые постоянные решения:

    • Определите, что не так с вашим DNS-сервером, и исправьте это.

    • Укажите IP-адреса, а не имена хостов, в таблицах предоставления прав MySQL.

    • Добавьте запись для имени клиентской машины в /etc/hosts в Unix или \windows\hosts в Windows.

    • Запустите mysqld с включенной системной переменной skip_name_resolve.

    • Запустите mysqld с параметром --skip-host-cache.

    • В Unix, если вы запускаете сервер и клиент на одной машине, подключайтесь к localhost. Для подключений к localhost программы MySQL пытаются подключиться к локальному серверу, используя файл сокета Unix, если только не указаны параметры подключения, гарантирующие, что клиент устанавливает TCP/IP-подключение. Для получения дополнительной информации см. Раздел 4.2.4, «Подключение к серверу MySQL с помощью параметров командной строки».

    • В Windows, если вы запускаете сервер и клиент на одной машине, и сервер поддерживает подключения через именованные каналы, подключайтесь к имени хоста . (точка). Подключения к . используют именованный канал, а не TCP/IP.

  • Если mysql -u root работает, но mysql -h your_hostname -u root приводит к Access denied (где your_hostname — фактическое имя хоста локального хоста), у вас может быть неправильное имя для вашего хоста в таблице user. Распространенной проблемой здесь является то, что значение Host в строке таблицы user указывает неквалифицированное имя хоста, но процедуры разрешения имен вашей системы возвращают полное доменное имя (или наоборот). Например, если у вас есть строка с хостом 'pluto' в таблице user, но ваш DNS сообщает MySQL, что ваше имя хоста — 'pluto.example.com', строка не работает. Попробуйте добавить строку в таблицу user, которая содержит IP-адрес вашего хоста в качестве значения столбца Host. (В качестве альтернативы вы можете добавить строку в таблицу user со значением Host, содержащим подстановочный знак (например, 'pluto.%'). Однако использование значений Host, оканчивающихся на %, небезопасно и не рекомендуется!)

  • Если mysql -u user_name работает, но mysql -u user_name some_db нет, вы не предоставили доступ данному пользователю к базе данных с именем some_db.

  • Если mysql -u user_name работает при выполнении на хосте сервера, но mysql -h host_name -u user_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 для перезагрузки таблиц предоставления прав. См. также Раздел 6.2.5, «Контроль доступа, этап 1: проверка подключения».

  • Если вы можете подключиться к серверу MySQL, но получаете сообщение Access denied каждый раз, когда вы выполняете оператор SELECT ... INTO OUTFILE или LOAD DATA, в вашей строке в таблице user не включена привилегия FILE.

  • Если вы изменяете таблицы предоставления прав напрямую (например, используя операторы INSERT, UPDATE или DELETE), и ваши изменения, по-видимому, игнорируются, помните, что вы должны выполнить оператор FLUSH PRIVILEGES или команду mysqladmin flush-privileges, чтобы сервер перезагрузил таблицы привилегий. В противном случае ваши изменения не будут иметь эффекта до следующего перезапуска сервера. Помните, что после изменения пароля root с помощью оператора UPDATE вам не нужно указывать новый пароль до сброса привилегий, поскольку сервер еще не знает, что вы изменили пароль.

  • Если ваши привилегии, по-видимому, изменились в середине сеанса, возможно, администратор MySQL изменил их. Перезагрузка таблиц предоставления прав влияет на новые клиентские подключения, но также влияет на существующие подключения, как указано в Разделе 6.2.9, «Когда вступают в силу изменения привилегий».

  • Если у вас возникли проблемы с доступом с помощью программы Perl, PHP, Python или ODBC, попробуйте подключиться к серверу с помощью mysql -u user_name db_name или mysql -u user_name -ppassword db_name. Если вы можете подключиться с помощью клиента mysql, проблема заключается в вашей программе, а не в правах доступа. (Между -p и паролем нет пробела; вы также можете использовать синтаксис --password=password для указания пароля. Если вы используете параметр -p или --password без значения пароля, MySQL запрашивает у вас пароль.)

  • Для целей тестирования запустите сервер mysqld с опцией --skip-grant-tables. Затем вы можете изменить таблицы разрешений MySQL и использовать оператор SHOW GRANTS для проверки того, повлияли ли ваши изменения должным образом. После того, как вы убедитесь в изменениях, выполните mysqladmin flush-privileges, чтобы сообщить серверу mysqld о необходимости перезагрузки разрешений. Это позволит вам начать использовать новые данные таблицы разрешений без остановки и перезапуска сервера.

  • Если ничего не помогает, запустите сервер mysqld с опцией отладки (например, --debug=d,general,query). Это выведет информацию о хосте и пользователе, которые пытались подключиться, а также информацию о каждом выполненном запросе. См. Раздел 5.8.3, «Пакет DBUG».

  • Если у вас возникли другие проблемы с таблицами разрешений MySQL, и вы задаёте вопрос на MySQL Community Slack, всегда предоставляйте дамп таблиц разрешений MySQL. Вы можете создать дамп таблиц с помощью команды mysqldump mysql. Чтобы отправить отчет об ошибке, см. инструкции в Разделе 1.5, «Как сообщать об ошибках или проблемах». В некоторых случаях вам может потребоваться перезапустить mysqld с опцией --skip-grant-tables для запуска mysqldump.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/problems-connecting.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API