2009-06-15 12 views
21

Potrzebuję wskazówek, jak zdiagnozować i rozwiązać ten problem. Nie wiem, czy jest to prosty problem z konfiguracją serwera lub problem z projektowaniem aplikacji (lub obu).Rozwiązywanie ORA-4031 "nie można przydzielić x bajtów pamięci współużytkowanej"

Raz lub dwa razy w ciągu kilku miesięcy ta baza danych Oracle XE zgłasza błędy ORA-4031. Nie wskazuje konkretnej części sgi konsekwentnie. Najnowszym przykładem jest:

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

Gdy ten błąd pojawia się, gdy użytkownik trzyma orzeźwiający, klikając na różnych linków, oni ogólnie dostać więcej tych rodzajów błędów w różnych momentach, a następnie szybko oni Pojawią się błędy na stronie "404 nie znaleziono".

Ponowne uruchomienie bazy danych zazwyczaj rozwiązuje problem przez pewien czas, a następnie miesiąc lub później później pojawia się ponownie, ale rzadko w tej samej lokalizacji w programie (tj. Nie jest związany z żadną określoną częścią kodu) (powyższy przykład błędu został zgłoszony ze strony Apex, która sortowała 5000+ wierszy z tabeli).

Próbowałem zwiększyć liczbę sga_max_size z 140M do 256M i mam nadzieję, że to pomoże. Oczywiście nie będę wiedział, czy to pomogło, ponieważ musiałem ponownie uruchomić bazę danych, aby zmienić ustawienie :)

Używam Oracle XE 10.2.0.1.0 na pudełku Oracle Enterprise Linux 5 z 512 MB BARAN. Serwer uruchamia tylko bazę danych Oracle Apex (v3.1.2) i serwer WWW Apache. Zainstalowałem go z prawie wszystkimi domyślnymi parametrami i działa już całkiem dobrze od roku. Większość problemów, które udało mi się rozwiązać samodzielnie, dostrajałem kod aplikacji; nie jest intensywnie wykorzystywany i nie jest systemem krytycznym dla biznesu.

Oto niektóre bieżące ustawienia myślę, że może być istotne:

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 

Jeśli to każda pomoc oto obecne rozmiary SGA:

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

Dodatkowe informacje: http://download.oracle.com/docs/cd/B19306_01/server. 102/b14231/create.htm # sthref376 –

+0

btw large_pool_size to 0 (tj. Automatycznie zarządzane przez ASMM) –

+0

512M pamięci RAM wydaje się niskie dla konfiguracji bazy danych + innych procesów, o których wspomniałeś. Co narzędzia takie jak top lub vmstat mówią o pamięci na poziomie systemu operacyjnego? – dpbradley

Odpowiedz

5

Nawet jeśli używasz ASMM, można ustawić minimalny rozmiar dla dużej puli (MMAN nie zmniejszy go poniżej tej wartości). Możesz także spróbować przypinać niektóre obiekty i zwiększać SGA_TARGET.

+0

brzmi rozsądnie, oddam je. –

+0

Ustawiłem minimalny rozmiar dla dużej puli i zwiększono sga_target do tego samego, co sga_max_size. Zobaczę, jak to działa, dzięki. –

+0

Zaakceptuję to jako odpowiedź, ponieważ uważam, że jest to najlepsza rada, mimo że sprawdzenie tego zajmie następny miesiąc lub więcej, aby sprawdzić, czy błędy powtórzyły się ponownie. –

5

Nie zapomnij o rozdrobnieniu. Jeśli masz duży ruch, Twoje pule mogą być pofragmentowane, a nawet jeśli masz kilka MB za darmo, nie może być bloku większego niż 4KB. Sprawdź wielkość największego wolnego bloku z kwerendy jak:

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 dla zapytania. Następnym razem, gdy dostanę te błędy, użyję go ponownie, aby sprawdzić, czy to jest problem. Dzięki! –

-1

