MySQL không thể kết nối qua mạng localhost trực tuyến, chỉ 127.0.0.1


27

đây là một phần bí ẩn đối với tôi Cách duy nhất tôi có thể kết nối với MySQL là nếu tôi gọi nó qua "127.0.0.1" ... ví dụ, tập lệnh kết nối PHP của tôi sẽ KHÔNG hoạt động với localhost

Tôi đang chạy Mac OS X Lion, tích hợp apache2, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
Đây có thể là lỗi máy chủ nhiều hơn, nhưng hãy đảm bảo tệp máy chủ của bạn có bí danh localhost.
Matt

127.0.0.1 localhost nằm trong tệp máy chủ của tôi.
dcolumbus

Mở dấu nhắc lệnh và gõ ping localhostvà xem những gì nó nói.
Steve Robbins

64 byte từ 127.0.0.1: icmp_seq = 0 ttl = 64 time = 0.100 ms 64 byte từ 127.0.0.1: icmp_seq = 1 ttl = 64 time = 0.102 ms 64 byte từ 127.0.0.1: icmp_seq = 2 ttl = 64 ms
dcolumbus

Câu trả lời:


26

MySQL sẽ cố gắng kết nối với ổ cắm unix nếu bạn bảo nó kết nối với "localhost". Nếu bạn bảo nó kết nối với 127.0.0.1, bạn đang buộc nó kết nối với ổ cắm mạng. Vì vậy, có lẽ bạn đã cấu hình MySQL để chỉ nghe ổ cắm mạng và không nghe ổ cắm hệ thống tệp.

Những gì chính xác là sai với ổ cắm unix của bạn là khó để nói. Nhưng tôi khuyên bạn nên đọc trang này trên hướng dẫn tham khảo MySQL. Điều này sẽ giúp bạn.

CẬP NHẬT: Dựa trên câu hỏi được cập nhật: Tham số "socket" sẽ giống như thế này: "/var/lib/mysql/mysql.sock". Trang này trong Tài liệu tham khảo có thêm một số thông tin.

Ở đây bạn có sự khởi đầu của tập tin /etc/my.cnf của tôi:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Tập tin của bạn phải tương tự Sau đó, vấn đề của bạn nên được giải quyết. Đừng quên khởi động lại máy chủ MySQL trước khi bạn kiểm tra nó.


1
Wow: "Tệp ổ cắm Unix được sử dụng nếu bạn không chỉ định tên máy chủ hoặc nếu bạn chỉ định tên máy chủ lưu trữ đặc biệt localhost." Điều đó có vẻ ... không trực quan. Do đó tất cả các câu trả lời khác.
Đánh dấu Wagner

Đó là điều tốt để biết +1
Matt

Tôi đánh giá cao lý thuyết ... chỉ không biết câu trả lời là gì.
dcolumbus

@dcolumbus: Như tôi đã viết, thật khó để nói. Những gì tôi có thể khuyên bạn là mở một giao diện điều khiển và chỉ cần viết lệnh "mysql". Có lẽ bạn nhận được nhiều thông tin hơn sau đó. Một điều nữa là nhìn vào tệp nhật ký. Của tôi nằm trong thư mục / var / log / và được gọi là mysql.log. Bạn có thể có một tên khác hoặc một vị trí khác. Nếu bạn có thể cung cấp cho chúng tôi nhiều thông tin hơn thì có lẽ chúng tôi có thể giúp bạn tốt hơn.
Raffael Luthiger

2
php.ini có các tham chiếu đến "/var/mysql/mysql.sock" (chính xác là 3 vị trí) cần được đổi thành "/tmp/mysql.sock" ... Cảm ơn bạn đã giúp đỡ!
dcolumbus

8

Bạn có thể đã bật IPv6, localhost rất có thể của nó sẽ phân giải thành ipv6 localhost, không được xác định trong cấu hình msql của bạn.

ive cũng gặp vấn đề khi tôi phải thêm 'localhost' thay cho '127.0.0.1' vào các mạng con được phép cho người dùng đó, không hiểu tại sao (tôi đã sử dụng ipv4 và cách đây một thời gian) nhưng nó đáng để thử.


