Bu, buradaki cevabımdan neredeyse kelimesi kelimesine alınmış , ancak SO'ya sadece link cevaplarına kaşlarını açtığımızı biliyorum, bu yüzden siz de yaptığınızı hayal ediyorum :-)
Bu sorunu yaşıyorsanız ve Windows 7'den önce bir Windows sürümü kullanıyorsanız, bu muhtemelen sorunun cevabı değildir.
Bu neden oluyor?
Bu sorunun nedeni IPv4 ve IPv6'dır.
IP adresi yerine bir ana bilgisayar adı kullandığınızda, MySQL istemcisi önce AAAA
ad için bir (IPv6) ana bilgisayar araması çalıştırır ve adı başarıyla bir IPv6 adresine çözerse bu adresi dener. Adımlardan biri başarısız olursa (ad çözümlemesi veya bağlantı) IPv4'e geri döner, bir A
arama çalıştırır ve bunun yerine bu ana bilgisayarı dener.
Uygulamada bunun anlamı, IPv6 localhost
araması başarılı ancak MySQL'in IPv6 geridönüşüne bağlı olmaması durumunda, IPv4 geri dönüşü gerçekleşmeden ve bağlantı başarılı olmadan önce bir bağlantı zaman aşımı döngüsü beklemeniz gerekecektir.
Bu, Windows 7'den önce bir sorun değildi, çünkü localhost
çözünürlük anasistemler dosyası üzerinden yapıldı ve yalnızca önceden yapılandırılmış olarak geldi 127.0.0.1
- IPv6 karşılığı ile gelmedi ::1
.
Bununla birlikte, Windows 7'den bu yana, buradalocalhost
özetlenen nedenlerle çözümleme DNS çözümleyicisine yerleştirilmiştir . Bu, IPv6 aramasının başarılı olacağı anlamına gelir - ancak MySQL bu IPv6 adresine bağlı değildir, bu nedenle bağlantı başarısız olur ve bu soruda belirtilen gecikmeyi göreceksiniz.
Bu iyi. Bana bunu nasıl düzeltebileceğimi söyle!
Birkaç seçeneğiniz var. İnternete baktığımızda, genel "çözüm" IP adresini ad yerine açıkça kullanmak gibi görünüyor, ancak bunu yapmamanın birkaç nedeni var, her ikisi de taşınabilirlikle ilgili, her ikisi de tartışmasız önemli değil:
Komut dosyanızı yalnızca IPv6'yı destekleyen başka bir makineye taşırsanız, komut dosyanız artık çalışmaz.
Komut dosyanızı * nix tabanlı bir barındırma ortamına taşırsanız, sihirli dize localhost
MySQL istemcisinin yapılandırılmışsa bir Unix soketi kullanmayı tercih edeceği anlamına gelir, bu IP geri döngü tabanlı bağlantıdan daha verimlidir
Kulağa oldukça önemli geliyorlar mı?
Onlar değil. Uygulamanızı bu tür şeyleri bir yapılandırma dosyasında tanımlanacak şekilde tasarlamalısınız. Komut dosyanızı başka bir ortama taşırsanız, başka şeylerin de yapılandırılması gerekecektir.
Özetle, IP adresini kullanmak en iyi çözüm değildir , ancak büyük olasılıkla kabul edilebilir bir çözümdür.
Peki en iyi çözüm nedir?
En iyi yol, MySQL sunucusunun kullandığı bağlanma adresini değiştirmek olacaktır. Ancak, bu istendiği kadar basit değil. Apache, Nginx ve şimdiye kadar yapılmış olan diğer tüm akılcı ağ hizmeti uygulamalarının aksine, MySQL yalnızca tek bir bağlanma adresini destekler, bu yüzden sadece başka bir adres ekleme durumu değildir. Neyse ki, işletim sistemleri burada biraz büyü destekliyor, bu nedenle MySQL'in hem IPv4 hem de IPv6'yı aynı anda kullanmasını sağlayabiliriz.
MySQL 5.5.3 veya üstünü çalıştırıyor olmanız ve MySQL'i --bind-address=
komut satırı argümanıyla başlatmanız gerekir . Ne yapmak istediğinize bağlı olarak 4 seçenek belgeniz var:
Muhtemelen aşina olduğunuz ve muhtemelen (etkili bir şekilde) kullandığınız 0.0.0.0
. Bu, makinedeki tüm kullanılabilir IPv4 adreslerine bağlanır. IPv6'yı önemsemeseniz bile, muhtemelen bu en iyi şey değildir, çünkü aynı güvenlik risklerine maruz kalır ::
.
Açık bir IPv4 veya IPv6 adresi (örneğin 127.0.0.1
veya ::1
geri döngü için). Bu, sunucuyu bu adrese ve yalnızca bu adrese bağlar .
Sihirli dize ::
. Bu, MySQL'i IPv4 ve IPv6 modunda hem geri döngü hem de fiziksel arabirim adresleri üzerindeki her adrese bağlar. Bu muhtemelen bir güvenlik riskidir, bunu yalnızca uzak ana bilgisayarlardan gelen bağlantıları kabul etmek için MySQL'e ihtiyacınız varsa yapın.
Bir kullan IPv4 eşlenmiş IPv6 adresini . Bu, 4 -> 6 geçişi sırasında geriye dönük uyumluluk için IPv6'ya yerleşik özel bir mekanizmadır ve belirli bir IPv4 adresine ve IPv6 eşdeğerine bağlanmanıza olanak tanır. Bunun, "çift geri döngü" adresi dışında herhangi bir şey için yararlı olması pek olası değildir ::ffff:127.0.0.1
. Bu büyük olasılıkla çoğu kişi için en iyi çözümdür, yalnızca geri dönüşe bağlanır, ancak hem IPv4 hem de IPv6 bağlantılarına izin verir.
Hosts dosyasını değiştirmem gerekir mi?
HAYIR . Hosts dosyasını değiştirmeyin. DNS çözümleyicisi ne yapılacağını bilir localhost
, yeniden tanımlamanın en iyi etkisi olmaz ve en kötü ihtimalle çözümleyicinin kafasını karıştırır.
Ne olmuş --skip-name-resolve
?
Bu, ilgili ancak biraz farklı bir nedenden dolayı sorunu çözebilir.
Bu yapılandırma seçeneği olmadan, MySQL tüm istemci bağlantısı IP adreslerini bir PTR
DNS sorgusu aracılığıyla bir ana bilgisayar adına çözümlemeye çalışır . MySQL sunucunuz zaten IPv6 kullanabiliyorsa, ancak bağlantılar uzun sürüyorsa, bunun nedeni ters DNS ( PTR
) kaydının doğru yapılandırılmamış olması olabilir.
Ad çözümlemesinin devre dışı bırakılması bu sorunu düzeltir, ancak özellikle koşulda bir DNS adı kullanmak üzere yapılandırılmış erişim izinlerinin Host
başarısız olacağı başka etkileri de vardır .
Bunu yapacaksanız, tüm hibelerinizi adlar yerine IP adreslerini kullanacak şekilde yapılandırmanız gerekir.