2009-06-15 4 views
21

이 문제를 진단하고 해결하는 방법에 대한 몇 가지 지침이 필요합니다. 이것이 단순한 서버 설정 문제인지 또는 응용 프로그램 설계 문제인지 (또는 둘 다) 나는 모르겠습니다.ORA-4031 "x 바이트의 공유 메모리를 할당 할 수 없습니다"

몇 달에 한두 번이 Oracle XE 데이터베이스는 ORA-4031 오류를보고합니다. 그것은 sga의 특정 부분을 일관되게 가리 키지 않습니다. 최근의 예는 다음과 같습니다

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

사용자가 다른 링크를 클릭, 상쾌하게 유지하는 경우이 오류가 나오면, 그들은 일반적으로 다음 곧 그들이, 서로 다른 시간에 이러한 종류의 오류를 더 얻을 것이다 "404 찾을 수 없음"페이지 오류가 발생합니다.

데이터베이스를 다시 시작하면 잠시 동안 문제가 해결되고 한 달 정도 지나면 다시 나타나지만 프로그램의 동일한 위치에서는 드물게 발생합니다 (즉, 코드의 특정 부분과 연결되지 않은 것처럼 보임) (위의 예제 오류는 테이블에서 5000 개 이상의 행을 정렬하는 Apex 페이지에서 발생했습니다).

나는 sga_max_size을 140M에서 256M으로 늘리려고 노력했으며, 이것이 도움이되기를 바랍니다. 물론, 설정을 변경하기 위해 데이터베이스를 다시 시작해야했기 때문에 이것이 도움이되었는지 알 수 없습니다 :)

Oracle Enterprise Linux 5 상자에서 512MB의를 사용하여 Oracle XE 10.2.0.1.0을 실행하고 있습니다. 램. 서버는 데이터베이스, Oracle Apex (v3.1.2) 및 Apache 웹 서버 만 실행합니다. 거의 모든 기본 매개 변수를 사용하여 설치했으며 1 년 정도 동안 계속 실행되었습니다. 대부분의 문제 저는 응용 프로그램 코드를 조정하여 스스로 해결할 수있었습니다. 집중적으로 사용되지는 않으며 비즈니스에 중요한 시스템이 아닙니다. 는 현재 SGA 크기에 어떤 도움이 여기 있다면

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 

:

내가 관련이있을 수 있습니다 생각하는 일부 현재 설정입니다

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

추가 정보 : http://download.oracle.com/docs/cd/B19306_01/server. 102/b14231/create.htm # sthref376 –

+0

btw large_pool_size가 0 (즉, ASMM에 의해 자동으로 관리 됨) –

+0

언급 한 데이터베이스 구성 및 다른 프로세스의 경우 512M RAM이 부족한 것으로 보입니다. top이나 vmstat과 같은 툴은 OS 레벨에서의 메모리에 대해 무엇을 말합니까? – dpbradley

답변

5

비록 당신이 ASMM을 사용하고 있지만, 당신은을 설정할 수 있습니다 대형 풀의 최소 크기 (MMAN은 해당 값 이하로 축소되지 않음) 일부 개체를 고정하고 SGA_TARGET을 늘릴 수도 있습니다.

+0

소리가 합리적이라면, 나는 이것들을 줄 것이다. –

+0

큰 풀의 최소 크기를 설정하고 sga_target을 sga_max_size와 같게 늘립니다. 감사합니다. 감사합니다. –

+0

나는 이것이 최선의 조언이라고 생각하기 때문에 이것을 답으로 받아 들일 것입니다. 테스트를 통해 오류가 다시 발생하는지 다음 달 정도 걸릴 것입니다. –

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); 

Code from

+0

+1. 다음에이 오류가 발생하면 다시 사용하여 문제인지 확인합니다. 감사! –

-1

