Ruby on Rails 3 ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ในเครื่องผ่านซ็อกเก็ต '/tmp/mysql.sock' บน OSX


85

ฉันมีสภาพแวดล้อม Rails3 มาตรฐาน, RVM 1.2.9, Rails 3.0.5, Ruby 1.9.2p180, MySQL2 Gem 0.2.7, mysql-5.5.10-osx10.6-x86_64

ข้อผิดพลาดที่ฉันได้รับเมื่อเรียกใช้rake db:migrateเพื่อสร้างฐานข้อมูลคือ:

Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

config / database.yml มี

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx

แน่ใจว่ามันเป็นอะไรง่ายๆที่ฉันขาดหายไป


1
มีไฟล์ซ็อกเก็ตอยู่หรือไม่ อาจมีอยู่ที่อื่น (/var/lib/mysql/mysql.sock)?
Eimantas

ไม่ไม่มีอยู่จริง ฉันจะลองสร้างขึ้นมา
Jamie Buchanan

หลักของปัญหานี้หรือที่ระดับ OS ..
RGB

คำตอบ:


212

ขั้นแรกให้ค้นหาไฟล์ซ็อกเก็ตของคุณ:

mysqladmin variables | grep socket

สำหรับฉันสิ่งนี้ให้:

| socket                                            | /tmp/mysql.sock                                                                                                        |

จากนั้นเพิ่มบรรทัดในconfig/database.yml:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /tmp/mysql.sock

17
หากคุณมีรหัสผ่านบน root ให้ทำ: "mysqladmin -pxxxx variable | grep socket" โดยที่ xxxx คือรหัสผ่านรูทของคุณ
Abe Petrillo

ฉันสับสนเกี่ยวกับวิธีการทำงาน คุณป้อนคำสั่งแรกที่ระบุไว้ที่ไหน / อย่างไร เมื่อฉันเข้าไปในเทอร์มินัลมันจะรายงาน:mysqladmin: command not found
CodeBiker

2
คุณสามารถป้อนคำสั่งในโฟลเดอร์ใดก็ได้ Command not foundแสดงว่าคุณไม่ได้ติดตั้ง mysql
Magne

2
แม้ว่าฉันจะไม่มีรหัสผ่าน แต่ก็ยังต้องระบุผู้ใช้เป็น root: mysqladmin -u root ตัวแปร | grep socket
bkunzi01

1
@CodeBiker FYI: หอยลินุกซ์มีแนวโน้มที่จะไม่ดำเนินการชื่อโปรแกรมอย่างไม่มีเงื่อนไขจากไดเรกทอรีการทำงาน (ถ้ามันเป็นอย่างชัดเจนในPATH) - ./program_name ...คุณจะต้องมีอย่างชัดเจนเช่น ซึ่งหมายความว่าโปรแกรมจริงที่เรียกใช้มีแนวโน้มที่จะไม่ขึ้นอยู่กับที่ที่คุณพยายามเรียกใช้
mwfearnley

87

เจอแล้ว!

เปลี่ยนhost: localhostconfig / database.yml เพื่อhost: 127.0.0.1ทำให้รางเชื่อมต่อผ่าน TCP / IP แทนซ็อกเก็ตโลคัล

development:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx

7
มันจะดีกว่าถ้าค้นหาตำแหน่งไฟล์ mysql.sock และเพิ่มบรรทัดนี้ใน config / database.yml: "socket:
/path/to/mysql.sock

2
ประโยชน์ของการใช้ซ็อกเก็ตผ่าน TCP / IP คืออะไร? ขอโทษ - ฉันยังใหม่กับ Rails and Unix
Jamie Buchanan

5
ซ็อกเก็ต Unix มีค่าใช้จ่ายน้อยกว่าซ็อกเก็ต TCP / IP
Tobias Cohen

1
ขอขอบคุณ! ฉันพบปัญหานี้นอก Rails (โดยใช้ mysql gem) และวิธีนี้ใช้ได้ผล ฉันไม่มีสิทธิ์เข้าถึงรูทดังนั้นฉันจึงไม่สามารถแก้ไขอัญมณีเพื่อใช้ตำแหน่งอื่นสำหรับไฟล์ซ็อกเก็ตได้ เคล็ดลับนี้ช่วยให้ฉันปวดหัว
Sojoodi

