sql >> データベース >  >> RDS >> Oracle

ダイレクトNFSでのORA-4031エラー

    これは私にとってはかなり前に解決した古い問題ですが、最終的にはそれを書き留めると思いました。私が新しい会社で始めたとき、本番データベースは月に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にはまだバグが残っているようですが、現時点では修正されていません。


    1. データ型、NOT NULL、およびPRIMARYKEY制約とともにテーブル内の列のリストを取得するSQLサーバークエリ

    2. SQLServerでテーブルのすべての依存関係を見つける方法

    3. カンマ区切りの値を列に分割する方法

    4. C#でSqlTransactionを使用する方法