23

この問題を診断して修正する方法について、いくつかの指針が必要です。これが単純なサーバーのセットアップの問題なのか、アプリケーションの設計上の問題なのか (またはその両方) なのかはわかりません。

この Oracle XE データベースでは、数か月に 1 ~ 2 回、ORA-4031 エラーが報告されます。一貫して sga の特定の部分を指しているわけではありません。最近の例は次のとおりです。

ORA-04031: unable to allocate 8208 bytes of shared memory ("large pool","unknown object","sort subheap","sort key")

このエラーが発生したときに、ユーザーが更新を続けて別のリンクをクリックすると、通常、これらの種類のエラーが別のタイミングでさらに発生し、すぐに「404 not found」ページ エラーが発生します。

通常、データベースを再起動すると問題はしばらく解決し、1 か月ほど後に再び発生しますが、プログラムの同じ場所で発生することはめったにありません (つまり、コードの特定の部分にリンクされているようには見えません) (上記の例テーブルから 5000 行以上を並べ替えていた Apex ページからエラーが発生しました)。

sga_max_size140M から 256M に増やしてみましたが、これが役立つことを願っています。もちろん、設定を変更するためにデータベースを再起動する必要があったため、これが役に立ったかどうかはわかりません:)

512MB の RAM を搭載した Oracle Enterprise Linux 5 ボックスで Oracle XE 10.2.0.1.0 を実行しています。サーバーは、データベース、Oracle Apex (v3.1.2)、および Apache Web サーバーのみを実行します。ほとんどすべてのデフォルト パラメータを使用してインストールしましたが、1 年ほどの間、問題なく動作しています。ほとんどの問題は、アプリケーション コードを調整することで解決できました。集中的に使用されることはなく、ビジネスに不可欠なシステムではありません。

これらは、関連する可能性があると思われる現在の設定の一部です。

pga_aggregate_target        41,943,040
sga_max_size              268,435,456
sga_target                146,800,640
shared_pool_reserved_size   5,452,595
shared_pool_size          104,857,600

参考になれば、現在の SGA サイズは次のとおりです。

Total System Global Area  268435456 bytes
Fixed Size                  1258392 bytes
Variable Size             251661416 bytes
Database Buffers           12582912 bytes
Redo Buffers                2932736 bytes
4

6 に答える 6

7

ASMM を使用している場合でも、ラージ プールの最小サイズを設定できます (MMAN はその値以下にサイズを縮小しません)。また、いくつかのオブジェクトを固定して、SGA_TARGET を増やしてみることもできます。

于 2009-06-15T12:35:02.400 に答える
5

断片化を忘れないでください。大量のトラフィックがある場合、プールが断片化する可能性があり、数 MB の空き容量がある場合でも、4KB を超えるブロックが存在しない可能性があります。次のようなクエリを使用して、最大空きブロックのサイズを確認します。

 select
  '0 (<140)' BUCKET, KSMCHCLS, KSMCHIDX,
  10*trunc(KSMCHSIZ/10) "From",
  count(*) "Count" ,
  max(KSMCHSIZ) "Biggest",
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ<140
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 10*trunc(KSMCHSIZ/10)
UNION ALL
select
  '1 (140-267)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  20*trunc(KSMCHSIZ/20) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ between 140 and 267
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 20*trunc(KSMCHSIZ/20)
UNION ALL
select
  '2 (268-523)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  50*trunc(KSMCHSIZ/50) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ between 268 and 523
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 50*trunc(KSMCHSIZ/50)
UNION ALL
select
  '3-5 (524-4107)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  500*trunc(KSMCHSIZ/500) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ between 524 and 4107
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 500*trunc(KSMCHSIZ/500)
UNION ALL
select
  '6+ (4108+)' BUCKET,
  KSMCHCLS,
  KSMCHIDX,
  1000*trunc(KSMCHSIZ/1000) ,
  count(*) ,
  max(KSMCHSIZ) ,
  trunc(avg(KSMCHSIZ)) "AvgSize",
  trunc(sum(KSMCHSIZ)) "Total"
from
  x$ksmsp
where
  KSMCHSIZ >= 4108
and
  KSMCHCLS='free'
group by
  KSMCHCLS, KSMCHIDX, 1000*trunc(KSMCHSIZ/1000);

からのコード

于 2009-06-15T18:55:09.247 に答える
-1

これは Oracle のバグであり、shared_pool でのメモリ リークであり、データベースが多くのパーティションを管理している可能性があります。解決策: 私の意見では、パッチは存在しません。Oracle サポートに確認してください。サブプールを試すか、AMM を有効 (無効) にすることができます ...

于 2013-04-30T19:05:34.677 に答える
-2

エラー

ORA-04031: unable to allocate 4064 bytes of shared memory ("shared pool","select increment$,minvalue,m...","sga heap(3,0)","kglsim heap")

解決策: nepasoft nepal

  • 1.-

    ps -ef|grep oracle
    
  • 2.- smon を見つけて pid を殺す

  • 3.-

    SQL> startup mount
    ORACLE instance started.
    
    Total System Global Area 4831838208 bytes
    Fixed Size                  2027320 bytes
    Variable Size            4764729544 bytes
    Database Buffers           50331648 bytes
    Redo Buffers               14749696 bytes
    Database mounted.
    
  • 4.-

    SQL> alter system set shared_pool_size=100M scope=spfile;
    
    System altered.
    
  • 5.-

    SQL> shutdown immediate
    
    ORA-01109: database not open
    Database dismounted.
    ORACLE instance shut down.
    
  • 6.-

    SQL> startup
    ORACLE instance started.
    
    Total System Global Area 4831838208 bytes
    Fixed Size                  2027320 bytes
    Variable Size            4764729544 bytes
    Database Buffers           50331648 bytes
    Redo Buffers               14749696 bytes
    Database mounted.
    Database opened.
    
  • 7。-

    SQL> create pfile from spfile;
    
    File created.
    

解決した

于 2013-04-04T12:05:35.447 に答える