rake db:migrate抛出BusyException:数据库被锁定异常

时间:2011-03-27 21:43:04

标签: ruby ruby-on-rails-3 sqlite

我正在阅读Michael Hartl撰写的Ruby on Rails教程,在第6章中,我被指示创建一个新的迁移,以在users表的email列中添加索引。

这是我的迁移:

def self.up
  add_index :users, :email, :unique => true
end

def self.down
  remove_index :users, :email
end

当我运行rake db:migrate时,它认为是一秒钟,然后抛出一个BusyException并说数据库被锁定。数据库是存储在我的用户文件夹中的本地计算机上的sqlite3数据库;没什么特别的。

非常感谢任何和所有帮助。

7 个答案:

答案 0 :(得分:7)

我总是得到这个,这是因为sqlite一次只能被一个进程访问,并且数据库被该进程锁定。确保没有其他终端中运行的服务器或控制台。如果你继续得到这个,并且你确定没有其他东西可以访问那个sqlite数据库(包括僵尸进程),你可以按照这里的建议:

How do I unlock a SQLite database?

答案 1 :(得分:2)

几乎和我一样。 简单的解决方案是从我的rails控制台退出。它锁定了SQLite。

答案 2 :(得分:2)

我遇到了同样的问题。对我来说,我打开了SQLite数据库浏览器,并使用锁定它的相同数据库。

答案 3 :(得分:1)

/同意克里斯托弗

对于我们这些基于unix的机器,一个简单的

$: ps -a | grep ruby
$: kill -s 9 XXXX
从我怀疑是罪魁祸首的终端的红宝石过程中为我做了这件事。它总是由一个控制台或服务器引起的,它以一种让我杀死它的方式挂起,然后必须找到解锁数据库的“僵尸”进程。

在Windows上,肯定不会比杀死一个可疑的进程树更难。

答案 4 :(得分:0)

我的BusyException问题的解决方案,“回想起来很明显”,就是我没有对SQLite3数据库的写访问权。我有一个git克隆了一个rails项目到一个Windows服务的文件系统,我从Ubuntu盒子访问。无论出于何种原因,Sqlite3数据库都是使用+ x权限创建的,Sqlite3必须将其解释为忙碌。

只有经过大量工作确认版本,宝石,红宝石等后,才注意到文件权限为+ x。

当然,这是一个神秘的环境,但我在开启/关闭这个问题两个星期的努力,没有找到任何搜索谷歌的帮助,我认为我会为知识库添加解决方案。

答案 5 :(得分:0)

对我来说,没有什么工作。我删除了所有* .sqlite3文件,然后运行

rake db:create
rake db:migrate

然后它奏效了。

PS:sqlite3文件位于rails项目根目录的db文件夹中

答案 6 :(得分:0)

刚刚遇到了同样的问题,但解决方案与上述略有不同。

$ pgrep -l rails
XXXX ruby
$ kill -s 9 XXXX