DBAtlas · Атлас эксплуатации баз данных

Диск / табличное пространство заполнено

Вы получили 'unable to extend', 'disk full', 'could not extend' или 'log full'. Без паники: сначала найдите, ЧТО заполнено, безопасно освободите место, затем устраните проблему окончательно.

Что заполнено?

Чистка не того места не поможет. Сначала измерьте использование: это файл данных, журнал транзакций, archive/redo, temp или диск ОС?

SELECT d.tablespace_name, ROUND((1-(d.alloc-NVL(f.free,0))/d.maxb)*100,1) AS pct_free
FROM (SELECT tablespace_name, SUM(bytes) alloc, SUM(GREATEST(bytes,maxbytes)) maxb FROM dba_data_files GROUP BY tablespace_name) d LEFT JOIN (SELECT tablespace_name, SUM(bytes) free FROM dba_free_space GROUP BY tablespace_name) f ON f.tablespace_name = d.tablespace_name ORDER BY pct_free;
  • Заполнен файл данных / табличное пространство
  • Заполнен журнал транзакций / archive-redo
  • Заполнено temp / undo
  • Заполнен диск ОС (не БД)

Кто главный потребитель?

Чаще всего виновник — одна разросшаяся таблица/сегмент. Найдите самые большие.

SELECT segment_name, segment_type, ROUND(bytes/1048576,1) AS mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;
  • Есть неожиданно большая/разросшаяся таблица
  • Нормальный рост, место действительно закончилось
  • Слишком много мёртвых строк / bloat

Почему растёт журнал?

Журнал/архив нельзя очистить, пока не завершится самая старая активная транзакция/резервное копирование. Почему он накопился?

SELECT name, log_reuse_wait_desc FROM sys.databases WHERE name=DB_NAME();  -- why can it not be truncated?
  • MSSQL: не делаются резервные копии журнала (LOG_BACKUP)
  • PG: зависший слот репликации удерживает WAL
  • Oracle: область архивных журналов (FRA) заполнена
  • Долгая открытая транзакция удерживает журнал

Первопричина: разросшаяся таблица/сегмент

Один объект неожиданно вырос (неконтролируемые вставки, таблица очереди/журнала, которая никогда не очищается).

Первопричина: реальная потребность в ёмкости

Нормальный рост; нужно добавить место.

Первопричина: bloat / мёртвые строки

Место удалённых/обновлённых строк не освобождено.

Первопричина: заполнено temp / undo

Большая сортировка/хеширование или долгая открытая транзакция заполнили временное пространство.

Первопричина: заполнен диск ОС

Проблема на диске операционной системы, а не в БД. Место могут занимать журналы, core dump, старые бэкапы или файлы трассировки.

Первопричина: не делаются резервные копии журнала (SQL Server)

В модели восстановления FULL журнал растёт бесконечно, если не делать его резервные копии.

Первопричина: брошенный слот репликации (PG)

Зависший (неактивный) слот мешает удалению WAL и раздувает pg_wal.

Первопричина: заполнена область архивных журналов (FRA) (Oracle)

Архивные журналы накопились, и FRA заполнена; как только архиватор останавливается, база может перестать принимать запись.

Первопричина: долгая открытая транзакция

Самая старая активная транзакция мешает освобождению журнала/undo.

Открыть в DBAtlas →