Spec-Zone.ru › MySQL 8.4

B.3.2.2 Не удается подключиться к серверу MySQL [локальный]

  • B.3.2.2.1 Подключение к серверу MySQL не удается в Windows

Клиент MySQL на Unix может подключаться к серверу mysqld двумя способами: с использованием файла Unix-сокет для подключения через файл в файловой системе (по умолчанию /tmp/mysql.sock) или с использованием TCP/IP, который подключается через номер порта. Подключение через Unix-сокет быстрее, чем TCP/IP, но может использоваться только при подключении к серверу на том же компьютере. Файл Unix-сокет используется, если вы не указываете имя хоста или если вы указываете специальное имя хоста localhost.

Если сервер MySQL работает в Windows, вы можете подключиться с использованием TCP/IP. Если сервер запущен с включенной системной переменной named_pipe, вы также можете подключиться с помощью именованных каналов, если клиент запущен на том же хосте, где работает сервер. Имя именованного канала по умолчанию равно MySQL. Если вы не указываете имя хоста при подключении к mysqld, клиент MySQL сначала пытается подключиться к именованному каналу. Если это не работает, он подключается к порту TCP/IP. Вы можете принудительно использовать именованные каналы в Windows, используя . в качестве имени хоста.

Ошибка (2002) Can't connect to ... обычно означает, что сервер MySQL не запущен на системе, или что вы используете неправильное имя файла Unix-сокет или номер порта TCP/IP при попытке подключения к серверу. Вы также должны проверить, не заблокирован ли используемый порт TCP/IP брандмауэром или службой блокировки портов.

Ошибка (2003) Can't connect to MySQL server on 'server' (10061) указывает на отказ сетевого соединения. Необходимо проверить, запущен ли сервер MySQL, включены ли у него сетевые соединения и соответствует ли указанный вами сетевой порт тому, который настроен на сервере.

Начните с проверки, запущен ли процесс с именем mysqld на вашем хосте сервера. (Используйте ps xa | grep mysqld на Unix или Диспетчер задач в Windows.) Если такого процесса нет, необходимо запустить сервер. См. Раздел 2.9.2, «Запуск сервера».

Если процесс mysqld запущен, вы можете проверить это, выполнив следующие команды. Номер порта или имя файла Unix-сокет могут быть другими в вашей настройке. host_ip представляет собой IP-адрес машины, на которой запущен сервер.

$> mysqladmin version
$> mysqladmin variables
$> mysqladmin -h `hostname` version variables
$> mysqladmin -h `hostname` --port=3306 version
$> mysqladmin -h host_ip version
$> mysqladmin --protocol=SOCKET --socket=/tmp/mysql.sock version

Обратите внимание на использование обратных кавычек вместо прямых кавычек с командой hostname; это приводит к тому, что вывод hostname (то есть текущее имя хоста) подставляется в команду mysqladmin. Если у вас нет команды hostname или вы работаете в Windows, вы можете вручную ввести имя хоста вашей машины (без обратных кавычек) после опции -h. Также можно попробовать -h 127.0.0.1 для подключения к локальному хосту через TCP/IP.

Убедитесь, что сервер не настроен на игнорирование сетевых подключений или (если вы пытаетесь подключиться удаленно) не настроен на прослушивание только локально на своих сетевых интерфейсах. Если сервер был запущен с включенной системной переменной skip_networking, он вообще не может принимать подключения TCP/IP. Если сервер был запущен с системной переменной bind_address, установленной на 127.0.0.1, он прослушивает подключения TCP/IP только локально на интерфейсе петля и не принимает удалённые подключения.

Проверьте, не блокирует ли брандмауэр доступ к MySQL. Брандмауэр может быть настроен в зависимости от выполняемого приложения или номера порта, используемого MySQL для связи (по умолчанию 3306). В Linux или Unix проверьте конфигурацию таблиц IP (или аналогичной) для обеспечения того, что порт не заблокирован. В Windows приложения, такие как ZoneAlarm или Брандмауэр Windows, могут потребовать настройки для того, чтобы не блокировать порт MySQL.

Вот некоторые причины, по которым может возникнуть ошибка Can't connect to local MySQL server:

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

  • Вы запускаете сервер MySQL в Windows с большим количеством подключений TCP/IP к нему. Если вы часто сталкиваетесь с этой ошибкой со стороны клиентов, вы можете найти обходной путь здесь: Раздел B.3.2.2.1, «Подключение к серверу MySQL не удается в Windows».

  • Кто-то удалил файл Unix-сокет, используемый mysqld (по умолчанию /tmp/mysql.sock). Например, у вас может быть задача cron, которая удаляет старые файлы из каталога /tmp. Вы всегда можете выполнить mysqladmin version, чтобы проверить, действительно ли существует файл Unix-сокет, который пытается использовать mysqladmin. В этом случае решение заключается в изменении задачи cron для того, чтобы она не удаляла mysql.sock или поместить файл сокета в другое место. См. Раздел B.3.3.6, «Как защитить или изменить файл Unix-сокет MySQL».

  • Вы запустили сервер mysqld с опцией --socket=/path/to/socket, но забыли сообщить клиентским программам новое имя файла сокета. Если вы изменяете имя пути к файлу сокета для сервера, вы также должны уведомить клиенты MySQL. Вы можете сделать это, указав ту же опцию --socket при запуске клиентских программ. Также необходимо убедиться, что клиенты имеют разрешение на доступ к файлу mysql.sock. Чтобы узнать, где находится файл сокета, вы можете выполнить:

    $> netstat -ln | grep mysql
    

    См. Раздел B.3.3.6, «Как защитить или изменить файл Unix-сокет MySQL».

  • Вы используете Linux и одна нить сервера завершилась аварийно (dumped core). В этом случае необходимо убить другие нити mysqld (например, с помощью kill) перед перезапуском сервера MySQL. См. Раздел B.3.3.3, «Что делать, если MySQL постоянно выходит из строя».

  • Сервер или клиентская программа могут не иметь необходимых прав доступа к каталогу, содержащему файл Unix-сокет, или к самому файлу сокета. В этом случае необходимо либо изменить права доступа к каталогу или файлу сокета так, чтобы к ним могли получить доступ сервер и клиенты, либо перезапустить mysqld с опцией --socket, которая указывает имя файла сокета в каталоге, где сервер может его создать, и где к нему могут получить доступ клиентские программы.

