0

レガシー PHP アプリケーションの作業を始めたばかりで、奇妙な動作と戦っていることに気付きました。シナリオ/コード/エラーを説明しようとします:

  1. すべてのクエリは、接続を開き、セッション全体で開いたままにするシングルトン クラスを介して実行されます (コードを理解できる限り)。

  2. mysql_queryが を返すたびfalseに、例外がスローされます。

  3. 多くのクエリは「正常に」実行され、テーブルが存在しないことについて不平を言うことさえあります(私のタスクの1つは、乱雑なクリッパー継承データベーススキームをクリーンアップすることであるため、コードを実行して、必要に応じてテーブルを作成しています)。不足しているテーブルを作成した後、通常、クエリは正常に実行されます。

  4. 一部のクエリが1045エラーを返しています:Access denied for user 'appuser'@'localhost' (using password: YES)

「奇妙な」動作は次のとおりです。

  1. MySQL インストールで一般的なログを有効にしましたが、アクセス拒否エラーに関する言及はありません。アプリケーション クエリは正常に実行されているようです (ログ形式の一部のセクションを実際に理解するのに問題があるため、「そう思われる」と言いました)。

  2. シングルトン クラスで設定されたユーザー名/パスワードは問題ありません。他の多くのクエリが正常に実行されることに加えて、MySQL CLI インターフェイスを使用してログインできます。MySQL CLI で間違ったユーザー名/パスワードを使用しようとすると、拒否されたアクセスが一般ログに正しく記録されます。

  3. スローされた例外のスタック トレース (明らかに PHP で) は、クエリを処理するシングルトン クラスから例外が実際に発生したことを示しています。

  4. 「拒否された」クエリにはパターンがないようです。それらは大きなSELECTクエリですが、それ以上のものではありません。LEFT OUTER結合を持つものもあれば、24FROM節程度のものもあります。

  5. すべてのクエリで結果をログに記録しておりmysql_stat、実行中のクエリと失敗したクエリの両方の前にサーバーのステータスを出力します。ただし、この関数が実際に MySQL サーバーとの有効な資格情報/セッションに依存しているかどうかはわかりません。

では、ここで何が起こっていると思いますか? どんな手掛かり?経験に基づいた推測はありますか?

誰かがより多くの情報/背景を必要とする場合は、喜んで提供します... :)

4

1 に答える 1

1

問題のある s をさらに詳しく調べると、SELECTそれらすべての間に共通のテーブルが見つかりました。何だと思う?それは ではなくTABLEVIEW実際には でした。SELECTグラフィック ツール (MySQL Workbench) を使用してこれから試してみたところVIEW、エラーは明確で「明白」でした。

開発者がデータベース (MySQL Dump) をエクスポートすると、ツールはすべてのVIEW作成コードに次のような行を追加しました。

/*!50013 DEFINER=`oldappuser`@`%` SQL SECURITY DEFINER */

理由はわかりませんが、そうでした。私のローカル データベースには別のユーザー名/パスワード/スキームがあるため、これが 4 時間にわたる頭痛の種になりました。

それを修正するために、ディレクティブなしで、古いものを削除してVIEW再作成しました。DEFINER

SECURITY話の教訓:新しいサーバーでユーザー/パス/スキームを変更する場合に備えて、データベースをダンプするときにチェックするオプションに注意し、このことに注意してください。

于 2013-04-05T17:44:09.487 に答える