Диск / табличное пространство заполнено
Симптом
Ошибки 'unable to extend', 'disk full', 'log file full'; запись останавливается.
1. Без паники: сначала найдите, что заполнено
Это файл данных, журнал транзакций, область archive/redo, temp или диск ОС? Очистка не того места не поможет. Проверьте диск через df -h на уровне ОС и представления пространства внутри БД.
2. Измерьте использование
Какое табличное пространство/файл/каталог заполнено и на сколько процентов?
Oracle
SELECT d.tablespace_name, ROUND((1-(d.alloc-NVL(f.free,0))/d.maxb)*100,1) 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;PostgreSQL
SELECT datname, pg_size_pretty(pg_database_size(datname)) FROM pg_database ORDER BY 2 DESC; -- use OS df for the diskMySQL
SELECT table_schema, ROUND(SUM(data_length+index_length)/1048576,1) mb FROM information_schema.tables GROUP BY table_schema ORDER BY mb DESC;SQL Server
SELECT name, size/128.0 size_mb, size/128.0 - CAST(FILEPROPERTY(name,'SpaceUsed') AS int)/128.0 free_mb FROM sys.database_files;Redis
INFO memory # used_memory vs maxmemory3. Найдите крупнейших потребителей
Определите самые большие таблицы/сегменты, самые большие файлы журналов/архивов и ненужные старые бэкапы. Чаще всего виновата одна разросшаяся таблица или накопившиеся архивные журналы.
Oracle
SELECT segment_name, bytes/1048576 mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;PostgreSQL
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) FROM pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC LIMIT 10;SQL Server
SELECT TOP 10 OBJECT_NAME(object_id), SUM(reserved_page_count)*8/1024 mb FROM sys.dm_db_partition_stats GROUP BY object_id ORDER BY mb DESC;4. Безопасно освободите место (быстро)
Для журналов/архивов: сделайте бэкап, затем удалите старые архивные журналы/бэкапы (Oracle: RMAN delete archivelog; MSSQL: сделайте бэкап журнала и сожмите журнал). В Redis: maxmemory-policy и вытеснение (eviction). НИКОГДА не удаляйте действующий файл данных вручную; НИКОГДА не удаляйте архивные журналы без бэкапа.
5. Увеличьте ёмкость постоянно
Добавьте место в файл данных или включите autoextend (Oracle: ALTER DATABASE DATAFILE ... AUTOEXTEND ON MAXSIZE), увеличьте диск, добавьте табличное пространство. Устраните первопричину: ротация журналов, задание очистки архивов, политика хранения.
6. Предотвратите повторение
Настройте оповещения об использовании диска (пороги 80%/90%), автоматизируйте очистку архивов/журналов и чётко определите политику хранения. Не допускайте, чтобы этот плейбук понадобился снова.