Если вы получаете сообщение об ошибке Can't connect to MySQL server on some_host, вы можете попробовать следующее, чтобы выяснить причину проблемы:

  • Проверьте, работает ли сервер на данном хосте, выполнив telnet some_host 3306 и несколько раз нажав Enter. (3306 — это номер порта MySQL по умолчанию. Измените значение, если ваш сервер прослушивает другой порт.) Если сервер MySQL запущен и прослушивает порт, вы должны получить ответ, который включает номер версии сервера. Если вы получите ошибку, такую как telnet: Unable to connect to remote host: Connection refused, значит сервер не запущен на данном порту.

  • Если сервер запущен на локальном хосте, попробуйте подключиться с помощью mysqladmin -h localhost variables, используя файл Unix-сокет. Проверьте номер порта TCP/IP, на котором сервер настроен на прослушивание (это значение переменной port).

  • Если вы работаете под Linux и включён Security-Enhanced Linux (SELinux), см. Раздел 8.7, «SELinux».

B.3.2.2.1 Ошибка подключения к серверу MySQL в Windows

При работе сервера MySQL в Windows с большим количеством TCP/IP-соединений, если клиенты часто получают ошибку Can't connect to MySQL server, причина может заключаться в ограниченном количестве временных портов (эпизодических портов), предоставляемых Windows для этих соединений.

Цель TIME_WAIT — сохранять готовность соединения для приема пакетов даже после его закрытия. Это необходимо, поскольку маршрутизация в интернете может привести к задержке доставки пакета, и он может прийти после того, как обе стороны согласятся на закрытие соединения. Если порт уже используется для нового подключения, этот пакет от старого соединения может нарушить протокол или поставить под угрозу конфиденциальную информацию из первоначального соединения. Задержка TIME_WAIT предотвращает это, гарантируя, что порт не сможет быть повторно использован до истечения некоторого времени, необходимого для прибытия задержанных пакетов.

На локальных сетях (LAN) можно значительно сократить TIME_WAIT, так как вероятность задержки доставки пакетов гораздо ниже, чем в интернете, где расстояния и задержки больше.

Windows предоставляет пользователям временные TCP-порты. После закрытия порта он остается в состоянии TIME_WAIT в течение 120 секунд. Порт снова становится доступным только после истечения этого времени. Диапазон портов по умолчанию зависит от версии Windows, и в более старых версиях он может быть ограничен:

  • Windows до версии Server 2003: Порты в диапазоне 1025–5000

  • Windows Vista, Server 2008 и более новые версии: Порты в диапазоне 49152–65535

Малый запас доступных TCP-портов (5000), а также большое количество TCP-портов, открывающихся и закрывающихся за короткий период времени, в сочетании со статусом TIME_WAIT, создают высокую вероятность исчерпания портов. Существует два способа решения этой проблемы:

  • Снизить быстрое потребление TCP-портов, используя пулы соединений или постоянные подключения, где это возможно

  • Настройка некоторых параметров в реестре Windows (см. ниже)

Важно

Следующая процедура предполагает изменения в реестре Windows. Перед внесением изменений в реестр обязательно создайте его резервную копию и убедитесь, что вы знаете, как восстановить его в случае возникновения проблем. Для получения информации о резервном копировании, восстановлении и редактировании реестра просмотрите следующую статью в базе знаний Майкрософт: http://support.microsoft.com/kb/256986/EN-US/.

  1. Запустите редактор реестра (Regedt32.exe).

  2. Найдите следующий ключ в реестре:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    
  3. В меню Edit выберите Add Value, а затем добавьте следующее значение реестра:

    Value Name: MaxUserPort
    Data Type: REG_DWORD
    Value: 65534
    

    Это устанавливает количество доступных временных портов для любого пользователя. Допустимый диапазон — от 5000 до 65534 (десятичное). Значение по умолчанию — 0x1388 (5000 в десятичной системе).

  4. В меню Edit выберите Add Value, а затем добавьте следующее значение реестра:

    Value Name: TcpTimedWaitDelay
    Data Type: REG_DWORD
    Value: 30
    

    Это устанавливает количество секунд, в течение которых TCP-соединение должно находиться в состоянии TIME_WAIT, прежде чем закрыть его. Допустимый диапазон — от 30 до 300 (десятичное), хотя рекомендуется уточнить последние разрешенные значения у Майкрософт. Значение по умолчанию — 0x78 (120 в десятичной системе).

  5. Закройте редактор реестра.

  6. Перезагрузите компьютер.

Примечание: отмена вышеописанных изменений должна быть столь же простой, как удаление созданных записей реестра.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/can-not-connect-to-server.html

Spec-Zone.ru

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