Błąd: ORA-04031: nie można przydzielić 4064 bajtów pamięci współdzielonej ("wspólnej puli", "wybierz przyrost $ , MINVALUE, m ... "" kupa SGA (3,0)”, "kglsim kupa")

Solution: by nepasoft nepal 

1 ps -ef | grep oracle

2 znaleźć SMON i zabić PID za nim

3 SQL> startup zamontować

instancji Oracle zaczęło.

całego systemu Global Area 4831838208 bajtów Fixed Size 2027320 bajtów zmienność Rozmiar 4764729544 bajtów Database Zderzaki 50331648 bajtów Redo Zderzaki 14749696 bajtów Database zamontowany. SQL>

4 SQL> alter system set shared_pool_size = 100M scope = spfile;

System zmieniony.

5 SQL> shutdown natychmiastowego

ORA-01109: baza danych nie otwierać

Database zdemontować. Instancja ORACLE została zamknięta.

6 SQL> uruchomienie

Rozpoczęła się instancja ORACLE.

całego systemu Global Area 4831838208 bajtów Fixed Size 2027320 bajtów zmienność Rozmiar 4764729544 bajtów Database Zderzaki 50331648 bajtów Redo Zderzaki 14749696 bajtów Database zamontowany. Baza danych otwarta.

7 SQL> utwórz plik p z spfile;

Utworzono plik.

SOLVED

+0

OS: Solaris DB: oracle 10g –

+0

um, jak dokładnie według Ciebie ustawienie rozmiaru puli współdzielonej rozwiąże mój problem - zwłaszcza biorąc pod uwagę fakt, że jest to już 104,857,600 (proszę przeczytać pytanie) –

-1

Jest Oracle bug, wyciek pamięci w shared_pool, najprawdopodobniej db zarządzający wiele partycji. Rozwiązanie: Moim zdaniem nie istnieje łatka, sprawdź przy pomocy Oracle. Można spróbować z subpul lub EN (DE) zdolny AMM ...

0

informacje nie są konieczne, ponieważ oni nie naprawić błąd następujący:

  1. 1 ps -ef | grep wyrocznię
  2. Znajdź smon i zabij pid dla niego
  3. SQL> startup mount SQL>
  4. Utwórz plik p z pliku spfile;

Ponowne uruchomienie bazy danych spowoduje opróżnienie puli, co rozwiązuje problem, a nie problem.

Napraw twój large_pool tak, aby nie mógł spaść poniżej określonego punktu lub dodać pamięci i ustawić wyższą maksymalną pamięć.

+0

Witamy w systemie operacyjnym. Dziękuję za udzielenie odpowiedzi na to pytanie, ale proszę, zwróćcie uwagę na to, że pytanie ma 5 lat i udzielono już odpowiedzi, co bardzo przypomina to samo, co wy. Pozdrawiam i szczęśliwe kodowanie :) –

1

Wszystkie aktualne odpowiedzi dotyczą symptomu (wyczerpanie puli pamięci współużytkowanej), a nie problemu, który najprawdopodobniej nie używa zmiennych wiązania w zapytaniach sql \ JDBC, nawet jeśli nie wydaje się to konieczne. Przekazywanie zapytań bez zmiennych wiążących powoduje, że Oracle "twardo analizuje" zapytanie za każdym razem, określając jego plan wykonania itp.

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

Niektóre fragmenty z powyższego linku.

„Java obsługuje zmiennych powiązań, programiści muszą się rozpocząć za pomocą przygotowanych sprawozdań i wiążą się wejść do niego, jeśli chcesz, aby Twój system ostatecznie skala poza powiedzieć o 3 lub 4 użytkowników - zrobisz to teraz (naprawienie kodu) .Nie warto o tym myśleć, jest to coś, co MUSISZ zrobić. Efektem ubocznym tego - problemy z twoją wspólną pulą znikną. podstawową przyczyną. "

" Sposób, w jaki Oracle wspólnych pul (bardzo ważna struktura danych pamięci współużytkowanej) operacja jest oparta na programistach używających zmiennych wiązania. "

„zmienne Bind są tak niezwykle ważna - nie mogę w żaden sposób kształt lub formę przecenić ich znaczenie.”

+0

Ta odpowiedź może bardzo dobrze pomóc komuś, kto ma podobne objawy. FWIW w moim przypadku używałem Apex, a nie Java i najczęściej używałem zmiennych bind już. Dzięki –

Powiązane problemy