Bạn có thể kiểm tra điều này bằng cách xem liệu 'host localhost' tại dòng lệnh trả về :: 1 cũng như 127.0.0.1. Nếu vậy, bạn có thể xóa ánh xạ :: 1 khỏi / private / etc / hosts hoặc cấu hình lại MySQL để nghe trên địa chỉ IPv6 :: 1 cũng như 127.0.0.1
David North

Tôi nghĩ rằng tôi nhớ đã đọc ở đâu đó rằng IPv6 được bật theo mặc định trên Mac OS X ... có phải vậy không?
dcolumbus

ipv6 được kích hoạt cho hầu hết các hệ điều hành hiện đại ngày nay, trên osx10.6 và được bật theo mặc định.
Silverfire

sai rồi. Localhost có ý nghĩa đặc biệt đối với các máy khách mysql - hãy xem serverfault.com/a/295300/67675
poige

5

Đối với tôi, php dựng sẵn của OSX được cấu hình để sử dụng một ổ cắm unix khác với mysql của homebrew. Do đó, nó không thể kết nối thông qua localhost sử dụng ổ cắm đó.

Tôi đã sửa nó bằng một bản hack nhanh bằng cách liên kết đường dẫn socket được cấu hình của php để trỏ đến một mysql thực sự sử dụng.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Các lệnh chẩn đoán sau đây rất hữu ích.

Kiểm tra đường dẫn ổ cắm mặc định được sử dụng bởi php và mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Kết nối bằng ổ cắm được chỉ định:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Xác định loại máy khách mysql đang sử dụng để kết nối:

lsof | egrep '^mysql .*(IPv|unix)'

2

Bạn có thể kiểm tra mysql/conf/my.conf(cấu trúc thư mục khá giống với OSx) để xem có skip-networkingbị thiếu không? Nếu vậy, hãy thêm một #dòng phía trước và khởi động lại máy chủ mysql.

Tôi thực sự đã có một vấn đề tương tự một thời gian trước (mặc dù đó không phải là trong OSx), vì vậy tôi nghĩ rằng nó có thể đáng để thử.


1
Tại sao điều này bị hạ cấp? Một lời giải thích sẽ hữu ích.
karllindmark

Tôi đã không bỏ phiếu cho bạn, nhưng câu trả lời của bạn thực sự trái ngược với những gì OP đang hỏi. Nhưng tôi ủng hộ bạn vì tôi vật lộn với điều kiện ngược lại - sẽ kết nối qua ổ cắm, nhưng KHÔNG qua mạng. Nhân tiện, tôi KHÔNG THỂ sửa cái này qua my.conf; Tôi đã phải đặt nó trên dòng lệnh: "mysqlf --skip_networking = 0 ..."
Jan Steinman

2

PHP vẫn đang cố gắng sử dụng vị trí ổ cắm mặc định. Vấn đề này có thể xuất hiện nếu bạn đã di chuyển thư mục MariaDB / MySQL từ / var / lib / mysql sang vị trí khác. Để giải quyết vấn đề, bạn phải xác định vị trí của ổ cắm mới trong tệp /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Xem ra, tùy thuộc vào trình điều khiển bạn sử dụng, bạn có thể phải chỉ định pdo_mysql.default_socket = !

Để kiểm tra thư mục hiện tại của bạn, hãy chạy lệnh sau trong mysql:

select @@datadir;

1

Là localhost được định nghĩa trong /private/etc/hoststập tin của bạn ?


127.0.0.1 localhost nằm trong tệp máy chủ của tôi.
dcolumbus

4
/private? Chưa bao giờ thấy điều đó trước đây
TheLQ

@TheLQ: Đó là một thứ Mac. Trong khi đó một liên kết tượng trưng từ / etc để / private / etc, vì một lý do của Apple thường khuyên sử dụng "true" đường dẫn: support.apple.com/kb/TA27291
Justin ᚅᚔᚈᚄᚒᚔ

