Ruby on Rails 3 Không thể kết nối với máy chủ MySQL cục bộ thông qua socket '/tmp/mysql.sock' trên OSX


84

Tôi có môi trường Rails3 tiêu chuẩn, 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

Lỗi tôi gặp phải khi chạy rake db:migrateđể tạo cơ sở dữ liệu là:

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

config / database.yml có

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

chắc chắn đó là một cái gì đó đơn giản tôi đang thiếu.


1
Có tập tin socket không? Có thể nó hiện diện ở một nơi khác (/var/lib/mysql/mysql.sock)?
Eimantas

Không, không tồn tại. Tôi sẽ thử tạo một cái.
Jamie Buchanan

cốt lõi của vấn đề này hoặc ở cấp hệ điều hành ..
RGB

Câu trả lời:


211

Đầu tiên, để tìm tệp socket của bạn:

mysqladmin variables | grep socket

Đối với tôi, điều này mang lại:

| socket                                            | /tmp/mysql.sock                                                                                                        |

Sau đó, thêm một dòng vào config/database.yml:

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

17
Nếu bạn có một mật khẩu trên rễ, làm: "biến -pxxxx mysqladmin | grep ổ cắm" trong đó xxxx là mật khẩu gốc của bạn
Abe Petrillo

Tôi bối rối về cách hoạt động của nó; Bạn nhập ở đâu / lệnh đầu tiên mà bạn liệt kê? Khi tôi nhập điều đó vào thiết bị đầu cuối, nó báo cáo:mysqladmin: command not found
CodeBiker

2
Bạn có thể nhập lệnh vào bất kỳ thư mục nào. Command not foundcho biết bạn chưa cài đặt mysql.
Magne

2
Mặc dù tôi không có mật khẩu, tôi vẫn phải chỉ định người dùng là root: mysqladmin -u root variable | grep ổ cắm
bkunzi01

1
@CodeBiker FYI: Linux shell có xu hướng không thực thi các tên chương trình không đủ tiêu chuẩn từ thư mục làm việc (trừ khi nó rõ ràng trong thư mục PATH) - bạn phải rõ ràng, ví dụ ./program_name .... Điều này có nghĩa là chương trình thực tế được thực thi có xu hướng độc lập với việc bạn cố gắng chạy nó từ đâu.
mwfearnley

87

Tìm thấy rồi!

Thay đổi host: localhosttrong config / database.yml thành host: 127.0.0.1để tạo đường ray kết nối qua TCP / IP thay vì ổ cắm cục bộ.

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

7
Sẽ tốt hơn để tìm vị trí tập tin mysql.sock và thêm dòng này để config / database.yml: "ổ cắm: /path/to/mysql.sock"
gparis

2
Lợi ích của việc sử dụng socket qua TCP / IP là gì? Xin lỗi - Tôi khá mới để Rails và Unix
Jamie Buchanan

5
Các ổ cắm Unix có ít chi phí hơn so với các ổ cắm TCP / IP.
Tobias Cohen

1
Cảm ơn bạn! Tôi gặp sự cố này bên ngoài Rails (sử dụng đá quý mysql) và giải pháp này đã hoạt động. Tôi không có quyền truy cập root nên không thể sửa đổi gem để sử dụng vị trí khác cho tệp socket. Thủ thuật này đã giúp tôi đỡ đau đầu.
Sojoodi

2
Câu trả lời này đã giúp tôi theo một cách khác. Tôi đang chạy ứng dụng rails của mình dựa trên một phiên bản mysql dày đặc, với localhost 3306 bị lộ. Một tác dụng phụ của thiết lập này là mặc dù bạn có thể kết nối thông qua localhost, nhưng bạn chỉ có thể kết nối TCP nghĩ vì mysql đang chạy trong một máy ảo, thay vì trên cùng một máy - vì vậy không có kết nối socket. Thay cho điều này, việc ủy ​​quyền Rails sử dụng TCP là câu trả lời ở đây, vì đáng buồn là dường như không có lựa chọn nào tốt hơn mà tôi đã tìm thấy.
Brian

11

Máy chủ mysql của bạn có thể không chạy. Dưới đây giải thích cách khởi động máy chủ. Đây là một đoạn trích từ tệp README đi kèm với bản tải xuống mysql.

Sau khi cài đặt, bạn có thể khởi động MySQL bằng cách chạy các lệnh sau trong cửa sổ đầu cuối. Bạn phải có đặc quyền của quản trị viên để thực hiện tác vụ này.

Nếu bạn đã cài đặt Mục Khởi động, hãy sử dụng lệnh này:

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

Nếu bạn không sử dụng Mục khởi động, hãy nhập chuỗi lệnh sau:

 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)

Câu trả lời này đã giúp tôi khắc phục sự cố này trên máy MAC của mình ... không chắc tại sao nhận xét này không được xếp hạng cao hơn. Khi bạn cài đặt mysql, có một số ghi chú được hiển thị trong bảng điều khiển. Tôi đã phải chạy các lệnh sau. unset TMPDIRmysql_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

Có thể dịch vụ ngừng hoạt động, đây chắc chắn là điều đầu tiên cần kiểm tra.
Tass

8

Đây là các tùy chọn để khắc phục sự cố này:

Tùy chọn 1: thay đổi máy chủ của bạn thành 127.0.0.1

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

