Насколько я могу судить, это недавняя ошибка, которая начала возникать на моем локальном сервере:
Can't connect to MySQL server on 'localhost' (10048).
Мой сайт будет работать некоторое время, затем он будет случайным образом выдавать эту ошибку, а затем снова начнет работать. Есть какие-нибудь советы, как это исправить? Я искал в Интернете, и большинство людей утверждают, что это ошибка Windows, которая требует исправления реестра, но я хотел узнать, сталкивался ли кто-нибудь еще с этой проблемой и есть ли какой-нибудь лучший совет? Спасибо!
Я бы посоветовал взглянуть на вывод netstat -ano при возникновении этой ошибки. Если это Windows Server 2003, диапазон эфемерных портов по умолчанию составляет только 1024-5000. Если этот диапазон портов заполнен, вы не сможете создавать новые исходящие подключения, включая «исходящие» на localhost. Вы можете обойти это, изменив параметр MaxUserPort в реестре, возможно, вместе с параметром TCPTimedWaitDelay, если netstat показывает, что у вас много подключений в состоянии TIME_WAIT. 'netstat -ano | find / C ":"' даст вам (несколько вводящее в заблуждение) подсчет количества активных сокетов.
Однако, если вы обнаружите, что весь этот диапазон портов используется, как упоминалось другими, у вас может быть основная проблема с подключениями, которые не закрываются. Это может быть проблема с кодом.
Кроме того, если у вас есть веб-сервер и сервер базы данных, работающие на одном компьютере, вы можете рассмотреть протокол подключения, отличный от TCP / IP, например память или именованные каналы.
Благодаря сообщению jlupolt, поскольку он точно указал ключ к решению проблемы, с которой я столкнулся.
Некоторые рекламные баннеры с высокой посещаемостью привлекают большой трафик на наш сайт в течение короткого периода времени (часы), и случайным образом (не всегда) возникает ошибка «Не удается подключиться к серверу MySQL ...».
Использование памяти и загрузка ЦП сервера db все еще были очень низкими в этот период, а открытое соединение сервера mysql намного ниже предела max_connections. Так что это не должно быть проблемой mysql.
Следуя предложению jlupolt, мы обнаружили, что диапазон эфемерных портов по умолчанию (1024 ~ 5000) веб-сервера (не сервера db, в нашем случае это другая машина) полностью заполнен состоянием TIME_WAIT. После дальнейшего поиска мы нашли эту страницу:
В.5.2.2.1. Сбой подключения к серверу MySQL в Windows http://dev.mysql.com/doc/refman/5.1/en/can-not-connect-to-server.html
После повышения MaxUserPort до 20000 и понижения TcpTimedWaitDelay до 20 (требовалась перезагрузка) ошибка подключения никогда не возникала. Используемое нами значение MaxUserPort и TcpTimedWaitDelay может быть неоптимальным для вашего случая. Значения зависят от того, насколько быстро растет количество TCP / IP-соединений, и комбинация должна обеспечивать достаточное количество новых соединений и время для освобождения неиспользуемого соединения.
Решение:
Откройте редактор реестра. regedit
Набор TcpTimedWaitDelay:
найти HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
раздел реестра и создайте новое значение REG_DWORD с именем TcpTimedWaitDelay
.
Установите это значение в десятичное 30, шестнадцатеричное. 0×0000001e
. Это значение времени ожидания составляет 30 секунд.
Значение по умолчанию: 0xF0
(16229) время ожидания установлено на 240 секунд.
Набор MaxUserPort (для увеличения максимального подключения порта):
найти HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
раздел реестра и создайте новое значение REG_DWORD с именем MaxUserPort
.
Установите наименьшее десятичное значение 32768.
Значение по умолчанию: 5000 (десятичное).
Закройте редактор реестра и перезапустите систему Windows.
Вы можете убедиться, что закрываете все свои подключения к базе данных. Вы можете случайно оставить их открытыми при вызове своих запросов, и со временем Windows достигнет максимального количества подключений и выдаст ошибку «Невозможно подключиться». Когда вы попробуете еще раз немного позже, Windows может освободить несколько соединений, и вы снова сможете обратиться к базе данных.
Удачи и надеюсь, что это поможет.
В последнее время возникло несколько проблем с локальным хостом.
Загляните в / etc / hosts и убедитесь, что у вас нет ни одной записи для локального хоста (например: 127.0.0.1 localhost
) - некоторые из новых версий Linux (и Windows 7) недавно перестали это делать.
Кроме того, стоит проверить, привязан ли sql как к петле, так и к фактическому IP-адресу, и попытаться получить к нему доступ там.
Некоторые советы по отладке:
вы можете подключиться к порту TCP? Попробуйте telnet localhost 3306. Если отображается сообщение «Соединение отказано», у вас проблема с сетью.
Ваши соединения превышают максимальное количество соединений MySQL? Попробуйте увеличить значение переменной max_connections в my.cnf, а затем перезапустите MySQL.
Вы держите связи открытыми более 8 часов? MySQL автоматически закроет соединение через 8 часов. Есть разные вещи, которые вы можете сделать с этим - попробуйте поискать в Google, если это проблема.
Попробуйте подключиться напрямую к 127.0.0.1
В некоторых случаях при попытке подключения к «Localhost» будет предпринята попытка подключиться через внутреннее «сокетное» соединение, а не через сетевой интерфейс mysql, использование IP исправляет это.