I’m just getting started with Rails, and I’m having trouble getting
everything set up correctly. I have installed Ruby 1.8.4, Rails 1.1.6,
and MySQL 5.0. I am able to create a rails app, start WEBrick, and see
the default page, but I cannot get Rails to play nice with MySQL. I
have not created any migrations, but when I run “rake db:migrate” just
to see if everything is wired up correctly, I get a cryptic error:
C:\rails_apps\test_app>mysqladmin -u root create test_app_development
C:\rails_apps\test_app>rake db:migrate
(in C:/rails_apps/test_app)
rake aborted!
Bad file descriptor - connect(2)
My database.yml file contains the defaults:
development:
adapter: mysql
database: test_app_development
username: root
password:
host: localhost
And I am able to connect to MySQL through the command line:
C:\rails_apps\test_app>mysql -u root test_app_development
mysql> create table dummy(i int);
Query OK, 0 rows affected (0.16 sec)
mysql> drop table dummy;
Query OK, 0 rows affected (0.03 sec)
I should also note that I can use InstantRails without a problem - I’d
just really like to be able to get it working manually. Any thoughts?
Hmm, you didn’t mention it so I’ll suggest giving
rake db:migrate --trace
a try to see if the extra verbosity will reap any clues.
Thanks for the response, Collin… here is the verbose output:
C:\rails_apps\test_app>rake db:migrate --trace
(in C:/rails_apps/test_app)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
rake aborted!
Bad file descriptor - connect(2)
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/vendor/mysq
l.rb:108:in initialize' c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/vendor/mysq l.rb:108:in
real_connect’
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_
adapters/mysql_adapter.rb:330:in connect' c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_ adapters/mysql_adapter.rb:87:in
initialize’
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_
adapters/mysql_adapter.rb:36:in mysql_connection' c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_ adapters/abstract/connection_specification.rb:251:in
connection_without_query_c
ache=’
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/query_cache
.rb:54:in connection=' c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_ adapters/abstract/connection_specification.rb:220:in
retrieve_connection’
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_
adapters/abstract/connection_specification.rb:78:in connection' c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/migration.r b:282:in
migrate’
c:/ruby/lib/ruby/gems/1.8/gems/rails-1.1.6/lib/tasks/databases.rake:4
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:387:in execute' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:387:in
execute’
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:357:in invoke' c:/ruby/lib/ruby/1.8/thread.rb:135:in
synchronize’
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:350:in invoke' c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:1906:in
run’
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/lib/rake.rb:1906:in `run’
c:/ruby/lib/ruby/gems/1.8/gems/rake-0.7.1/bin/rake:7
c:/ruby/bin/rake.bat:25
1 - try adding to database.yml
port: 3306
2 - did you install mysql gem?
Craig
Same result after adding port 3306. I had not installed the mysql gem,
but I just tried that (v2.7.1) and got a different error:
C:\rails_apps\test_app>rake db:migrate --trace
(in C:/rails_apps/test_app)
** Invoke db:migrate (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:migrate
rake aborted!
Can’t connect to MySQL server on ‘127.0.0.1’ (10061)
c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_
adapters/mysql_adapter.rb:330:in real_connect' c:/ruby/lib/ruby/gems/1.8/gems/activerecord-1.14.4/lib/active_record/connection_ adapters/mysql_adapter.rb:330:in
connect’
…
I tried this with both “localhost” and “127.0.0.1” specified in my
database.yml, and also with and without the port you suggested. From
what I’ve read, it sounds like a lot of people have problems with the
mysql gem on Windows, so I also tried this Mysql/Ruby adapter:
http://www.vandomburg.net/pages/mysql-ruby-windows. Unfortunately, I’m
still getting the “Can’t connect to MySQL server” message with this
adapter.
Roderick, you may be on to something there. My my.ini file (couldn’t
find my.cnf) does indeed contain “skip-networking”. I disabled remote
access intentionally (taking my cue from the Agile Web book) since my
root password is blank. I assumed this meant I’d still be able to
access the DB locally via TCP/IP. Do you know of any way I could test
this?
Adam McCrea wrote:
I tried this with both “localhost” and “127.0.0.1” specified in my
database.yml, and also with and without the port you suggested. From
what I’ve read, it sounds like a lot of people have problems with the
mysql gem on Windows, so I also tried this Mysql/Ruby adapter:
http://www.vandomburg.net/pages/mysql-ruby-windows. Unfortunately, I’m
still getting the “Can’t connect to MySQL server” message with this
adapter.
Are you sure that MySQL is set up to actually listen on TCP/IP and not
only communicate using sockets?
Check your my.cnf for stuff like skip-networking et al.
Hope this helps,
Roderick
Adam McCrea wrote:
Roderick, you may be on to something there. My my.ini file (couldn’t
find my.cnf) does indeed contain “skip-networking”. I disabled remote
access intentionally (taking my cue from the Agile Web book) since my
root password is blank. I assumed this meant I’d still be able to
access the DB locally via TCP/IP. Do you know of any way I could test
this?
From the top of my head:
By commenting out “skip-networking”, MySQL will listen to port 3306 on
all interfaces by default. Network connections authenticate on a
user-to-user, database-to-database basis. You will need to configure a
firewall to block port 3306 fully.
Perhaps you could configure MySQL to bind to the loopback interface
only, but I’d need to read up on that myself.
That worked! Thanks so much for your help.
Adam McCrea wrote:
That worked! Thanks so much for your help.
Happy to help. I’ll make sure to update my MySQL/Ruby package and
download page to inform users about this little caveat.