Rails 5如何清空或删除生产环境的Postgres数据库。

29

我想删除一个生产数据库,以便重新开始。当我从Rails 4升级到Rails 5时,它现在会防止意外删除生产数据库。当我运行rake db:reset时,它会显示以下错误消息。

/app# rake db:reset
  ActiveRecord::SchemaMigration Load (1.8ms)  SELECT "schema_migrations".* FROM "schema_migrations"
   (1.6ms)  SELECT "ar_internal_metadata"."value" FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1  [["key", :environment]]
  ActiveRecord::SchemaMigration Load (0.2ms)  SELECT "schema_migrations".* FROM "schema_migrations"
   (0.3ms)  SELECT "ar_internal_metadata"."value" FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1  [["key", :environment]]
  ActiveRecord::SchemaMigration Load (0.3ms)  SELECT "schema_migrations".* FROM "schema_migrations"
   (0.2ms)  SELECT "ar_internal_metadata"."value" FROM "ar_internal_metadata" WHERE "ar_internal_metadata"."key" = $1  [["key", :environment]]
rake aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database.
If you are sure you want to continue, run the same command with the environment variable:
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
/usr/local/bundle/gems/activerecord-5.0.0.1/lib/active_record/tasks/database_tasks.rb:51:in `check_protected_environments!'
/usr/local/bundle/gems/activerecord-5.0.0.1/lib/active_record/railties/databases.rake:11:in `block (2 levels) in <top (required)>'
/usr/local/bundle/gems/rake-11.3.0/exe/rake:27:in `<top (required)>'
Tasks: TOP => db:reset => db:drop => db:check_protected_environments
(See full trace by running task with --trace)

它说我在命令中添加环境变量DISABLE_DATABASE_ENVIRONMENT_CHECK=1应该能够起作用,但事实上并没有。我运行它,但什么也没发生。

<606723-x9dh4:/app# DISABLE_DATABASE_ENVIRONMENT_CHECK=1 rake db:reset       
  ActiveRecord::SchemaMigration Load (1.6ms)  SELECT "schema_migrations".* FROM "schema_migrations"

有人知道我做错了什么吗?感谢帮助!

更新:

我的服务器使用kubernetes部署。我猜测我无法重置数据库,因为服务器正在运行。


1
你可以尝试使用Rails而不是Rake,例如RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bin/rails db:reset - neydroid
没有运气,它只是做同样的事情。 - Scott B
8个回答

44

试试这个方法,它对我有用:

RAILS_ENV=production rake db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1 
在一行中。

有没有办法将这个添加到本地环境的配置文件中,这样我们就不需要每次在终端中写它了? - Miguel Peniche

36

当你将生产数据库转储到本地时,这也可能会发生。如果你想在本地机器上删除它,你需要设置bin/rails db:environment:set RAILS_ENV=development,然后运行rake db:drop


在将生产数据库导入到开发环境后,这是正确的操作方式。 - iGEL
谢谢您。最近我第一次在开发中使用了我的Heroku生产环境(heroku pg:pull DATABASE_URL my_app_name --app my_app_name --remote production),并没有意识到我需要改变删除方式。(rails db:environment:set RAILS_ENV=development; rails db:drop - Robert Travis Pierce
如果您曾经将生产数据库转储到开发数据库中,则ar_internal_metadata中的value可能已更改为production。因此,在本地开发环境中运行rake命令之前,您可能需要将其替换为development - Tintin81

17

以下翻译来自Heroku官方文档的运行Rake命令部分:

不支持db:reset任务。 Heroku应用程序没有删除和创建数据库的权限。请改用heroku pg:reset命令。

因此,不要尝试使用railsrake db:reset,请使用以下命令:

heroku pg:reset


刚注意到标题没有包括Heroku,但这正是我在寻找的! - karns

3
很好,尽管这是一篇旧文章,但为了将来的参考,您可以执行以下操作:
    rake db:migrate VERSION=0

之后

    rake db:migrate

没错,如果您不想断开数据库并可以回滚迁移,则这是正确的方法。 - hatenine
运作非常顺畅 - 将我的数据库迁回到时间的起点,重新部署我的代码,然后自动迁移到最新的模式。 - AxelTheGerman

2
我知道可能有些晚了,但是如果以标准的Rails方式无法删除,你总是可以像下面这样使用psql: psql --u your_user 然后输入密码,输入\l列出所有数据库。在我的情况下,psql拒绝删除单个表,我创建了一个额外的数据库,像'testdb'一样键入\c testdb与之建立连接,然后键入drop database 'olddb_name';,再键入create database 'olddb_name';就完成了!

2

当我在Rails 5.2应用程序和生产中使用PostgreSQL数据库时,遇到了同样的问题。

以下是我解决它的方法:

首先,停止使用数据库的每个会话,以避免其他用户正在访问数据库错误。

sudo kill -9 `ps -u postgres -o pid=`

同时,如果有任何连接到PGAdmin客户端的数据库,请登出每个连接。

启动PostgreSQL服务器,因为上述的kill操作停止了PostgreSQL服务器。

sudo systemctl start postgresql

在生产环境中删除数据库,附加生产参数。
rails db:drop RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1

在生产环境中创建数据库,附加生产参数。
rails db:create RAILS_ENV=production

那就这样吧。

我希望这有所帮助。


1

它目前无法运行,但你应该像这样运行命令

 bundle exec rake RAILS_ENV=production db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1

当你删除表时,你必须重新创建它。如果你没有创建数据库的权限,你将会得到错误。这里有一个答案:Postgres permission denied to create database on rake db:create:all

当你键入psql时,通过键入\q退出。

就像我说的,这不是答案,但我希望这可以在你搜索时节省时间。因为我现在就在那里。祝好运!


0

你能试一下吗?

RAILS_ENV=production rake db:drop
RAILS_ENV=production rake db:create

这是一种古老的方法,但这是我以前用来将数据库重置为原始状态的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接