これは私にとってはかなり前に解決した古い問題ですが、最終的にはそれを書き留めると思いました。私が新しい会社で始めたとき、本番データベースは月に1回程度クラッシュし、ORA-4031メモリエラーが発生していました。現在のDBAは、問題はアプリケーションコードにバインド変数がないことであると考えていました。これは通常、最も可能性の高い原因です。バインド変数の欠如が問題でしたが、すぐにわかったように、問題はSQLステートメントとはまったく関係がありませんでした。むしろ、問題はDirectNFSのバグが原因でした。どうやら、ダイレクトNFSにはメモリリークがありました。メモリリークが共有プールに影響を与え、十分な時間が与えられると、共有プールの空きメモリが存在しなくなり、ORA-4031エラーが発生し、データベースがクラッシュしました。
Oracleサポートと協力して、これがバグであることを確認しました。この問題はバグ10237987として報告され、バージョン11.1.0および11.2.0に影響します。 OracleEnterpriseLinuxを実行している3ノードのRACクラスタでこのバグに遭遇しました。このバグが他のOSプラットフォームまたは非RAC環境で発生した場合、私は答えを得ることができませんでした。このバグにより、共有プール内のKGNFSプールが時間の経過とともに大幅に増加します。
Oracle Supportで結論を出すまで、このバグを確認できなかったことを残念に思います。サポートは、KGNFSプールでのORA-4031エラーが原因でデータベースがクラッシュしたときにトレースをキャプチャすることを望んでいました。彼らが気づかなかったのは、KGNFSプールが共有プール内の他のすべてのプールのスペース不足を引き起こしたということでした。 KGNFSプールは他のプールを絞り出し、他のプールでスペースが要求されたときに、ORA-4031エラーが発生することがよくありました。そして、トレースファイルが生成されたのは、インスタンスがクラッシュするのを待つことだけでした。特にトレースファイルがKGNFSプールからのものではない可能性があるため、Oracleサポートのトレースファイルをキャプチャするためだけに、インスタンスが1日の途中でクラッシュするのを待つことができませんでした。
結局、回避策は、構成でのDirectNFSの使用を停止することでした。私たちのテストでは、ダイレクトNFSの有無にかかわらずパフォーマンスの違いは示されませんでした。 Direct NFSの使用をやめたため、ORA-4031エラーは発生していません。 Metalinkにはまだバグが残っているようですが、現時点では修正されていません。