MySQL ไม่สามารถเชื่อมต่อผ่าน“ localhost” เพียง 127.0.0.1


27

นี่เป็นเรื่องลึกลับสำหรับฉัน วิธีเดียวที่ฉันสามารถเชื่อมต่อกับ MySQL คือถ้าฉันเรียกมันผ่าน "127.0.0.1" ... ตัวอย่างเช่นสคริปต์การเชื่อมต่อ PHP ของฉันจะไม่ทำงานกับ localhost

ฉันใช้ Mac OS X Lion ในตัว 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
นี่อาจเป็นมากกว่าข้อผิดพลาดของเซิร์ฟเวอร์ แต่ให้แน่ใจว่าไฟล์โฮสต์ของคุณมีนามแฝง localhost
Matt

127.0.0.1 localhost อยู่ในไฟล์ hosts ของฉัน
dcolumbus

เปิดพร้อมท์คำสั่งและพิมพ์ping localhostแล้วดูว่ามีอะไรพูด
Steve Robbins

64 ไบต์จาก 127.0.0.1: icmp_seq = 0 ttl = 64 เวลา = 0.100 ms 64 ไบต์จาก 127.0.0.1: icmp_seq = 1 ttl = 64 เวลา = 0.102 ms 64 ไบต์จาก 127.0.0.1: icmp_seq = 2 ttl = 64 เวลา = 0.096 ms
dcolumbus

คำตอบ:


26

MySQL จะพยายามเชื่อมต่อกับซ็อกเก็ตยูนิกซ์ถ้าคุณบอกให้เชื่อมต่อกับ "localhost" ถ้าคุณบอกให้เชื่อมต่อกับ 127.0.0.1 คุณกำลังบังคับให้เชื่อมต่อกับซ็อกเก็ตเครือข่าย ดังนั้นคุณอาจตั้งค่า MySQL ไว้เพื่อฟังซ็อกเก็ตเครือข่ายเท่านั้น

สิ่งที่ผิดกับซ็อกเก็ตยูนิกซ์ของคุณนั้นยากที่จะบอกได้ แต่ฉันแนะนำให้คุณอ่านหน้านี้ในคู่มืออ้างอิง MySQL สิ่งนี้จะช่วยคุณได้

อัปเดต: ตามคำถามที่อัปเดตแล้ว: พารามิเตอร์ "ซ็อกเก็ต" ควรเป็นดังนี้: "/var/lib/mysql/mysql.sock" หน้านี้ในคู่มืออ้างอิงมีข้อมูลเพิ่มเติม

ที่นี่คุณมีจุดเริ่มต้นของไฟล์ /etc/my.cnf ของฉัน:

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

ไฟล์ของคุณควรคล้ายกัน จากนั้นปัญหาของคุณควรได้รับการแก้ไข อย่าลืมรีสตาร์ทเซิร์ฟเวอร์ MySQL ก่อนที่จะทดสอบ


1
ว้าว: "ใช้ไฟล์ซ็อกเก็ต Unix หากคุณไม่ได้ระบุชื่อโฮสต์หรือหากคุณระบุชื่อโฮสต์พิเศษเป็นชื่อโฮสต์ท้องถิ่น" ดูเหมือนว่า ... ไม่ได้ใช้งานง่าย ดังนั้นคำตอบอื่น ๆ ทั้งหมด
Mark Wagner

เป็นสิ่งที่ดีที่จะรู้ว่า +1
Matt

ฉันซาบซึ้งกับทฤษฎี ... แค่ไม่รู้ว่าคำตอบคืออะไร
dcolumbus

@columbus: ตามที่ฉันได้เขียนไปแล้วมันยากที่จะบอก สิ่งที่ฉันสามารถแนะนำคุณได้คือการเปิดคอนโซลและเพียงแค่เขียนคำสั่ง "mysql" บางทีคุณอาจได้รับข้อมูลเพิ่มเติม อีกอย่างคือดูในไฟล์บันทึก เหมืองตั้งอยู่ในไดเรกทอรี / var / log / และเรียกว่า mysql.log คุณอาจมีชื่ออื่นหรือสถานที่อื่น หากคุณสามารถให้ข้อมูลเพิ่มเติมแก่เราเราก็อาจช่วยคุณได้ดีขึ้น
Raffael Luthiger

2
php.ini มีการอ้างอิงถึง "/var/mysql/mysql.sock" (3 แห่งที่แน่นอน) ซึ่งต้องเปลี่ยนเป็น "/tmp/mysql.sock" ... ขอบคุณสำหรับความช่วยเหลือของคุณ!
dcolumbus

8

คุณอาจเปิดใช้งาน IPv6, localhost ที่เป็นไปได้มาก ๆ จะแก้ไขเป็น ipv6 localhost ที่ไม่ได้กำหนดไว้ในการกำหนดค่า msql ของคุณ

ive ยังมีปัญหาที่ฉันต้องเพิ่ม 'localhost' แทน '127.0.0.1' ลงในซับเน็ตที่อนุญาตสำหรับผู้ใช้นั้นอย่าเข้าใจว่าทำไม (ฉันใช้ ipv4 และมันก็ผ่านไปนานแล้ว) แต่มันก็คุ้มค่าที่จะลอง


