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
問題の 2 つのモデル、コントローラーと "desc question_responses;" の出力を次に示します : https://gist.github.com/4b3667a6896b60383dc3
ほとんどの場合、標準的なレールの「id」列である主キーがあります。

アプリ サーバーを再起動すると、一時的に例外の発生が停止します。そうしないと、例外は 30 分から 6 時間にわたって発生し、停止した直後から突然発生します。

これは、常に同じコントローラー アクション、テーブル、およびモデルで発生します。

他の誰かがこの例外に遭遇しましたか?

4

4 に答える 4

2

FWIW、私はこれと同じ断続的なエラーが発生していました。頭を悩ませた後、原因を見つけました。

クライアントごとに個別の DB があり、クライアントの DB の 1 つにユーザー テーブルの主キーがありませんでした。これは、そのクライアントがサイトにアクセスしたときに、Rails がインメモリ スキーマを接続先のデータベースのスキーマに更新し、主キーが欠落していたことを意味します。その特定のデータベースに主キーがあるかどうかに関係なく、users テーブルにアクセスしようとしたその Passenger アプリ プロセス (またはこのクライアントによって「感染」した他のプロセス) によって処理される今後の要求は、主キー エラーで中断されます。

結局、かなり自明なエラーですが、500 以上のデータベースがあり、そのうちの 1 つだけが問題を引き起こしている場合、特定するのは難しく、断続的でした。

于 2014-11-18T15:26:18.903 に答える
1

私の労働者がデータベースへの共有接続を使用していたため、この問題が発生しました。しかし、私はユニコーンに乗っていました。

Passenger がデフォルトで再接続することは知っていますが、複雑なロジックを持っている可能性があります。たとえば、多数のデータベースへの接続。したがって、すべての接続を再接続する必要があります。

于 2012-11-24T18:14:44.540 に答える
0

Postgre データベースで

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

これと同じことが私にも起こりました。エラーの原因となったテーブル定義の 1 つに複合主キーがありました。注釈モデルは複合主キーの注釈をサポートしていなかった (しかし、間もなく/現在はサポートする) ため、さらに複雑になりました。

私の解決策は、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 に答える