2
A ActiveRecord::UnknownPrimaryKey occurred in survey_response#create:

Unknown primary key for table question_responses in model QuestionResponse.
activerecord (3.2.8) lib/active_record/reflection.rb:366:in `primary_key'

我们的应用程序一直在引发这些异常,我们不知道是什么导致了它们。该异常发生在生产环境和测试环境中,但在任何一个环境中都不可重现。它似乎与服务器负载有关,但即使在峰值负载时,一些请求仍然成功完成。该应用程序(生产和测试环境)是 Rails 3.2.8,ruby 1.9.3-p194,使用 MySQL 和 mysql2 gem。生产环境是 Ubuntu,开发/测试环境是 OS X。该应用在生产环境中的 Phusion Passenger 下运行。

这是一个示例堆栈跟踪:https
://gist.github.com/4068400 这是有问题的两个模型,控制器和“desc question_responses;”的输出:https
://gist.github.com/4b3667a6896b60383dc3 它最肯定有一个主键,它是一个标准的 rails 'id' 列。

重新启动应用程序服务器会暂时阻止异常的发生,否则它们会在 30 分钟到 6 小时的时间段内发生,开始时突然停止。

它总是发生在同一个控制器动作、表和模型上。

有没有其他人遇到过这个异常?

4

4 回答 4

2

FWIW,我遇到了同样的间歇性错误,经过一番头疼后,我找到了原因。

我们每个客户端都有单独的数据库,以及一些客户端的数据库如何在用户表上缺少主键。这意味着当该客户端访问我们的站点时,Rails 将其内存模式更新为它所连接的数据库的模式,但缺少主键。无论该特定数据库是否具有主键,该乘客应用程序进程(或任何其他已被该客户端“感染”的)尝试访问用户表的任何未来请求都会因主键错误而中断。

最后是一个相当不言自明的错误,但是当你有 500 多个数据库并且只有一个数据库导致问题时很难确定,而且它是断断续续的。

于 2014-11-18T15:26:18.903 回答
1

遇到这个问题是因为我的工作人员使用了与数据库的共享连接。但我在独角兽。

我知道Passenger默认会重新连接,但也许你有一些复杂的逻辑。例如,与多个数据库的连接。因此,您需要重新连接所有连接。

于 2012-11-24T18:14:44.540 回答
0

在 postgres 数据库上

ALTER TABLE indices ALTER COLUMN id SET DATA TYPE INT;
ALTER TABLE indices ADD PRIMARY KEY (id)
于 2013-02-18T15:25:53.493 回答
0

同样的事情也发生在我身上。我的一个表定义中有一个复合主键导致错误。它进一步复杂化,因为注释模型不(但很快/现在)支持复合主键的注释。

我的解决方案是使 id 列成为唯一的主键,并为组合添加一个约束(未显示)。为此,如果已设置,您需要在 id 上删除 auto_increment,删除复合主键,然后重新添加主状态和自动增量。

ALTER TABLE indices MODIFY id INT NOT NULL;
ALTER TABLE indices DROP PRIMARY KEY;
ALTER TABLE indices MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
于 2013-01-22T22:55:28.890 回答