คุณสามารถตรวจสอบสิ่งนี้ได้โดยดูว่า 'host localhost' ที่บรรทัดคำสั่งส่งคืน :: 1 หรือ 127.0.0.1 ถ้าเป็นเช่นนั้นคุณสามารถลบการแมป :: 1 ออกจาก / private / etc / hosts หรือกำหนดค่า MySQL ใหม่เพื่อฟังที่อยู่ IPv6 :: 1 และ 127.0.0.1
David North

ฉันคิดว่าฉันจำได้ว่าอ่านที่ไหนสักแห่งที่มีการเปิดใช้งาน IPv6 เป็นค่าเริ่มต้นบน Mac OS X ... เป็นเช่นนั้นหรือไม่
dcolumbus

ipv6 เปิดใช้งานสำหรับระบบปฏิบัติการที่ทันสมัยในทุกวันนี้ im บน osx10.6 และเปิดใช้งานโดยค่าเริ่มต้น
Silverfire

ไม่ถูกต้อง. localhost มีความหมายพิเศษสำหรับลูกค้า MySQL - เช็คเอาท์serverfault.com/a/295300/67675
poige

5

สำหรับฉันแล้ว builtin php ของ OSX ได้รับการกำหนดค่าให้ใช้ซ็อกเก็ตยูนิกซ์ที่แตกต่างจาก mysql ของ homebrew ดังนั้นจึงไม่สามารถเชื่อมต่อผ่าน localhost ซึ่งใช้ซ็อกเก็ตนั้น

ฉันแก้ไขด้วยแฮ็คอย่างรวดเร็วโดยเชื่อมโยงซ็อกเก็ตพา ธ ที่กำหนดค่าของ php เพื่อชี้ไปที่ mysql ที่ใช้งานจริง

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

คำสั่งการวินิจฉัยต่อไปนี้มีประโยชน์มาก

ตรวจสอบซ็อกเก็ตพา ธ เริ่มต้นที่ใช้โดย php และ mysql:

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

เชื่อมต่อโดยใช้ซ็อกเก็ตที่ระบุ:

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

กำหนดว่าซ็อกเก็ตไคลเอนต์ mysql ใช้เพื่อเชื่อมต่อประเภทใด:

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

2

คุณสามารถตรวจสอบmysql/conf/my.conf(โครงสร้างไดเรกทอรีน่าจะเหมือนกันบน OSx) เพื่อดูว่าskip-networkingไม่ใส่เครื่องหมายหรือไม่? ถ้าเป็นเช่นนั้นเพิ่ม#ด้านหน้าของบรรทัดและรีสตาร์ท mysql-server

จริง ๆ แล้วฉันมีปัญหาที่คล้ายกันในขณะที่กลับ (แม้ว่าจะไม่ได้อยู่ใน OSx) ดังนั้นฉันคิดว่ามันอาจจะคุ้มค่ากับการยิง


1
ทำไมสิ่งนี้จึงถูกลดระดับลง คำอธิบายจะเป็นประโยชน์
karllindmark

ฉันไม่ได้ลงคะแนนคุณ แต่คำตอบของคุณคือสิ่งที่ตรงกันข้ามกับสิ่งที่ OP ขอ แต่ฉัน upvoting คุณเพราะฉันต่อสู้กับเงื่อนไขตรงกันข้าม - จะเชื่อมต่อผ่านซ็อกเก็ต แต่ไม่ผ่านเครือข่าย โดยวิธีการที่ฉันไม่สามารถแก้ไขได้ผ่านทาง my.conf; ฉันต้องใส่มันในบรรทัดคำสั่ง: "mysqlf --skip_networking = 0 ... "
Jan Steinman

2

PHP ยังคงพยายามใช้ตำแหน่งซ็อกเก็ตเริ่มต้น ปัญหานี้อาจปรากฏขึ้นหากคุณย้ายโฟลเดอร์ MariaDB / MySQLจาก/ var / lib / mysqlไปยังตำแหน่งอื่น เพื่อแก้ปัญหาคุณต้องกำหนดตำแหน่งของซ็อกเก็ตใหม่ในไฟล์/etc/php.ini

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

ระวังขึ้นอยู่กับไดรเวอร์ที่คุณใช้คุณอาจต้องระบุpdo_mysql.default_socket = !

เพื่อตรวจสอบไดเรกทอรีปัจจุบันของคุณเรียกใช้คำสั่งต่อไปนี้ใน mysql:

select @@datadir;

1

localhost กำหนดไว้ใน/private/etc/hostsไฟล์ของคุณหรือไม่


127.0.0.1 localhost อยู่ในไฟล์ hosts ของฉัน
dcolumbus

4
/private? ไม่เคยเห็นมาก่อน
TheLQ

