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 not found" 페이지 오류가 발생합니다.
데이터베이스를 다시 시작하면 일반적으로 문제가 잠시 해결된 후 한 달 정도 지나면 다시 나타나지만 프로그램의 동일한 위치(즉, 코드의 특정 부분에 연결되어 있지 않은 것처럼 보이는 경우는 거의 없습니다)(위 예제 오류는 테이블에서 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 웹 서버만 실행합니다.거의 모든 기본 매개 변수를 사용하여 설치했고 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
ASMM을 사용하더라도 큰 풀의 최소 크기를 설정할 수 있습니다(MMAN은 이 값 아래로 축소하지 않습니다).또한 일부 개체를 고정하고 SGA_TARGET을 늘려볼 수도 있습니다.
파편화를 잊지 마세요.트래픽이 많은 경우 풀이 조각날 수 있으며 사용 가능한 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);
현재 모든 답변은 증상(공유 메모리 풀 소진)을 해결하는 것이지, sql \ JDBC 쿼리에서 바인딩 변수를 사용하지 않을 가능성이 높은 문제는 아닙니다.바인딩 변수 없이 쿼리를 전달하면 Oracle은 매번 쿼리를 "하드 파싱"하여 실행 계획을 결정하는 등의 작업을 수행합니다.
https://asktom.oracle.com/pls/asktom/f?p=100:11:0 ::::p11_question_id:528893984337
위 링크의 일부 스니펫:
"Java는 바인딩 변수를 지원하므로 개발자는 준비된 문을 사용하여 입력을 바인딩해야 합니다.시스템이 궁극적으로 3~4명의 사용자 이상으로 확장되도록 하려면 지금 바로 이 작업을 수행합니다(코드 수정).그것은 생각할 일이 아니라 당신이 반드시 해야 할 일입니다.이것의 부작용 - 공유 풀 문제는 거의 사라질 것입니다.그것이 근본 원인입니다."
"Oracle 공유 풀(매우 중요한 공유 메모리 데이터 구조)의 작동 방식은 바인딩 변수를 사용하는 개발자에 따라 결정됩니다."
바인딩 변수는 매우 중요합니다. 저는 어떤 식으로든 그들의 중요성을 과장하거나 과장해서 표현할 수 없습니다."
다음은 오류를 수정하지 않으므로 필요하지 않습니다.
ps -ef|grep oracle- 괴물을 찾아서 그것을 위해 pid를 죽여야 합니다.
SQL> startup mountSQL> create pfile from spfile;
데이터베이스를 다시 시작하면 풀이 플러시되고 문제가 아닌 효과가 해결됩니다.
large_pool을 특정 지점보다 낮게 설정할 수 없도록 고정하거나 메모리를 추가하고 최대 메모리를 더 높게 설정합니다.
이는 shared_pool의 메모리 누수인 Oracle 버그이며, db가 많은 파티션을 관리하고 있을 가능성이 높습니다.솔루션:제 의견으로는 패치가 존재하지 않습니다. 오라클 지원팀에 문의하십시오.하위 풀을 사용하거나 AMM을 활성화(해제)할 수 있습니다...
오류
ORA-04031: unable to allocate 4064 bytes of shared memory ("shared pool","select increment$,minvalue,m...","sga heap(3,0)","kglsim heap")
해결책: nepasoft nepa soft nepal.
1.-
ps -ef|grep oracle2.- 괴물을 찾아서 그것을 위해 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.
해결된
언급URL : https://stackoverflow.com/questions/994182/resolving-ora-4031-unable-to-allocate-x-bytes-of-shared-memory
'programing' 카테고리의 다른 글
| 오류 - 직렬화 가능으로 표시되지 않음 (0) | 2023.06.16 |
|---|---|
| SQL Server에는 패키지가 없기 때문에 프로그래머는 이를 피하기 위해 무엇을 합니까? (0) | 2023.06.16 |
| 보안 규칙으로 하위/필드 액세스 제한 (0) | 2023.06.16 |
| DELETE... RETURNING을 사용하여 삭제된 행에서 정보 선택 (0) | 2023.06.16 |
| mariadb: 바인딩을 c-연결하는 방법 (0) | 2023.06.16 |