You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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=1

D, [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命令强制断开所有连接,再执行删库操作:

  1. 进入应用的Rails控制台:
    fly ssh console -C "/app/bin/rails console"
    
  2. 在控制台中执行以下SQL:
    ActiveRecord::Base.connection.execute <<-SQL
      SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'myapp' AND pid <> pg_backend_pid();
    SQL
    
  3. 退出控制台后,重新执行删库命令:
    fly ssh console -C "/app/bin/rails db:drop DISABLE_DATABASE_ENVIRONMENT_CHECK=1"
    

方法二:删除所有数据库表代替删库

如果无法直接删库,可以删除数据库内的所有表来达到类似效果:

  1. 进入Rails控制台:
    fly ssh console -C "/app/bin/rails console"
    
  2. 执行以下代码删除所有表:
    ActiveRecord::Base.connection.tables.each do |table|
      ActiveRecord::Base.connection.drop_table(table)
    end
    

内容的提问来源于stack exchange,提问作者stevec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:35:23