【问题标题】:rake db:create only creating development databaserake db:create 只创建开发数据库
【发布时间】:2013-04-17 01:04:06
【问题描述】:

我正在启动一个新的 rails 3 应用程序,当我运行 rake db:create 时,它会询问我的 root mysql 密码,然后错误提示:

Mysql2::Error: Access denied for user 'arcsite_mysql'@'localhost' to database 'arcsite_mysql_test': CREATE DATABASE arcsite_mysql_test DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci

如果我在命令行上登录 mysql 并运行 show databases; 我会看到:

arcsite_mysql_development

如果我运行SHOW GRANTS FOR arcsite_mysql@localhost,我会看到:

GRANT ALL PRIVILEGES ON `arcsite_mysql_development`.* TO 'arcsite_mysql'@'localhost' WITH GRANT OPTION 

我的数据库.yml:

# MySQL.  Versions 4.1 and 5.0 are recommended.
#
# Install the MYSQL driver
#   gem install mysql2
#
# Ensure the MySQL gem is defined in your Gemfile
#   gem 'mysql2'
#
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: arcsite_mysql_development
  pool: 5
  username: arcsite_mysql
  password: password
  host: localhost

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: arcsite_mysql_test
  pool: 5
  username: arcsite_mysql
  password: password
  host: localhost

因此,出于某种原因,只创建了开发数据库。

版本:

Rails 3.2.13

MySQL:服务器版本:5.6.10 源码分发

mysql2:mysql2-0.3.11

编辑

如果我手动将所有权限授予arcsite_mysql 用户,我可以创建表。但是是否期望 Rails 会为开发而不是为测试环境创建用户和表? arcsite_mysql 用户是我第一次运行 rake db:create 命令时由 rails 创建的。

编辑 2

第 4 点:https://rails.lighthouseapp.com/projects/8994/tickets/1459-patch-better-dbcreate-for-mysql-do-not-assume-root-user

提到了一些涉及创建 mysql 用户的“众所周知”过程。

【问题讨论】:

  • 用户arcsite_mysql是否存在于mysql中?如果该用户存在并且具有适当的权限,我认为它不应该要求您输入 root 密码。如果不是这样,也许这样的事情会起作用:GRANT ALL ON *.* TO 'arcsite_mysql'@'localhost' IDENTIFIED BY 'password';
  • 我认为 Rails 负责在 mysql 中创建用户?在我运行rake db:create 命令之前,该用户不存在。
  • 稍微更新了问题。用户创建行为似乎有点古怪
  • 我通常会先自己创建数据库用户,授予所有需要的访问权限,然后在 database.yml 文件中指定该用户/密码。
  • 添加了注意和格式化的答案,如果用户不存在,我不确定第一个数据库创建是如何工作的,通常你会得到类似的东西:FATAL: role "user" does not exist我的猜测会不会是它之前制作/存在但权限不正确?我发布的命令只更新现有用户而不创建用户

标签: mysql ruby-on-rails rake mysql2


【解决方案1】:

您需要在 MySQL 中授予该用户访问权限:

GRANT ALL ON *.* TO 'arcsite_mysql'@'localhost' IDENTIFIED BY 'password';

Rails 不会在 MySQL 中创建用户,它只使用存在的用户,这就是为什么在生成 database.yml 时你会得到类似:

development:
  adapter: mysql2
  encoding: utf8
  database: blog_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock

Rails 假定 root 用户存在并且在 MySQL 中具有适当的权限(因为 root 拥有它所做的一切),如果不是,您必须创建它(如果使用 MySQL,这将提示您输入 root 密码以创建用户不存在)或将其更改为存在的。供参考:http://guides.rubyonrails.org/getting_started.html#configuring-a-database 第 3.3.2 节

【讨论】:

  • 我要做的唯一更正是 Rails 将创建一个用户(尽管有一些时髦的副作用)。可能最适合我自己创建数据库和用户。只是想让人们意识到这种“魔法”,以防他们遇到问题。这是与数据库创建相关的对话:rails.lighthouseapp.com/projects/8994/tickets/…。第 4 步提到了一些涉及 mysql 用户创建的“众所周知”过程
  • 呃,我不知道!我自己使用 postgresql,据我所知,它在 rails 中没有相同的功能。我会更新我的答案。对于那些感兴趣的人,这里有一个指向当前提交的链接:github.com/rails/rails/blob/master/activerecord/lib/…,因为另一个有点过时了。虽然很奇怪......我很好奇为什么它现在失败了。
【解决方案2】:

如果您希望创建测试数据库,请尝试

rake db:test:prepare

【讨论】:

  • 每先生。 truluck 上面的评论,看起来 arcsite_mysql 只有一个数据库的权限。您需要授予该用户跨服务器实例的所有权限。
  • 稍微更新了问题。用户创建行为似乎有点古怪
猜你喜欢
  • 1970-01-01
  • 2012-04-13
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2011-01-14
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多