Це було взято майже дослівно з моєї відповіді тут , але я знаю, що ми нахмурилися на відповіді, що стосуються лише посилань, так що я думаю, що ви теж зробите :-)
Якщо у вас є ця проблема і ви використовуєте версію Windows до Windows 7, це, мабуть, не є відповіддю на вашу проблему.
Чому це відбувається?
Причиною цієї проблеми є IPv4 проти IPv6.
При використанні імені хоста замість IP - адреси клієнт MySQL першим запускає AAAA
(IPv6) пошук хоста для імені, і намагається цю адресу першої , якщо вона успішно вирішує ім'я на адресу IPv6. Якщо будь-який крок не вдається (дозвіл імені або з'єднання), він повернеться до IPv4, запустивши A
пошук і замість цього спробуйте цей хост.
Це означає на практиці, що якщо localhost
пошук IPv6 успішний, але MySQL не пов'язаний із зворотним зв'язком IPv6, вам доведеться зачекати один цикл очікування підключення до того, як відбудеться падіння IPv4 і успішне з'єднання.
Це не було проблемою до Windows 7, тому що localhost
вирішення було виконано за допомогою файлу хостів, і він був попередньо налаштований лише для цього 127.0.0.1
- він не постачався з його аналогом IPv6 ::1
.
Оскільки Windows 7, однак, localhost
роздільна здатність вбудована у DNS-резолюцію з причин, зазначених тут . Це означає, що пошук IPv6 тепер буде успішним - але MySQL не пов'язаний з цією IPv6 адресою, тому з’єднання не вдасться, і ви побачите затримку, викладену в цьому запитанні.
Це мило. Просто скажіть, як це вже виправити!
У вас є кілька варіантів. Озираючись в Інтернеті, загальним «рішенням», здається, є використання IP-адреси явно замість імені, але є кілька причин цього не робити, обидві пов’язані з портативністю, обидва, мабуть, не важливі:
Якщо ви перемістите свій скрипт на іншу машину, яка підтримує лише IPv6, ваш сценарій більше не працюватиме.
Якщо ви перемістите свій скрипт у середовище хостингу на основі * nix, магічна рядок localhost
означатиме, що клієнт MySQL вважає за краще використовувати сокет Unix, якщо такий налаштований, це більш ефективно, ніж підключення на основі IP-петлі.
Хоча вони звучать досить важливо?
Вони ні. Ви повинні проектувати свою програму так, щоб ця річ була визначена у файлі конфігурації. Якщо ви перемістите свій сценарій в інше середовище, швидше за все, знадобиться і конфігурація інших речей.
Підсумовуючи, використання IP-адреси - не найкраще рішення, але, швидше за все, прийнятне.
То яке найкраще рішення?
Найкращим способом було б змінити адресу прив’язки, яку використовує сервер MySQL. Однак це не так просто, як можна було б хотіти. На відміну від Apache, Nginx та майже будь-якого іншого застосованого сервісного мережевого додатка, MySQL підтримує лише одну прив’язану адресу, тому це не просто випадок додавання ще однієї. На щастя, тут операційні системи підтримують трохи магії, тому ми можемо дозволити MySQL одночасно використовувати і IPv4, і IPv6.
Вам потрібно запустити MySQL 5.5.3 або пізнішої версії, і вам потрібно запустити MySQL з --bind-address=
аргументу командного рядка. У вас є 4 варіанти документа , залежно від того, що ви хочете зробити:
Один ви, ймовірно , знайомі, і один , що ви, швидше за все (ефективно) , використовуючи, 0.0.0.0
. Це пов'язує всі доступні адреси IPv4 на апараті. Це насправді, мабуть, не найкраще, навіть якщо ви не піклуєтесь про IPv6, оскільки це несе ті самі ризики безпеки, що і ::
.
Явна IPv4 або IPv6 адреса (наприклад, 127.0.0.1
або ::1
для зворотного зв'язку). Це пов'язує сервер із цією адресою та лише з цією адресою.
Чарівна струна ::
. Це прив’яже MySQL до кожної адреси на машині, як зворотної, так і фізичної адреси інтерфейсу, в режимі IPv4 та IPv6. Це потенційно загрожує безпеці, зробіть це лише в тому випадку, якщо вам потрібно MySQL, щоб прийняти з'єднання від віддалених хостів.
Використовуйте відображену IPv4 адресу IPv6 . Це спеціальний механізм, вбудований у IPv6 для зворотної сумісності під час переходу 4 -> 6, і він дозволяє прив'язуватися до конкретної адреси IPv4 та її еквівалента IPv6. Це навряд чи стане в нагоді вам для будь-якого іншого, крім адреси "подвійної петлі" ::ffff:127.0.0.1
. Це, швидше за все, найкраще рішення для більшості людей, лише прив'язуючись до циклу зворотного зв'язку, але дозволяє підтримувати як IPv4, так і IPv6.
Чи потрібно змінювати файл хостів?
НІ . Не змінюйте файл хостів. Резолютор DNS знає, що з цим робити localhost
, перевизначення цього в кращому випадку не матиме ефекту, а в гіршому випадку переплутає пекло з резолюції.
Про що --skip-name-resolve
?
Це також може вирішити проблему з пов’язаної, але трохи іншої причини.
Без цього параметра налаштування MySQL намагатиметься вирішити всі IP-адреси підключення клієнта до імені хоста за допомогою PTR
DNS-запиту. Якщо ваш сервер MySQL вже ввімкнено для використання IPv6, але підключення все ще тривалий час, можливо, тому, що зворотний запис DNS ( PTR
) неправильно налаштований.
Якщо вимкнути дозвіл імен, виправите цю проблему, але вона має інші наслідки, зокрема, що будь-які дозволи доступу, налаштовані для використання імені DNS в Host
умові, зараз не вдасться.
Якщо ви збираєтесь це робити, вам потрібно буде налаштувати всі свої гранти для використання IP-адрес замість імен.