Причины ошибки invalid memory alloc request size в PostgreSQL | PGLens.

Ошибка PostgreSQL «invalid memory alloc request size»

Ошибка invalid memory alloc request size срабатывает, когда PostgreSQL пытается выделить под значение больше 1 ГБ – это внутренний предохранитель функции palloc. У нее две основные причины: реально слишком большое значение в поле либо повреждение данных, при котором в служебном поле длины оказывается некорректное число.

Как разобраться

  1. Оцените размер запрошенного выделения по числу в тексте ошибки. Значение, близкое к 1073741824 (ровно 1 ГБ) или явно осмысленное, указывает на реально крупное поле. Огромное «мусорное» число (например, 18446744073709551613) – признак повреждения.
  2. Если причина в размере: поле bytea или text не помещается в лимит. Учтите, что в текстовом и hex-представлении данные занимают в 2 раза больше, поэтому фактический предел на строку – около 500 МБ. Крупные объекты храните как Large Objects или во внешних файлах.
  3. Если причина в повреждении: локализуйте проблемную строку и проверьте таблицу. Для диагностики повреждений используйте расширение amcheck; поврежденную запись, как правило, приходится удалять из резервной копии.

Как различить причины

Помогает воспроизводимость: если ошибку дает конкретная строка или конкретное большое значение – это лимит, а не повреждение. Если ошибка плавающая и сохраняется после VACUUM FULL и переиндексации – это повреждение данных, часто на уровне носителя. Отдельный случай – work_mem выше 1 ГБ на старых версиях мог провоцировать эту ошибку; снижение до 1 ГБ и ниже устраняло ее.

Проверьте PGLens
на своих данных

Подключите PGLens к своим экземплярам и получите структурированную картину нагрузки вместо разрозненных данных из логов и системных представлений.

  • Картина нагрузки по подключенным экземплярам в динамике
  • Ранжированный список самых тяжелых запросов
  • Моделирование индексов с расчетом выигрыша в стоимости запроса

    * - обязательные поля

    Напишите нам
    Удобнее с телефона?
    Сканируйте QR