Help with Rails/MySQL setup on Windows

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:inreal_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:ininitialize’
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:inconnection_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:inretrieve_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:inmigrate’
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:inexecute’
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:insynchronize’
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:inrun’
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.

  • Roderick

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.