Spec-Zone.ru › MySQL 9.2

8.2.22 Устранение неполадок при подключении к 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.) Убедитесь, что в каталоге базы данных mysql есть файл с именем user.MYD. Если нет, инициализируйте каталог данных. После этого и запуска сервера вы должны иметь возможность подключиться к серверу.

  • После свежей установки, если вы пытаетесь войти на сервер как 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? Если нет, выполните её. Структура таблиц разрешений иногда изменяется при добавлении новых возможностей, поэтому после обновления всегда необходимо убедиться, что ваши таблицы имеют текущую структуру. Инструкции см. в Главе 3, Обновление MySQL.

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

    $> mysql
    Client 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 -pxxxx ver
    Access denied for user 'root'@'localhost' (using password: YES)
    

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

END_OF_DOCUMENT_MARKER
  • Если при попытке подключения вы указываете имя хоста, но получаете сообщение об ошибке, где имя хоста не отображается или является 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. См. Раздел 7.1.12.3, “DNS Lookups and the Host Cache”.

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

    • Определите, что не так с вашим сервером 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, “Connecting to the MySQL Server Using Command Options”.

    • На 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, чтобы перезагрузить таблицы разрешений. См. также Раздел 8.2.6, “Access Control, Stage 1: Connection Verification”.

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

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

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

  • Если у вас проблемы с доступом через программу 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). Это выведет информацию о хосте и пользователе при попытке подключения, а также информацию о каждом выполненном запросе. См. Раздел 7.9.4, “Пакет DBUG”.

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

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

Spec-Zone.ru

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