Решение ORA-4031 "невозможно выделить x байтов общей памяти" - PullRequest
21 голосов
/ 15 июня 2009

Мне нужно несколько советов о том, как диагностировать и исправить эту проблему. Я не знаю, является ли это простой проблемой настройки сервера или проблемой дизайна приложения (или и тем, и другим).

Один или два раза в несколько месяцев эта база данных Oracle XE сообщает об ошибках ORA-4031. Это не указывает на какую-либо конкретную часть сга последовательно. Недавний пример:

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

Когда появляется эта ошибка, если пользователь продолжает обновлять, нажимая на разные ссылки, он, как правило, получает больше ошибок такого рода в разное время, а затем он получает сообщение об ошибке «404 not found».

Перезапуск базы данных обычно решает проблему на некоторое время, затем примерно через месяц она появляется снова, но редко в том же месте в программе (то есть она не связана с какой-либо конкретной частью кода) ( приведенный выше пример ошибки возник на странице Apex, которая сортировала более 5000 строк из таблицы).

Я пытался увеличить sga_max_size со 140М до 256М и надеюсь, что это поможет. Конечно, я не буду знать, помогло ли это, так как мне пришлось перезапустить базу данных, чтобы изменить настройку:)

Я использую Oracle XE 10.2.0.1.0 на компьютере Oracle Enterprise Linux 5 с 512 МБ ОЗУ. На сервере работает только база данных, Oracle Apex (v3.1.2) и веб-сервер Apache. Я установил его практически со всеми параметрами по умолчанию, и он работал довольно хорошо в течение года или около того. Большинство проблем, которые я смог решить самостоятельно, настроив код приложения; она не используется интенсивно и не является критически важной для бизнеса системой.

Вот некоторые текущие настройки, которые, я думаю, могут иметь значение:

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

Ответы [ 6 ]

6 голосов
/ 15 июня 2009

Даже если вы используете ASMM, вы можете установить минимальный размер для большого пула (MMAN не будет уменьшать его ниже этого значения). Вы также можете попробовать закрепить некоторые объекты и увеличить SGA_TARGET.

5 голосов
/ 15 июня 2009

Не забывайте о фрагментации. Если у вас много трафика, ваши пулы могут быть фрагментированы, и даже если у вас есть несколько свободных мегабайт, блок не может быть больше 4 КБ. Проверьте размер самого большого свободного блока с помощью запроса:

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

Код от

2 голосов
/ 31 марта 2017

Все текущие ответы касаются симптома (исчерпания пула совместно используемой памяти), а не проблемы, которая, скорее всего, не использует переменные связывания в ваших запросах sql \ JDBC, даже если в этом нет необходимости. Передача запросов без переменных связывания заставляет Oracle «жестко анализировать» запрос каждый раз, определяя план его выполнения и т. Д.

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

Некоторые фрагменты из вышеуказанной ссылки:

"Java поддерживает связывание переменных, ваши разработчики должны начать использовать подготовленные операторы и связывать входные данные в них. Если вы хотите, чтобы ваша система в конечном итоге масштабировалась, скажем, до 3 или 4 пользователей - вы сделаете это прямо сейчас (исправьте код) Это не то, о чем нужно думать, это то, что вы ДОЛЖНЫ сделать. Побочный эффект этого - ваши проблемы с общим пулом в значительной степени исчезнут. В этом основная причина. "

«Путь Оракула» разделяемый пул (очень важная структура данных разделяемой памяти) Оператор основан на разработчиках, использующих переменные связывания. "

«Переменные связывания ТАК МАССИВНО важны - я никак не могу переоценить или переоценить их важность».

0 голосов
/ 11 сентября 2014

Следующие не нужны, так как они не исправляют ошибку:

  1. 1 ps -ef | grep oracle
  2. Найдите сына и убейте пида за него
  3. SQL> монтирование при запуске SQL>
  4. Создать pfile из spfile;

Перезапуск базы данных очистит ваш пул, и это решит эффект, а не проблему.

Исправьте ваш large_pool, чтобы он не мог опуститься ниже определенной точки или добавить память и установить более высокий максимальный объем памяти.

0 голосов
/ 30 апреля 2013

Это ошибка Oracle, утечка памяти в shared_pool, скорее всего, db, управляющая множеством разделов. Решение: По моему мнению, патч не существует, проверьте с поддержкой оракула. Вы можете попробовать с подпулами или en (de) способным AMM ...

0 голосов
/ 04 апреля 2013

Ошибка: ORA-04031: невозможно выделить 4064 байта разделяемой памяти («общий пул», «select increment $, minvalue, m ...», «sga heap (3,0)», «kglsim heap»)

Solution: by nepasoft nepal

1 ps -ef | grep oracle

2 найдите smon и убейте пида за него

3 SQL> при запуске монтируется

Запуск экземпляра ORACLE.

Общая системная глобальная область 4831838208 байт. Фиксированный размер 2027320 байт Переменный размер 4764729544 байт Буферы базы данных 50331648 байт Восстановить буферы 14749696 байт База данных смонтирована. SQL>

4 SQL> изменить системный набор shared_pool_size = 100M scope = spfile;

Система изменена.

5 SQL> немедленное отключение

ORA-01109: база данных не открыта

База данных отключена. Экземпляр ORACLE выключен.

6 SQL> автозагрузка

Запуск экземпляра ORACLE.

Общая системная глобальная область 4831838208 байт. Фиксированный размер 2027320 байт Переменный размер 4764729544 байт Буферы базы данных 50331648 байт Восстановить буферы 14749696 байт База данных смонтирована. База данных открыта.

7 SQL> создать pfile из spfile;

Файл создан.

решаемые

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...