12

本番サーバーにMySQL Server 5.1.62インストールしました。mysqlサーバーのエラーログファイルを毎日監視していますが、突然、エラーログファイルに以下のエラーが見つかりました。

InnoDB:最大深度250を超えるカスケード外部キー制約のある行を削除/更新できません
過剰な外部制約を削除して再試行してください

主キーを持つデータベース構造があります-適切な更新/削除アクションを持つ外部キー関係があり、親テーブルのデータがアプリケーションまたは手動(バックエンド)によって削除された場合、子テーブルのデータを削除する必要があります。

私はこの問題をグーグルで検索しましたが、適切な解決策を見つけることができません。この問題を解決するにはどうすればよいですか?

4

3 に答える 3

3

このリンクをご覧ください-カスケード削除の結果、「ストレージエンジンからエラー-1が発生しました」という結果になります。提案があります。

また、解決策として、 ON DELETE CASCADEオプションを指定せずに実行しようとする場合は、一部のテーブルからレコードを削除するDELETEステートメントを使用するだけです(複数テーブルの構文)。

于 2012-12-14T07:22:41.280 に答える
3

スキーマの図は、カスケード宣言が表示されていないため、あまり役に立ちません。たとえば、削除がtbl_indentmasterからtbl_tepdetailsにカスケードされることになっているが、削除がtbl_tepdetailsからtbl_tepnotingにカスケードされることが想定されていない場合、一部の削除が失敗すると予想されます。(ただし、別のエラーメッセージが表示されます。)

これを引き起こしている循環参照制約がある場合、tbl_indentmasterからtbl_tepdetailsへのカスケード参照によって部分的に引き起こされていると思います。テストのために、その外部キー制約を削除してみてください。これは、運用サーバーではなく、tsetサーバーで実行します。

これが突然始まり、データベースが以前に正しく機能していた場合、私は最初に考えます

  • バックアップからデータベースを復元する、または
  • バックアップからスキーマを復元し、現在のデータを再ロードする、または
  • 現在のバージョンをチェックアウトし、データベースを再構築します。(データベーススキーマはバージョン管理下にありますね?)

適切なバックアップがなく、バージョン管理下にあるスキーマがないと仮定します。

優れたデータベースから始めていますか?mysqlcheckを実行します。そのドキュメントを注意深く読んでください。--repairテスト済みの適切なバックアップを作成する前に実行しないでください。

データベースが優れていて、カスケード削除がデータベースで正しく機能するはずであり、Googleのスキルが優れていると仮定すると、最善のスタート

  • MySQL5.5または5.6をテストサーバーにインストールします。
  • そのテストサーバーにデータベースをロードし、
  • その特定のエラーを再現できるかどうかを確認してください。

データベースをテストサーバーにロードするには、mysqldumpを使用してコンテンツをダンプします。ファイルシステムレベルでファイルをコピーしないでください。1つ以上のファイルが破損している可能性があります。

これで問題が解決しない場合もありますが、問題がどこにあるが正確にわかる場合があります。正しく機能する場合は、問題がサーバーのバージョンに関連している可能性があり、バージョンをアップグレードすることで解決される可能性があることがわかります。

于 2012-12-15T18:01:35.413 に答える
1

ここで@Devartと@Catcallによる元の回答に同意しますが、OPといくつかのコメントを交換した後、いくつか追加したいと思います。

DELETEまず、スキーマイメージ表現を、のクエリの影響を受けるテーブルのみに縮小しましたtbl_indentmaster

私が見ることができたものから、このスキーマ図には循環FK参照はありません。

また、OPは次のクエリを実行しました。

DELETE FROM tbl_indentmaster WHERE indentId IN (1,2,3,4,5,6,...,150,151,155,156,....)

これは、削除する行が非常に多いことです。さらに問い合わせると、OPは、クエリがの小さなサブセットに対して機能すると主張しますindentId

これから私たちは2つの可能性をとることができると思います:

  1. MySQLにはバグがあり(非常に可能性は低いですが可能性があります)、あなたのような大規模なクエリがCASCADE DELETE失敗します。[すでに投稿された][2]ではなく、新しいバグの可能性を示唆していることに注意してください。理想的には、削除する行数は重要ではありません
  2. クエリ全体が失敗する原因となっている特定のindentIdエントリがあります。tbl_indentmaster

ポイント(2)が実際の原因であることを考慮して、最初に問題の診断を試みることをお勧めします。DELETEクエリを小さなチャンクに分割して、問題のあるIDを見つけることができます。

このスクリプトが(より大きなアプリケーションで)コードを介して定期的に実行する必要がある場合は、そこでもクエリをより小さなチャンクで実行することを検討する必要があります(おそらく、クエリごとに15 IDが適切な開始IMOです)。これを行うことに加えて、どのエントリが失敗しているかを正確に把握できるように、問題のあるIDのエラーをログファイルに記録することをお勧めします。

于 2012-12-27T10:59:47.050 に答える