Nếu bạn gặp sự cố này và sử dụng phiên bản Windows trước Windows 7, điều này có lẽ không phải là câu trả lời cho vấn đề của bạn.
Tại sao điều này xảy ra?
Nguyên nhân của sự cố này là IPv4 so với IPv6.
Khi bạn sử dụng tên máy chủ thay vì địa chỉ IP, trước tiên máy khách MySQL chạy tra cứu máy chủ AAAA
(IPv6) và thử địa chỉ này trước nếu nó giải quyết thành công tên thành địa chỉ IPv6. Nếu một trong hai bước thất bại (tên độ phân giải hoặc kết nối) nó sẽ dự phòng cho IPv4, chạy một tra cứu A
và thử máy chủ này thay thế.
Điều này có nghĩa trong thực tế là nếu tra cứu IPv6 localhost
là thành công nhưng MySQL không bị ràng buộc vào loopback IPv6, bạn sẽ cần phải chờ đợi cho chu kỳ thời gian chờ một kết nối (rõ ràng trên máy tính của OP này là 1 giây) trước khi dự phòng IPv4 xảy ra và kết nối thành công.
Đây không phải là vấn đề trước Windows 7, vì độ phân giải localhost
được thực hiện qua tệp máy chủ và được định cấu hình trước chỉ với 127.0.0.1
- không đi kèm với đối tác IPv6 ::1
.
Vì Windows 7, tuy nhiên, độ phân giải localhost
được tích hợp vào trình phân giải DNS, vì các lý do được nêu rõ here. Điều này có nghĩa là việc tra cứu IPv6 sẽ thành công - nhưng MySQL không bị ràng buộc với địa chỉ IPv6 đó, do đó kết nối sẽ thất bại và bạn sẽ thấy sự chậm trễ được nêu trong câu hỏi này.
Thật tuyệt. Chỉ cần cho tôi biết làm thế nào để sửa nó!
Bạn có một vài tùy chọn.Nhìn xung quanh internet, "giải pháp" chung dường như sử dụng địa chỉ IP một cách rõ ràng thay vì tên, nhưng có một vài lý do không làm điều này, cả hai tính di động liên quan, cả hai đều không quan trọng:
Nếu bạn di chuyển tập lệnh của mình sang một máy khác mà chỉ hỗ trợ IPv6, tập lệnh của bạn sẽ không hoạt động nữa.
Nếu bạn di chuyển tập lệnh của mình sang môi trường lưu trữ * nix, chuỗi ma thuật localhost
có nghĩa là máy khách MySQL muốn sử dụng ổ cắm Unix nếu được định cấu hình, hiệu quả hơn kết nối dựa trên vòng lặp IP
Nghe có vẻ khá quan trọng?
Chúng không có. Bạn nên thiết kế ứng dụng của mình để loại điều này được định nghĩa trong tệp cấu hình. Nếu bạn di chuyển kịch bản của mình sang một môi trường khác, rất có thể những thứ khác cũng sẽ cần phải cấu hình.
Tóm lại, việc sử dụng địa chỉ IP không phải là giải pháp tốt nhất, nhưng rất có thể là giải pháp có thể chấp nhận được.
Vậy giải pháp tốt nhất là gì?
Cách tốt nhất là thay đổi địa chỉ liên kết mà máy chủ MySQL sử dụng. Tuy nhiên, điều này không đơn giản như người ta có thể thích. Không giống như Apache, Nginx và hầu như mọi ứng dụng dịch vụ mạng lành mạnh khác từng được tạo ra, MySQL chỉ hỗ trợ một địa chỉ liên kết duy nhất, vì vậy nó không chỉ là trường hợp thêm một địa chỉ khác. May mắn thay, các hệ điều hành hỗ trợ một chút phép thuật ở đây, vì vậy chúng ta có thể cho phép MySQL sử dụng đồng thời cả IPv4 và IPv6.
Bạn cần chạy MySQL 5.5.3 hoặc mới hơn và bạn cần khởi động MySQL với đối số dòng lệnh --bind-address=
(hoặc đặt tùy chọn tương ứng trong my.ini). Bạn có 4 lựa chọn docs, tùy thuộc vào những gì bạn muốn làm:
Một bạn có thể quen với, và một trong đó bạn có khả năng nhất (hiệu quả) sử dụng, 0.0.0.0
. Điều này liên kết với tất cả các địa chỉ IPv4 có sẵn trên máy. Điều này thực sự có lẽ không phải là điều tốt nhất để làm ngay cả khi bạn không quan tâm đến IPv6, vì nó bị rủi ro bảo mật tương tự như ::
.
Địa chỉ IPv4 hoặc IPv6 rõ ràng (ví dụ: 127.0.0.1
hoặc ::1
để lặp lại). Điều này liên kết máy chủ với địa chỉ đó và chỉ địa chỉ đó.
Chuỗi ma thuật ::
. Điều này sẽ liên kết MySQL với mọi địa chỉ trên máy, cả địa chỉ giao diện lặp và địa chỉ vật lý, trong chế độ IPv4 và IPv6. Đây có thể là một nguy cơ bảo mật, chỉ làm điều này nếu bạn cần MySQL chấp nhận các kết nối từ máy chủ từ xa.
Sử dụng IPv4-mapped IPv6 address. Đây là một cơ chế đặc biệt được tích hợp vào IPv6 để tương thích ngược trong quá trình chuyển đổi 4 -> 6, và nó cho phép bạn liên kết với một địa chỉ IPv4 cụ thể và tương đương với IPv6. Điều này có vẻ không hữu ích đối với bạn đối với bất kỳ điều gì khác ngoài địa chỉ "lặp lại kép" ::ffff:127.0.0.1
.Đây có thể là giải pháp tốt nhất cho hầu hết mọi người, chỉ liên kết với loopback nhưng cho phép cả kết nối IPv4 và IPv6.
Tôi có cần phải sửa đổi tệp máy chủ không?
NO. Không sửa đổi tệp máy chủ. Trình phân giải DNS biết phải làm gì với localhost
, việc xác định lại nó sẽ tốt nhất sẽ không có hiệu lực, và ít nhất là gây nhầm lẫn địa ngục với người giải quyết.
Điều gì về --skip-name-resolve
?
Điều này cũng có thể khắc phục được sự cố/được yêu cầu khắc phục sự cố, vì lý do có liên quan nhưng hơi khác.
Nếu không có tùy chọn cấu hình này, MySQL sẽ cố gắng giải quyết tất cả địa chỉ IP kết nối máy khách với tên máy chủ thông qua truy vấn DNS PTR
. Nếu máy chủ MySQL của bạn đã được kích hoạt để sử dụng IPv6 nhưng kết nối vẫn mất nhiều thời gian, có thể do bản ghi DNS ngược (PTR
) không được định cấu hình chính xác.
Tắt độ phân giải tên sẽ khắc phục sự cố này, nhưng có các nhánh khác, đặc biệt là bất kỳ quyền truy cập nào được định cấu hình để sử dụng tên DNS trong điều kiện Host
sẽ bị lỗi.
Nếu bạn định thực hiện việc này, bạn sẽ cần phải định cấu hình tất cả các khoản tài trợ của mình để sử dụng địa chỉ IP thay vì tên.
-1 không jquery gì! – PeeHaa
TL; DR! Lol, thực ra, câu trả lời này là hoàn hảo. Bạn có biết liệu MySQL 5.6 có giải quyết được vấn đề không? Thay vào đó, tôi có thể nâng cấp. (Nhưng, nghiêm túc, không có jQuery?) – MaxArt
Điều này có vẻ là một vấn đề rất phổ biến cho Windows 8 máy với các truy vấn mysql rất chậm (bình luận cho SEO). – Josiah