ไม่สามารถเชื่อมต่อกับ MySQL โดยใช้ 'localhost' แต่ใช้ '127.0.0.1' ไม่เป็นไร?


12

ไฟล์ / etc / hosts ของฉันมีลักษณะดังนี้:

127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

ฉันพบขณะสร้างเซิร์ฟเวอร์แม้ว่าฉันสามารถ ping localhost ได้สำเร็จในไฟล์การกำหนดค่าบางอย่างสำหรับบริการเช่น Postfix และ Apache และ Dovecot ฉันต้องระบุ127.0.0.1แทนlocalhostเพื่อให้มันทำงานได้

ฉันยังต้องเปลี่ยนไฟล์กำหนดค่าของเว็บไซต์ที่ใช้ฐานข้อมูลบางตัวซึ่งใช้localhostในการเชื่อมต่อกับ MySQL

ฉันได้ลองแก้ไขhostsไฟล์หลาย ๆแบบแล้ว แต่ไม่เคยมีอะไรช่วยฉันเลย

เซิร์ฟเวอร์กำลังใช้งาน Ubuntu 12.04.02 LTS ไม่มีการติดตั้ง selinux และสถานการณ์ข้างต้นยังคงอยู่แม้หลังจากการตั้งค่านโยบายเริ่มต้นของ IPtables เพื่อยอมรับและล้างข้อมูล

คำตอบ:


15

สิ่งหนึ่งที่คุณอาจตรวจสอบคือ (ซึ่งคุณจะต้องเข้าสู่ระบบไปยังคอนโซลของ MySQL) - ตรวจสอบให้แน่ใจว่าคุณมีสิทธิ์ที่จะเข้าสู่ระบบผ่านrootlocalhost

mysql -h 127.0.0.1 -u root -p

- เมื่อคุณลงชื่อเข้าใช้สำเร็จ -

mysql> select user,host from mysql.user;
+------+--------------------------------+
| user | host                           |
+------+--------------------------------+
| root | 127.0.0.1                      | 
| root | ::1                            |
| root | localhost                      | <-- Make sure you have a localhost entry for root
+------+--------------------------------+
3 rows in set (0.00 sec)

เพียงแค่โยนมันออกไปในกรณีที่นี่คือสิ่งที่เป็นปัญหา


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

ขอบคุณสำหรับความช่วยเหลือ! ฉันต้องการเพิ่มว่าจำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ mysql หลังจากอัปเดตตาราง mysql.user เพื่อให้การเปลี่ยนแปลงมีผล
lackovic1010

แม้ว่าจะได้รับการยอมรับนี่ไม่ใช่เรื่องปกติสำหรับ mysql ดูคำตอบ EEAA ของแทน (ตีความ MySQL localhostเป็นsocketแทนTCP)
ToolmakerSteve

8

ไคลเอนต์ MySQL ส่วนใหญ่นั้นแปลกในความจริงที่ว่าถ้าคุณระบุโฮสต์เป็นlocalhostพวกเขาเรียกว่าการเชื่อมต่อซ็อกเก็ตแทนการเชื่อมต่อ TCP ตัวเลือกของคุณคือติดกับ127.0.0.1หรือถ้าลูกค้ารองรับ (เช่นไบนารี mysql CLI ทำกับ--protocolธง) บังคับให้ใช้ TCP แทนซ็อกเก็ตยูนิกซ์


ขอบคุณ EEAA ปัญหาคือสิ่งต่าง ๆ เช่นตัวติดตั้ง Joomla ล้มเหลว หากคุณระบุ127.0.0.1แทนlocalhostในฟิลด์ชื่อโฮสต์ระหว่างการติดตั้งจะทำให้เส้นทางการติดตั้งเกิดความสับสนและทำให้ฉันมีข้อผิดพลาดอื่น ๆ แต่การระบุ localhost ไม่สามารถเชื่อมต่อฐานข้อมูลได้! เกิดอะไรขึ้นกับสถานการณ์นี้ ทำไมฉันถึงมีมัน
Peter Snow

3
@PeterSnow ตั้งค่าซ็อกเก็ตโดเมน Unix ในการกำหนดค่า MySQL ของคุณ
Michael Hampton

ขอบคุณ @MichaelHampton ฉันค้นหาครึ่งชั่วโมงสุดท้ายแล้วและหาวิธีตั้งค่านี้ไม่ได้ คุณช่วยชี้ฉันที่บทความหรือให้ความเห็นหน่อยได้ไหม ฉันมีsocket = /var/run/mysqld/mysqld.sockในmy.cnfและไฟล์ที่มีอยู่เป็นเจ้าของโดย mysql ด้วยสิทธิ์ 777 ขอบคุณ
Peter Snow

@PeterSnow คุณรีสตาร์ท mysqld หลังจากทำการเปลี่ยนแปลงหรือไม่?
EEAA

ขณะนี้ฉันกำลังพยายามใช้งานผ่านสคริปต์การติดตั้ง Joomla หน้า http ขอชื่อโฮสต์ ถ้าฉันเลือก127.0.0.1ใช้งานได้ (แต่สคริปต์ใช้รายการในภายหลังและล้มเหลวเนื่องจากคาดว่าจะได้ชื่อที่แก้ไขได้localhost) แต่ถ้าฉันใช้localhostการเชื่อมต่อเพื่อสร้างฐานข้อมูลล้มเหลว
Peter Snow


1

คุณสามารถตรวจสอบการอนุญาตเช่นนี้:

[learner@localhost ~]$ sudo netstat -npa | grep mysqld  
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      6284/mysqld         
unix  2      [ ACC ]     STREAM     LISTENING     233040 6284/mysqld         /var/lib/mysql/mysql.sock

ถ้านี่คือการฟัง 0 0.0.0.0:* หมายความว่าทุกคนสามารถเข้าถึง mysql นั้นได้

คุณสามารถแก้ไขการเชื่อมโยงนี้ในไฟล์ my.conf ในเส้นทางเริ่มต้นของ linux คือ:

[learner@localhost ~]$ sudo vi /etc/my.cnf

เพิ่มบรรทัดเหล่านี้ในไฟล์ my.conf เพื่ออนุญาต ip ที่คุณต้องการ

bind-address = 127.0.0.1   
bind-address = 0.0.0.0

ขอบคุณ a_learner สำหรับข้อมูลถึงแม้ว่าฉันได้รับคำตอบแล้ว
Peter Snow

0

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

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

0

ฉันจะแก้ไขปัญหานี้โดยการสร้าง sudo ln -s /opt/lampp/var/mysql/mysql.sock /var/run/mysqld/mysqld.socksymlink, แต่ก่อนอื่นฉันต้องสร้างโฟลเดอร์/var/run/mysqld/เพราะโฟลเดอร์นั้นไม่มีอยู่ในตอนแรก


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