1

Tôi đã có thể tạo lại các triệu chứng tương tự của bạn trên hộp thử nghiệm của mình, hy vọng điều này sẽ giúp ích.

Trong MySQL, người dùng được xác định bởi hai phần (tên và máy chủ). Theo mặc định, MySQL sẽ có 3 người dùng root:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

Trường mật khẩu sẽ trống (không có mật khẩu) hoặc được lưu trữ băm. Nếu bạn đặt mật khẩu cho một người dùng cụ thể, nó sẽ không tự động cập nhật tất cả, vì MySQL thấy họ là những người dùng khác nhau.

Ví dụ:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

sẽ cập nhật mật khẩu cho 'root'@'127.0.0.1', nhưng không 'root'@'localhost'hoặc'root'@'localhost.localdomain'

Hãy nhìn vào skip_name_resolvebiến:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

Theo Mặc định skip_name_resolveOFF, và sẽ cố gắng giải quyết tất cả các địa chỉ IP để hostname. Ví dụ: nếu bạn kết nối với tư cách 'root'@'127.0.0.1', MySQL sẽ thay đổi kết nối bạn với tư cách 'root'@'localhost'.

Nếu có ON, MySQL sẽ xem và kết nối 'root'@'127.0.0.1''root'@'localhost'như người dùng riêng biệt. Và chúng có thể có hoặc không có mật khẩu khác nhau, tùy thuộc vào cách chúng được đặt.


Vì vậy, trước tiên, tôi sẽ kiểm tra xem có sự khác biệt nào về mật khẩu không: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Nếu có, bạn có thể sửa chúng hoặc bạn có thể tiếp tục điều tra.

Sau đó tôi sẽ kiểm tra skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Nếu có ON, tôi sẽ tìm ra nơi nó được đặt (ví dụ /etc/my.cnf) và xóa nó, trừ khi có nhu cầu về nó.

Hy vọng điều này sẽ giúp bạn ra ngoài!


1

Tôi đã có vấn đề này và tôi không thể tìm ra nó. Tôi đã thử mọi cách tôi có thể tốt nhưng không có kết quả.

Tôi thấy rằng tôi đã có .netrc trong / root / có thông tin trong đó.

Tôi đã xóa nó và vấn đề biến mất.

Có thể đăng nhập vào mysql bằng mysql -uroot -p mà không gặp sự cố ngay bây giờ.

Tôi biết đây là một bài viết cũ nhưng hy vọng điều này sẽ giúp được ai đó.


1

Đối với tôi, việc thay đổi các quyền để có thể đọc công khai trên thư mục mẹ của mysql.sock đã khắc phục sự cố:

chmod 755 /var/lib/mysql

1

Đối với những người đang sử dụng CageFS với CloudLinux:

Tôi đã tạo lại /var/lib/mysqlbởi vì tôi đã xây dựng lại máy chủ MySQL từ đầu ...

mà đã vượt qua con đường từ lồng. Tôi biết nó không liên quan, nhưng tôi đã sử dụng cPanel và CloudLinux. Tôi không thể xác minh tại sao kết nối ổ cắm không hoạt động, và cuối cùng, tôi nhận ra.

thêm /var/lib/mysqlvào /etc/cagefs/cagefs.mp (nếu đã có, tiến hành bước tiếp theo) và chạy

cagefsctl --remount-all

đã khắc phục sự cố


1
CHÚA ƠI! Đây là những gì cố định nó cho tôi! Nó đã có sẵn /etc/cagefs/cagefs.mpnhưng đang chạy cagefsctl --remount-allnó. Cảm ơn người đàn ông!
Alvaro Flaño Larrondo

0

tôi nghĩ bạn phải định nghĩa nó ở chế độ riêng tư / etc / hosts ... hoặc chỉ sử dụng 127.0.0.1 vì dù sao nó cũng giống như vậy, chỉ là bí danh.


127.0.0.1 localhost nằm trong tệp máy chủ của tôi.
dcolumbus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.