Ruby rake db:migrate正在引发BusyException:数据库被锁定异常
我正在学习MichaelHartl的RubyonRails教程,在第6章中,我被指示创建一个新的迁移,向users表中的email列添加索引 以下是我的迁移:Ruby rake db:migrate正在引发BusyException:数据库被锁定异常,ruby,ruby-on-rails-3,sqlite,Ruby,Ruby On Rails 3,Sqlite,我正在学习MichaelHartl的RubyonRails教程,在第6章中,我被指示创建一个新的迁移,向users表中的email列添加索引 以下是我的迁移: def self.up add_index :users, :email, :unique => true end def self.down remove_index :users, :email end 当我运行rakedb:migrate时,它会思考一秒钟,然后抛出一个BusyException并说数据库已锁定。该
def self.up
add_index :users, :email, :unique => true
end
def self.down
remove_index :users, :email
end
当我运行rakedb:migrate时,它会思考一秒钟,然后抛出一个BusyException并说数据库已锁定。该数据库是一个sqlite3数据库,存储在我的本地计算机上的用户文件夹中;没什么特别的
非常感谢您的任何帮助 我一直都明白这一点,这是因为sqlite一次只能由一个进程访问,并且数据库被该进程锁定。确保没有服务器或控制台在另一个终端上运行。如果您继续这样做,并且您确信没有其他东西可以访问该sqlite数据库(包括僵尸进程),那么您可以遵循以下建议:
几乎同样的事情也发生在我身上。
简单的解决方案是从rails控制台退出。它正在锁定SQLite。/p>同意克里斯托弗的观点 对于我们这些在基于unix的机器上的人来说,一个简单的
$: ps -a | grep ruby
$: kill -s 9 XXXX
我怀疑来自终端的ruby进程是罪魁祸首为我做的。它总是由一个控制台或服务器引起的,它挂起的方式让我杀死它,然后必须找到“僵尸”进程来解锁数据库
在windows上,肯定比杀死可疑进程树更难。我也有同样的问题。对我来说,打开SQLite数据库浏览器时,打开的数据库与锁定它的数据库相同。我的
BusyException
问题的解决方案是,回想起来,“很明显”,我没有对SQLite3
数据库的写入权限。我让git将一个rails项目克隆到一个由windows服务的文件系统中,我正在从Ubuntu盒访问该文件系统。无论出于何种原因,Sqlite3
数据库是使用+x权限创建的,Sqlite3
必须将其解释为繁忙
在确认版本、gems、rubies等的大量工作之后,我才注意到文件权限为+x
诚然,这是一系列神秘的情况,但我与这个问题斗争了两周,没有从谷歌搜索中找到任何帮助,我以为我会将解决方案添加到知识库中。对我来说,什么都不起作用。我删除了所有*.sqlite3文件,然后运行
rake db:create
rake db:migrate
然后它成功了
PS:sqlite3文件位于rails项目根目录的db文件夹中也有同样的问题,但解决方案与上面的略有不同
$ pgrep -l rails
XXXX ruby
$ kill -s 9 XXXX
该迁移尝试在
users.email
列上添加索引,但您正在谈论添加一个新列。困惑?你是对的,我正在尝试向users表中的email列添加索引,而不是新列。谢谢你指出这一点。太好了。这正是发生的事情。我检查了一下是否有服务器在运行,想不出还有其他进程可以访问它,但我刚刚关闭了终端,一切正常。非常感谢你,克里斯托弗。