如何在Fly.io上成功执行rails db:drop数据库操作?
如何在Fly.io上执行
rails db:drop操作? 问题背景
我尝试过两种方式执行rails db:drop操作:
- 直接通过SSH执行命令:
fly ssh console -C "/app/bin/rails db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1" - 先进入应用的SSH Shell:
再执行:fly ssh myapp/app/bin/rails db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1
但两种方式都返回相同错误:
/app/bin/rails db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1D, [2022-12-03T07:19:04.077483 #564] DEBUG -- : (5010.1ms) DROP DATABASE IF EXISTS "myapp"
PG::ObjectInUse: ERROR: database "myapp" is being accessed by other users
DETAIL: There is 1 other session using the database.
Couldn't drop database 'myapp'
rails aborted!
ActiveRecord::StatementInvalid: PG::ObjectInUse: ERROR: database "myapp" is being accessed by other users
DETAIL: There is 1 other session using the database.
另外:
- 已关闭所有访问站点的浏览器
- 已结束所有Shell会话
- 尝试用
ps -ef | grep postgres查找进程ID来终止,但返回/bin/sh: 18: ps: not found
解决方法
方法一:强制终止数据库所有连接后再删库
通过Rails控制台执行SQL命令强制断开所有连接,再执行删库操作:
- 进入应用的Rails控制台:
fly ssh console -C "/app/bin/rails console" - 在控制台中执行以下SQL:
ActiveRecord::Base.connection.execute <<-SQL SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'myapp' AND pid <> pg_backend_pid(); SQL - 退出控制台后,重新执行删库命令:
fly ssh console -C "/app/bin/rails db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
方法二:删除所有数据库表代替删库
如果无法直接删库,可以删除数据库内的所有表来达到类似效果:
- 进入Rails控制台:
fly ssh console -C "/app/bin/rails console" - 执行以下代码删除所有表:
ActiveRecord::Base.connection.tables.each do |table| ActiveRecord::Base.connection.drop_table(table) end
内容的提问来源于stack exchange,提问作者stevec
相关产品推荐
相关产品推荐

