Platte / Tablespace voll
Du hast 'unable to extend', 'disk full', 'could not extend' oder 'log full' erhalten. Keine Panik: Finde zuerst heraus, WAS voll ist, gewinne sicher Platz zurück und behebe es dann dauerhaft.
Was ist voll?
An der falschen Stelle aufzuräumen hilft nicht. Miss zuerst die Belegung: Ist es eine Datendatei, das Transaktionslog, Archive/Redo, Temp oder die OS-Platte?
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;- Datendatei / Tablespace ist voll
- Transaktionslog / Archive-Redo ist voll
- Temp / Undo ist voll
- OS-Platte ist voll (nicht die DB)
Was ist der größte Verbraucher?
Meist ist eine einzelne ausufernde Tabelle/ein Segment der Verursacher. Finde die größten.
SELECT segment_name, segment_type, ROUND(bytes/1048576,1) AS mb FROM dba_segments ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;- Es gibt eine unerwartet große/ausufernde Tabelle
- Normales Wachstum, der Platz ist wirklich aufgebraucht
- Zu viele tote Zeilen / Bloat
Warum wächst das Log?
Log/Archive lässt sich erst bereinigen, wenn die älteste aktive Transaktion/das älteste Backup abgeschlossen ist. Warum hat es sich angesammelt?
SELECT name, log_reuse_wait_desc FROM sys.databases WHERE name=DB_NAME(); -- why can it not be truncated?- MSSQL: Es werden keine Log-Backups erstellt (LOG_BACKUP)
- PG: Ein hängender Replication Slot hält WAL zurück
- Oracle: Archivlog-Bereich (FRA) ist voll
- Eine lange offene Transaktion hält das Log fest
Ursache: Ausufernde Tabelle/ausuferndes Segment
Ein einzelnes Objekt ist unerwartet gewachsen (unkontrollierte Inserts, eine nie bereinigte Queue-/Log-Tabelle).
Ursache: Echter Kapazitätsbedarf
Normales Wachstum; es muss Platz hinzugefügt werden.
Ursache: Bloat / tote Zeilen
Der Platz gelöschter/geänderter Zeilen wurde nicht zurückgewonnen.
Ursache: Temp / Undo voll
Ein großer Sort/Hash oder eine lange offene Transaktion hat den temporären Platz gefüllt.
Ursache: OS-Platte voll
Das Problem liegt auf der Betriebssystemplatte, nicht in der DB. Logs, Core Dumps, alte Backups oder Trace-Dateien können Platz belegen.
Ursache: Es werden keine Log-Backups erstellt (SQL Server)
Im Recovery Model FULL wächst das Log unbegrenzt, wenn keine Log-Backups erstellt werden.
Ursache: Verwaister Replication Slot (PG)
Ein hängender (inaktiver) Slot verhindert das Entfernen von WAL und bläht pg_wal auf.
Ursache: Archivlog-Bereich (FRA) voll (Oracle)
Archivlogs haben sich angesammelt und die FRA ist voll; bleibt der Archiver stehen, kann die Datenbank keine Schreibzugriffe mehr annehmen.
Ursache: Lange offene Transaktion
Die älteste aktive Transaktion verhindert, dass Log/Undo zurückgewonnen werden.