@TheLQ: มันเป็นเรื่องของ Mac ในขณะที่มีเป็น symlink จาก / ฯลฯ / เอกชน / ฯลฯ ด้วยเหตุผลบางอย่างแอปเปิ้ลโดยทั่วไปแนะนำให้ใช้เส้นทาง "true": support.apple.com/kb/TA27291
จัสตินᚅᚔᚈᚄᚒᚔ

1

ฉันสามารถสร้างอาการเดิมของคุณในกล่องทดสอบของฉันหวังว่ามันจะช่วยได้

ใน MySQL ผู้ใช้จะถูกกำหนดโดยสองส่วน (ชื่อและโฮสต์) โดยค่าเริ่มต้น MySQL จะมีผู้ใช้ 3 คน:

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                  |
+-----------------------+------+-------------------------------------------+

ช่องรหัสผ่านจะว่างเปล่า (ไม่มีรหัสผ่าน) หรือเก็บแฮช หากคุณตั้งรหัสผ่านสำหรับผู้ใช้หนึ่งรายมันจะไม่อัปเดตทั้งหมดโดยอัตโนมัติเนื่องจาก MySQL มองว่าพวกเขาเป็นผู้ใช้อื่น

ตัวอย่างเช่น:

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

จะอัปเดตรหัสผ่านสำหรับ'root'@'127.0.0.1'แต่ไม่ใช่'root'@'localhost'หรือ'root'@'localhost.localdomain'

ดูskip_name_resolveตัวแปร:

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

โดยค่าเริ่มต้นskip_name_resolveคือOFFและจะพยายามแก้ไขที่อยู่ IP ทั้งหมดให้เป็นชื่อโฮสต์ ตัวอย่างเช่นถ้าคุณเชื่อมต่อเป็น'root'@'127.0.0.1'MySQL 'root'@'localhost'จะเปลี่ยนการเชื่อมต่อคุณเป็น

ถ้าเป็นONเช่นนั้น MySQL จะเห็นและเชื่อมต่อ'root'@'127.0.0.1'และ'root'@'localhost'แยกผู้ใช้ และอาจมีหรือไม่มีรหัสผ่านที่แตกต่างกันขึ้นอยู่กับวิธีการตั้งค่า


ดังนั้นก่อนอื่นฉันจะตรวจสอบเพื่อดูความแตกต่างของรหัสผ่าน: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

หากมีคุณสามารถแก้ไขได้หรือคุณสามารถตรวจสอบต่อไป

จากนั้นฉันจะตรวจสอบskip_name_resolve: mysql> show variables like 'skip_name_resolve';

ถ้าเป็นONฉันจะหาว่ามันตั้งอยู่ที่ไหน (ตัวอย่าง/etc/my.cnf) และนำมันออกไปเว้นแต่จะมีความจำเป็น

หวังว่านี่จะช่วยคุณได้!


1

ฉันมีปัญหานี้และฉันไม่สามารถคิดออก ฉันพยายามทุกอย่างที่ฉันสามารถทำได้โดยไม่มีประโยชน์

ฉันพบว่าฉันมี. netrc ใน / root / ที่มีข้อมูลอยู่

ฉันลบมันและปัญหาหายไป

สามารถเข้าสู่ mysql โดยใช้ mysql -uroot -p ได้โดยไม่มีปัญหาตอนนี้

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่หวังว่าจะช่วยให้ใคร


1

สำหรับฉันแล้วการเปลี่ยนการอนุญาตเพื่อให้บุคคลทั่วไปสามารถอ่านได้ในไดเรกทอรีหลักของ mysql.sock ได้แก้ไขปัญหา:

chmod 755 /var/lib/mysql

1

สำหรับผู้ที่ใช้ CageFS กับ CloudLinux:

ฉันสร้างขึ้นมาใหม่/var/lib/mysqlเพราะฉันกำลังสร้างเซิร์ฟเวอร์ MySQL ใหม่ตั้งแต่ต้น ...

ซึ่ง unmounted พา ธ จาก Cagefs ฉันรู้ว่ามันไม่เกี่ยวข้อง แต่ฉันใช้ cPanel และ CloudLinux ฉันไม่สามารถตรวจสอบได้ว่าทำไมการเชื่อมต่อซ็อกเก็ตไม่ทำงานและในที่สุดฉันก็รู้

เพิ่ม/var/lib/mysqlไปที่/etc/cagefs/cagefs.mp (หากมีแล้วไปยังขั้นตอนถัดไป) และเรียกใช้

cagefsctl --remount-all

แก้ไขปัญหา


1
โอ้พระเจ้า! นี่คือสิ่งที่แก้ไขให้ฉัน! มันมีอยู่แล้ว/etc/cagefs/cagefs.mpแต่กำลังรันcagefsctl --remount-allอยู่ ขอบคุณคน!
Alvaro Flaño Larrondo

0

คุณต้องกำหนดมันใน private / etc / hosts ฉันคิดว่า ... หรือแค่ใช้ 127.0.0.1 เพราะมันเป็นสิ่งเดียวกันอย่างไรก็ตามนามแฝง


127.0.0.1 localhost อยู่ในไฟล์ hosts ของฉัน
dcolumbus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.