Điều này được lấy gần như nguyên văn từ câu trả lời của tôi ở đây , nhưng tôi biết chúng tôi cau mày với câu trả lời chỉ liên kết trên SO nên tôi tưởng tượng các bạn cũng làm như vậy :-)
Nếu bạn đang gặp vấn đề này và sử dụng phiên bản Windows trước Windows 7, đây có lẽ không phải là câu trả lời cho vấn đề của bạn.
Tại sao chuyện này đang xảy ra?
Nguyên nhân của vấn đề 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 sẽ chạy AAAA
tìm tên máy chủ (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 không thành công (độ phân giải tên hoặc kết nối), nó sẽ chuyển sang IPv4, A
thay vào đó hãy chạy tra cứu và thử máy chủ này.
Thực tế điều này có nghĩa là nếu việc localhost
tra cứu IPv6 thành công nhưng MySQL không bị ràng buộc với vòng lặp IPv6, bạn sẽ cần đợi một chu kỳ hết thời gian kết nối 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ì localhost
độ phân giải được thực hiện thông qua tệp máy chủ và nó chỉ được cấu hình sẵn 127.0.0.1
- nó không đi kèm với đối tác IPv6 ::1
.
Tuy nhiên, vì Windows 7, localhost
độ phân giải được tích hợp vào bộ giải quyết DNS, vì những lý do được nêu ở đây . Điều này có nghĩa là việc tra cứu IPv6 bây giờ sẽ thành công - nhưng MySQL không bị ràng buộc với địa chỉ IPv6 đó, vì vậy kết nối sẽ thất bại và bạn sẽ thấy độ 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 chữa nó!
Bạn có một vài lựa chọn. Nhìn trên internet, "giải pháp" chung dường như là 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 đều liên quan đến tính di động, 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 chỉ hỗ trợ IPv6, tập lệnh của bạn sẽ không còn hoạt động.
Nếu bạn di chuyển tập lệnh của mình sang môi trường lưu trữ dựa trên * nix, chuỗi ma thuật localhost
có nghĩa là máy khách MySQL sẽ thích sử dụng ổ cắm Unix nếu được cấu hình, điều này hiệu quả hơn kết nối dựa trên vòng lặp IP
Họ nghe có vẻ khá quan trọng?
Họ không. Bạn nên thiết kế ứng dụng của mình sao cho loại điều này được xác định trong tệp cấu hình. Nếu bạn di chuyển tập lệnh 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 cấu hình.
Nói tóm lại, bằng cách sử dụng địa chỉ IP không phải là tốt nhất giải pháp, nhưng nó rất có thể là một ai chấp nhận được.
Vậy đâu là giải pháp tốt nhất?
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ể muốn. Không giống như Apache, Nginx và hầu hết 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 đây 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 tôi 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 trở lên và bạn cần khởi động MySQL bằng --bind-address=
đối số dòng lệnh. Bạn có 4 tùy chọn tài liệu , tùy thuộc vào những gì bạn muốn làm:
Người mà bạn có thể quen thuộc, và người mà bạn có khả năng nhất (sử dụng) một cách hiệu quả , 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. Đâ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ó chịu rủi ro bảo mật tương tự như ::
.
Một địa chỉ IPv4 hoặc IPv6 rõ ràng (ví dụ 127.0.0.1
hoặc ::1
cho loopback). Với phím tắt này, máy chủ đến đị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 vòng lặp và giao diện vật lý, ở chế độ IPv4 và IPv6. Đây có thể là một rủi ro bảo mật, chỉ làm điều này nếu bạn cần MySQL chấp nhận kết nối từ các máy chủ từ xa.
Sử dụng địa chỉ IPv6 được ánh xạ IPv4 . Đây là một cơ chế đặc biệt được tích hợp trong 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 IPv6. Điều này khá khó có thể hữu ích cho bạn cho bất cứ điều gì ngoài địa chỉ "loopback kép" ::ffff:127.0.0.1
. Đây rất có thể là giải pháp tốt nhất cho hầu hết mọi người, chỉ ràng buộc với loopback nhưng cho phép cả kết nối IPv4 và IPv6.
Tôi có cần sửa đổi tập tin máy chủ không?
NO . Đừng sửa đổi tập tin máy chủ. Trình phân giải DNS biết phải làm gì với localhost
, xác định lại nó sẽ không có hiệu lực và tệ nhất là nhầm lẫn giữa địa ngục với trình phân giải.
Thế còn --skip-name-resolve
?
Điều này cũng có thể khắc phục vấn đề, vì một lý do liên quan nhưng hơi khác nhau.
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ả các địa chỉ IP kết nối máy khách thành tên máy chủ thông qua PTR
truy vấn DNS. Nếu máy chủ MySQL của bạn đã được kích hoạt để sử dụng IPv6 nhưng các kết nối vẫn mất nhiều thời gian, có thể là do PTR
bản ghi DNS ( ) ngược không được định cấu hình chính xác.
Vô hiệu hóa độ phân giải tên sẽ khắc phục vấn đề này, nhưng nó có các phân nhánh khác, đáng chú ý là mọi quyền truy cập được định cấu hình để sử dụng tên DNS trong Host
điều kiện sẽ không thành công.
Nếu bạn định làm điều 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.