web-dev-qa-db-ja.com

参照されたノードがありません-いつ消えましたか?

したがって、私は長年の複雑なdrupal相互参照するレコードの多いサイトを継承しました。サイトはDrupal 6で始まり、これらの参照以前はCCK Nodereferencesでしたが、Drupal 7に移植されており、CCK Nodereferencesが存在する可能性はありますが、現在は主にエンティティ参照であると考えています。これについて言及しているのは、それは私があまり知らない領域であり、私はそれが次のことに関連しているかもしれないと思います。

問題はこれです:消えたように見える他のノードによってIDによって参照されるいくつかのノードがあります。たとえば、100の「鶏」ノードへの参照を含むコンテンツタイプ「鶏鶏舎」があるとします。 「鶏小屋」を編集すると、「Hen 1 [nid:1]」、「Rooster 50 [nid:62]」など、名前と値がそれぞれ100個のフィールドが表示されますが、そのうちの1つはnull参照。 「[nid:4]」、そしてすべての「鶏」を一覧表示するビューを作成すると、nid:4の鶏は存在しなくなります。それは、ニワトリがデータベースから削除され、削除がそれを参照するすべてのものに反映されなかったようなものです。明らかに、これがどのように発生したのかを知りたいのですが、数年前からバックアップがオンになっていることに気づきました。これがいつ起こったのか、この頃に他に何が起こったのかを知りたいのですが。これらのnull参照は同時に表示されましたか?

  • バックアップをダウンロードして、ローカルのmysqlインスタンスにロードできます。チキンnid:4がまだ残っているかどうかを確認するには、どのようにクエリしますか?これは、私が見たdrupalスキーマから、単純でも直感的でもないようです。

  • この問題は誰にもおなじみのように見えますか?また、これが二度と起こらない可能性のある一時的なものであったかどうかについて何か提案はありますか?

  • 私がとるべき他のログを調べたりトラブルシューティングしたりすることをお勧めしますか?

1
Rokujolady

データベースをローカルバージョンのMySQLにコピーできます。これは、他の場所での手順を見つけることができる、一般的なデータベースのエクスポートとインポートです。

特定のノードをクエリするには、次のSQLを使用できます。

SELECT * FROM node WHERE nid = 4;

結果が得られた場合、ノードは存在しますが、存在しない場合は存在しません。

ノードテーブルにエントリがあるが、他の関連ノードデータが欠落している可能性があります。その場合、データが何らかの形で破損します。うまくいけば、それはそれではありません。

どのようにして起こったのかについては非常に多くの選択肢があり、明確な答えを出すことはできませんが、頭に浮かぶ可能性が最も高い最初の2つは次のとおりです。

  1. 何らかの理由でノードがなくなった
  2. Drupal 6からDrupal 7への移行中に、ノードはどういうわけか異なるノードIDになり、参照フィールドは一致するように更新されませんでした。

2番目の場合は、ノードのタイトルで検索できます。次に例を示します。

SELECT * FROM node WHERE title = 'Chicken';

結果が得られ、nidが参照フィールドに基づいて期待したものと異なる場合は、おそらくそれが問題です。その場合、古いノードIDを新しいノードIDに何らかの方法でマップし、参照フィールドの値を更新して新しいIDと一致させる必要があります。

問題がどの程度複雑になるかに応じて、Drupalスキーマに慣れる必要があります。

ここであなたを助けるログはおそらくないと思います。ノードがいつ更新されたかを示すログがあり、更新された値は含まれていない場合があります。または、更新時に似たタイミングでPHPエラーが表示され、それらが関連している可能性がありますが、おそらくその経路をたどる時間を無駄にすることはないでしょう。

データが欠落しているかどうか、またはまだそこにあるが変更されているかどうかを判断するためのクエリをいくつか実行した後、私はおそらく、関心のあるポイント(たとえば、深刻な開発または移行の前後)を中心に異なるデータベースバージョンを比較することから始めます。データが消えた/変更されたときに絞り込みます。次に、その時点で何が起こっていたのかを確認し(移行でしたか?など)、それに基づいて調査します。

2
rooby

Drupal 7は、デフォルトでは削除されたノードへの参照を削除しません。 Field reference delete モジュールを参照してください。プロジェクトページからの詳細情報(詳細についてはそのページを確認してください):

このモジュールは、SQLデータベースに格納されているフィールドから、削除されたエンティティへの参照を削除します。これは、存在しないコンテンツへの古い参照が予期しない問題(たとえば、参照しているコンテンツが表示されている場合)を引き起こすことを防ぐために存在します。

それが既存の「死んだ」参照をクリーンアップするかどうかはわかりませんが、少なくとも前進することで解決します。

2
bleen