Диск / табличное пространство заполнено
Вы получили '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.