오류 : ORA-04031 : 공유 메모리 ("공유 풀 '의 4064 바이트를 할당 할 수 없습니다"를 선택 증가 $ 같은 쿼리와 최대 블록의 확인 크기 , MINVALUE, m ... ","SGA 힙 (3,0) ","kglsim 더미 ")

Solution: by nepasoft nepal 

1 추신 -ef | 그렙 오라클

,174,

2는 SMON을 찾아서> 시작 시작

ORACLE 인스턴스를 장착 그것은

3 SQL의 PID를 죽일.

전체 시스템 글로벌 영역 4,831,838,208 바이트 고정 크기 2,027,320 바이트 가변 크기 4,764,729,544 바이트 데이터베이스 버퍼 50,331,648 바이트 데이터베이스가 탑재 다시 실행 버퍼 14,749,696 바이트. SQL>

4 SQL> 시스템 세트 변경 shared_pool_size = 100M scope = spfile;

시스템이 변경되었습니다.

5 SQL> 종료 즉시

ORA-01109 : 데이터베이스가 분리

데이터베이스를 열 수 없습니다. ORACLE 인스턴스가 종료되었습니다.

6 SQL> startup

오라클 인스턴스가 시작되었습니다.

전체 시스템 글로벌 영역 4,831,838,208 바이트 고정 크기 2,027,320 바이트 가변 크기 4,764,729,544 바이트 데이터베이스 버퍼 50,331,648 바이트 데이터베이스가 탑재 다시 실행 버퍼 14,749,696 바이트. 데이터베이스가 열립니다.

7 SQL> spfile에서 pfile 만들기;

파일이 생성되었습니다.

이 오라클 버그, shared_pool에서 메모리 누수, 파티션을 많이 관리 DB 가능성이 높습니다

+0

OS : Solaris DB : oracle 10g –

+0

음, 내 공유 풀 크기를 설정하면 문제가 해결 될 것이라고 생각합니까? 특히 이미 104,857,600이라는 사실을 고려할 때 (질문을 읽어보십시오) –

-1

를 해결했다. 해결책 : 내 생각에 패치가 존재하지 않는다면 신탁 지원을 확인하십시오. 당신은 ... 서브 풀 또는 EN (드) 수 AMM으로 시도

0

그들이 그들이 오류가 해결되지으로 필요하지 않은 다음과 같은 수 있습니다 :

  1. 1 추신 -ef |
  2. 찾기 그렙 오라클을 smon 및 그것을 위해 PID를 죽일
  3. SQL> 시작 마운트 SQL
  4. spfile에서 pfile을 만듭니다;

데이터베이스를 다시 시작하면 풀이 비워지고 문제가 아닌 효과가 해결됩니다.

large_pool을 고정하여 특정 지점보다 낮아 지거나 메모리를 추가하고 최대 메모리를 높게 설정할 수 없습니다.

+0

OS에 오신 것을 환영합니다. 질문에 대한 답변을 제공해 주셔서 감사합니다. 그러나 질문은 5 세이며 이미 답변 한 사실에주의를 기울여주십시오. 환호와 행복한 코딩 :) –

1

모든 현재 응답은 증상 (공유 메모리 풀 고갈)을 해결하고 sql \ JDBC 쿼리에서 바인드 변수를 사용하지 않을 가능성이 있으므로 문제가되지 않습니다 (그렇게 할 필요가없는 경우에도). 바인드 변수없이 쿼리를 전달하면 Oracle은 매번 쿼리를 "하드 구문 분석"하고 실행 계획을 결정합니다.

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::p11_question_id:528893984337

위의 링크의 일부 조각이 :.

"자바는 바인드 변수를 지원 준비된 문을 사용하기 시작하고 그것으로 입력을 바인드해야합니다 당신은 당신의 시스템이 궁극적 이상으로 확장 할 경우 개발자에 대한 말 3 명 또는 4 명의 사용자 - 지금 당장이 작업을 수행합니다 (코드 수정). 생각할 문제가 아니라 반드시 수행해야하는 작업입니다. 이와 같은 부작용 - 공유 풀 문제가 거의 사라질 것입니다. 근본 원인. "

"오라클 방식 공유 풀 (매우 중요한 공유 메모리 데이터 구조) 은 바인드 변수를 사용하는 개발자를 대상으로합니다. "

"바인드 변수는 SO 대규모 중요하다 - 내가 어떤 방식으로 모양이나 형태로 자신의 중요성을 과장 할 수 없다."

+0

이 답변은 비슷한 증상을 가진 다른 사람에게 도움이 될 수 있습니다. 내 경우에 FWIW는 Java가 아닌 Apex를 사용하고 있었고 주로 바인드 변수를 사용했습니다. 감사 –

관련 문제