Tùy chọn 2: Có vẻ như bạn có 2 kết nối vào máy chủ MySql của mình. Để tìm vị trí tệp socket của bạn, hãy làm như sau:

mysqladmin variables | grep socket

cho tôi cho:

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!

hoặc là

mysql --help 

Tôi gặp lỗi này vì tôi đã cài đặt XAMPP trong ứng dụng PHP OS X Phiên bản 10.9.5 của mình. Chọn một trong những vị trí ổ cắm mặc định tại đây.

Tôi chọn cho các ứng dụng đường ray mặc định:

socket: /tmp/mysql.sock

Đối với các ứng dụng PHP của tôi, tôi cài đặt XAMPP vì vậy tôi đặt ổ cắm của mình ở đây:

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

KHÁC Vị trí ổ cắm trong OS X

Đối với MAMPP:

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

Đối với Trình cài đặt gói từ MySQL:

socket: /tmp/mysql.sock

Đối với MySQL đi kèm với Mac OS X Server:

socket: /var/mysql/mysql.sock

Đối với Ubuntu:

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

Tùy chọn 3: Nếu tất cả những cài đặt đó không hoạt động, bạn có thể xóa vị trí ổ cắm của mình:

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

Tôi hy vọng điều này sẽ giúp bạn.


Giải thích tốt về lệnh này: socket: /var/run/mysqld/mysql.sockđã làm việc cho tôi
Yonela Nuba

6

"/tmp/mysql.sock" sẽ được tạo tự động khi bạn khởi động máy chủ MySQL. Vì vậy, hãy nhớ làm điều đó trước khi khởi động máy chủ rails.


3

Với việc cài đặt MAMP của tôi trên OSX, ổ cắm MySQL được đặt tại /Applications/MAMP/tmp/mysql/mysql.sock. Tôi đã sử dụng locate mysql.sockđể tìm vị trí ổ cắm MySQL của mình.

Vì vậy, tôi config/database.ymltrông giống như:

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

3

Nếu bạn đang sử dụng Mac OSX,

Vị trí mặc định cho MySQL Unix socket khác nhau trên Mac OS X và Mac OS X Server tùy thuộc vào kiểu cài đặt bạn đã chọn

Vị trí ổ cắm MySQL Unix trên Mac OS X theo Loại cài đặt

  • Trình cài đặt gói từ MySQL ------------------ / tmp / mysql.sock

  • Tarball từ MySQL ------------------------------- / tmp / mysql.sock

  • MySQL đi kèm với Mac OS X Server ------- / var / mysql / mysql.sock

Vì vậy, chỉ cần thay đổi của bạn database.yml trong socket: /tmp/mysql.sockđể trỏ đến đúng nơi tùy thuộc vào những gì hệ điều hành và cài đặt loại mà bạn đang sử dụng


2

Vị trí mặc định cho ổ cắm MySQL trên Mac OS X là /var/mysql/mysql.sock.


1

Tôi đã gặp vấn đề tương tự, nhưng không có câu trả lời nào đưa ra từng bước những gì tôi cần làm. Lỗi này xảy ra do tệp socket của bạn chưa được tạo. Tât cả nhưng điêu bạn phải lam la:

  1. Khởi động máy chủ mysql của bạn, vì vậy máy chủ của bạn /tmp/mysql.sockđược tạo, để làm điều đó bạn chạy:mysql server start
  2. Sau khi hoàn tất, hãy chuyển đến phần cuối thư mục ứng dụng của bạn, chỉnh sửa config/database.ymltệp và thêm / chỉnh sửa socket: /tmp/mysql.sockmục nhập
  3. Chạy rake:dbmigratelại một lần nữa và mọi thứ sẽ diễn ra tốt đẹp

rake db:migrate*
Victor

0

Tôi thấy rằng vấn đề là tôi chỉ có môi trường sản xuất. Tôi không có môi trường phát triển hoặc thử nghiệm.

Bằng cách thêm 'RAILS_ENV = production' để cung cấp lệnh

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

nó đã làm việc


0

Nếu bạn đang chạy MYSQL thông qua XAMPP:

  1. Mở tệp cấu hình mysql XAMPP (trên OSX):

    /Application/XAMPP/etc/my.cnf

  2. Sao chép đường dẫn ổ cắm:

    socket = /Application/XAMPP/xamppfiles/var/mysql/mysql.sock

  3. Mở tệp cấu hình cơ sở dữ liệu của dự án rails: myproject / config / database.yml

  4. Thêm cấu hình socket vào cấu hình cơ sở dữ liệu phát triển:

->

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. Khởi động lại máy chủ rails

Thưởng thức :)


0

Bạn gặp sự cố như sau: Không thể kết nối với máy chủ MySQL cục bộ thông qua socket '/var/run/mysqld/mysqld.sock'

Trả lời: Bắt đầu dịch vụ $ sudo mysql


0

Trên máy của tôi, dịch vụ mysqld đã dừng, đó là lý do tại sao nó lại gây cho tôi vấn đề tương tự.

1: - Vào thiết bị đầu cuối và nhập

sudo service mysqld restart

Thao tác này sẽ khởi động lại dịch vụ mysqld và tạo một tệp sock mới trên vị trí cần thiết.


-1

Nếu bạn đang chạy MYSQL thông qua XAMPP hoặc LAMPP trên Ubuntu hoặc Linux khác, hãy thử:

socket: /opt/lampp/var/mysql/mysql.sock

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.