2
คำตอบนี้ช่วยฉันด้วยวิธีอื่น ฉันกำลังเรียกใช้แอปพลิเคชันทางรถไฟกับอินสแตนซ์ mysql ที่ปรับเทียบกับ localhost 3306 ผลข้างเคียงอย่างหนึ่งของการตั้งค่านี้คือแม้ว่าคุณจะสามารถเชื่อมต่อผ่าน localhost ได้ แต่คุณสามารถเชื่อมต่อ TCP ที่คิดได้เนื่องจาก mysql ทำงานใน VM แทนที่จะเป็นบนเครื่องเดียวกันดังนั้นจึงไม่มีการเชื่อมต่อซ็อกเก็ต แทนสิ่งนี้การบังคับใช้ Rails ใช้ TCP เป็นคำตอบที่นี่เพราะน่าเศร้าที่ดูเหมือนจะไม่มีตัวเลือกที่ดีกว่าที่ฉันพบ
Brian

11

เซิร์ฟเวอร์ mysql ของคุณอาจไม่ทำงาน ด้านล่างนี้จะอธิบายวิธีการเริ่มต้นเซิร์ฟเวอร์ นี่คือข้อความที่ตัดตอนมาจากไฟล์ README ที่มาพร้อมกับการดาวน์โหลด mysql

หลังจากการติดตั้งคุณสามารถเริ่มต้น MySQL ได้โดยรันคำสั่งต่อไปนี้ในหน้าต่างเทอร์มินัล คุณต้องมีสิทธิ์ของผู้ดูแลระบบเพื่อดำเนินงานนี้

หากคุณติดตั้ง Startup Item ให้ใช้คำสั่งนี้:

 shell> sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
 (ENTER YOUR PASSWORD, IF NECESSARY)
 (PRESS CONTROL-D OR ENTER "EXIT" TO EXIT THE SHELL)

หากคุณไม่ใช้รายการเริ่มต้นให้ป้อนลำดับคำสั่งต่อไปนี้:

 shell> cd /usr/local/mysql
 shell> sudo ./bin/mysqld_safe
 (ENTER YOUR PASSWORD, IF NECESSARY)
 (PRESS CONTROL-Z)
 shell> bg
 (PRESS CONTROL-D OR ENTER "EXIT" TO EXIT THE SHELL)

คำตอบนี้ช่วยฉันแก้ไขปัญหานี้ใน MAC ของฉัน ... ไม่แน่ใจว่าเหตุใดความคิดเห็นนี้จึงไม่ได้รับการจัดอันดับให้สูงขึ้น เมื่อคุณติดตั้ง mysql จะมีบันทึกย่อบางส่วนแสดงอยู่ในคอนโซล ฉันต้องเรียกใช้คำสั่งต่อไปนี้ unset TMPDIRและmysql_install_db --verbose --user=whoami` --basedir = "$ (brew --prefix mysql)" --datadir = / usr / local / var / mysql --tmpdir = / tmp ....then I had to start the server mysql.server start`
dmillion

เป็นไปได้ที่บริการจะหยุดทำงานนี่เป็นสิ่งแรกที่ต้องตรวจสอบอย่างแน่นอน
Tass

8

นี่คือตัวเลือกในการแก้ไขปัญหานี้:

ตัวเลือกที่ 1:เปลี่ยนโฮสต์ของคุณเป็น 127.0.0.1

staging:
  adapter: mysql2
  host: 127.0.0.1
  username: root
  password: xxxx
  database: xxxx
  socket: your-location-socket

ตัวเลือกที่ 2:ดูเหมือนว่าคุณมี 2 การเชื่อมต่อกับเซิร์ฟเวอร์ MySql ของคุณ ในการค้นหาตำแหน่งไฟล์ซ็อกเก็ตของคุณให้ทำดังนี้:

mysqladmin variables | grep socket

สำหรับฉันให้:

mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock' exists!

หรือ

mysql --help 

ฉันได้รับข้อผิดพลาดนี้เนื่องจากฉันติดตั้ง XAMPP ใน OS X เวอร์ชัน 10.9.5 สำหรับแอปพลิเคชัน PHP เลือกตำแหน่งซ็อกเก็ตเริ่มต้นที่นี่

ฉันเลือกแอปรางเริ่มต้น:

socket: /tmp/mysql.sock

สำหรับแอพ PHP ของฉันฉันติดตั้ง XAMPP ดังนั้นฉันจึงตั้งซ็อกเก็ตที่นี่:

socket: /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

ตำแหน่งซ็อกเก็ตอื่น ๆ ใน OS X

สำหรับ MAMPP:

socket: /Applications/MAMP/tmp/mysql/mysql.sock

สำหรับ Package Installer จาก MySQL:

socket: /tmp/mysql.sock

สำหรับ MySQL ที่มาพร้อมกับ Mac OS X Server:

socket: /var/mysql/mysql.sock

สำหรับ Ubuntu:

socket: /var/run/mysqld/mysql.sock

ตัวเลือกที่ 3:หากการตั้งค่าทั้งหมดไม่ได้ผลคุณสามารถลบตำแหน่งซ็อกเก็ตของคุณได้:

staging:
  # socket: /var/run/mysqld/mysql.sock

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


คำอธิบายที่ดีคำสั่งนี้: socket: /var/run/mysqld/mysql.sockใช้ได้ผลสำหรับฉัน
Yonela Nuba

6

"/tmp/mysql.sock" จะถูกสร้างขึ้นโดยอัตโนมัติเมื่อคุณเริ่มเซิร์ฟเวอร์ MySQL ดังนั้นอย่าลืมทำก่อนที่จะเริ่มเซิร์ฟเวอร์ราง


3

ด้วยการติดตั้ง MAMP บน OSX ซ็อกเก็ต MySQL จะอยู่ที่/Applications/MAMP/tmp/mysql/mysql.sock. ฉันเคยlocate mysql.sockค้นหาตำแหน่งซ็อกเก็ต MySQL ของฉัน

ดังนั้นฉันconfig/database.ymlดูเหมือนว่า:

development:
  adapter: mysql2
  host: localhost
  username: root
  password: xxxx
  database: xxxx
  socket: /Applications/MAMP/tmp/mysql/mysql.sock

3

หากคุณใช้ Mac OSX

ตำแหน่งเริ่มต้นสำหรับซ็อกเก็ต MySQL Unix จะแตกต่างกันใน Mac OS X และ Mac OS X Server ขึ้นอยู่กับประเภทการติดตั้งที่คุณเลือก

ตำแหน่งซ็อกเก็ต MySQL Unix บน Mac OS X ตามประเภทการติดตั้ง

  • โปรแกรมติดตั้งแพ็คเกจจาก MySQL ------------------ / tmp / mysql.sock

  • Tarball จาก MySQL ------------------------------- / tmp / mysql.sock

  • MySQL ที่มาพร้อมกับ Mac OS X Server ------- / var / mysql / mysql.sock

ดังนั้นเพียงแค่เปลี่ยนdatabase.ymlใน socket: /tmp/mysql.sockการชี้ไปที่สถานที่ที่เหมาะสมขึ้นอยู่กับสิ่ง OS และการติดตั้งประเภทคุณกำลังใช้



1

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

  1. เริ่มต้นเซิร์ฟเวอร์ mysql ของคุณดังนั้นคุณจึง/tmp/mysql.sockถูกสร้างขึ้นเพื่อให้คุณรัน:mysql server start
  2. เมื่อเสร็จแล้วให้ไปที่ไดเร็กทอรีแอพของคุณสิ้นสุดแก้ไขconfig/database.ymlไฟล์และเพิ่ม / แก้ไขsocket: /tmp/mysql.sockรายการ
  3. วิ่งrake:dbmigrateอีกครั้งและทุกอย่างควรออกกำลังกายได้ดี

rake db:migrate*
วิกเตอร์

0

ฉันพบว่าปัญหาคือฉันมีเพียงสภาพแวดล้อมการผลิตเท่านั้น ฉันไม่มีสภาพแวดล้อมการพัฒนาหรือการทดสอบ

โดยการเพิ่ม 'RAILS_ENV = production' เพื่อให้คำสั่ง

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

มันได้ผล


0

หากคุณใช้งาน MYSQL ผ่าน XAMPP:

  1. เปิดไฟล์การกำหนดค่า XAMPP mysql (บน OSX):

    /Applications/XAMPP/etc/my.cnf

  2. คัดลอกเส้นทางซ็อกเก็ต:

    ซ็อกเก็ต = /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock

  3. เปิดไฟล์คอนฟิกูเรชันฐานข้อมูลของโปรเจ็กต์ทางรถไฟ: myproject / config / database.yml

  4. เพิ่มการกำหนดค่าซ็อกเก็ตในการกำหนดค่าฐานข้อมูลการพัฒนา:

->

development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: difiuri_falcioni
  pool: 5
  username: root
  password:
  host: localhost
  socket: /Applications/XAMPP/xamppfiles/var/mysql/mysql.sock
  1. รีสตาร์ทเซิร์ฟเวอร์ราง

สนุก :)


0

คุณมีปัญหาเช่นนี้: ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ MySQL ภายในผ่านซ็อกเก็ต '/var/run/mysqld/mysqld.sock'

ตอบ: $ sudo service mysql start


0

บริการ mysqld ในเครื่องของฉันหยุดทำงานนั่นคือสาเหตุที่ทำให้ฉันมีปัญหาเดียวกัน

1: - ไปที่เทอร์มินัลแล้วพิมพ์

sudo service mysqld restart

การดำเนินการนี้จะเริ่มต้นบริการ mysqld และสร้างไฟล์ถุงเท้าใหม่ในตำแหน่งที่ต้องการ


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