Spec-Zone.ru › MySQL 5.7

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), см. Раздел 6.7, «SELinux».

B.3.2.2.1 Невозможно подключиться к серверу MySQL в Windows

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

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

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

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-5.7-en/can-not-connect-to-server.html

Spec-Zone.ru

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