Critical severityresource
MySQL Error:
1114
What does this error mean?
MySQL error 1114 betekent dat de storage engine geen nieuwe rijen meer kan opslaan in de betreffende tabel. Voor InnoDB-tabellen is de onderliggende oorzaak bijna altijd een volle schijf of een vastgelopen tablespace — MySQL kan het .ibd-bestand niet uitbreiden. Voor MEMORY-tabellen is de RAM-limiet (max_heap_table_size) bereikt. In een data-pipeline-context ziet een engineer dit als een abrupte write-failure middenin een ADF-load of dbt-run: alle INSERT- en UPDATE-operaties op de tabel falen onmiddellijk, terwijl SELECT-queries normaal doorlopen. De pipeline stopt, de doeltabel bevat een incomplete dataset, en downstream modellen draaien op verouderde of gedeeltelijke data.
Common causes
- 1Volle schijf op de MySQL-datadirectory: InnoDB probeert het .ibd-bestand van de tabel uit te breiden maar het bestandssysteem geeft ENOSPC terug. Dit is de meest voorkomende oorzaak bij productie-loads — ook als er nog vrije ruimte lijkt te zijn, kan een quota op de partitie (/var/lib/mysql) vol zijn.
- 2InnoDB systeem-tablespace (ibdata1) is geconfigureerd met een vaste maximale grootte via innodb_data_file_path=ibdata1:10G. Zodra die grens is bereikt, kunnen geen nieuwe pages worden gealloceerd, ook al is er fysiek schijfruimte beschikbaar. Dit treft met name oudere MySQL-installaties die nog geen file-per-table hebben ingeschakeld.
- 3MEMORY (HEAP) tabel overschrijdt max_heap_table_size: ADF en andere pipelines gebruiken soms tijdelijke MEMORY-tabellen als staging buffer. De standaardlimiet is 16 MB, wat bij bulk-loads snel bereikt is. Na het bereiken van de limiet weigert MySQL verdere inserts in de betreffende sessie.
- 4MyISAM tabel heeft de MAX_ROWS-limiet bereikt: wanneer een tabel is aangemaakt met een expliciete MAX_ROWS-waarde (of een lage standaard op basis van AVG_ROW_LENGTH), slaat MySQL de interne pointer-breedte hierop af. Voeg meer rijen in dan het maximum, dan geeft MySQL 1114 terug — zelfs als er ruimte op schijf is.
- 5Binaire logs of InnoDB redo logs vullen de schijf: mysql-bin.* en ib_logfile* groeien onbeperkt als expire_logs_days / binlog_expire_logs_seconds niet is ingesteld. Op een drukke server kunnen deze logs GBs per dag produceren en zo onbedoeld de schijf vullen waardoor InnoDB-tabellen niet meer kunnen groeien.
- 6Tablespace op een NFS- of SAN-mount is vol of niet beschikbaar: MySQL-datafiles die op een gedeeld netwerk-volume staan (veelgebruikt in Azure VM-setups) kunnen 1114 produceren bij quota-overschrijding of bij een tijdelijke disconnect waarbij de mount read-only wordt.
- 7Grote transacties die uncommitted blijven, houden vrije tablespace-pages bezet: een langlopende transactie (bijv. een ADF full-load zonder chunking) houdt undo-segmenten open. InnoDB kan die pages niet hergebruiken, wat bij hoge write-snelheid tot 1114 kan leiden zelfs als de tabel zelf qua data niet zo groot is.
How to fix it
- 1Stap 1 — Bevestig de oorzaak: controleer schijfgebruik op de MySQL-datapartitie. `df -h /var/lib/mysql` toont beschikbare ruimte; `du -sh /var/lib/mysql/*` laat zien welk bestand de ruimte inneemt. Controleer ook quota: `quota -u mysql`.
- 2Stap 2 — Identificeer de grootste tabellen en logbestanden: `SELECT table_schema, table_name, ROUND((data_length + index_length)/1024/1024, 2) AS size_mb FROM information_schema.tables ORDER BY size_mb DESC LIMIT 20;` en `ls -lhS /var/lib/mysql/mysql-bin.*` voor binlogs.
- 3Stap 3 — Ruim binaire logs op als die de schijf vullen: `SHOW BINARY LOGS;` om de omvang te zien, dan `PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);` om logs ouder dan 3 dagen te verwijderen. Stel daarna `binlog_expire_logs_seconds=259200` in via my.cnf om herhaling te voorkomen.
- 4Stap 4 — Voor MEMORY-tabellen: verhoog de limiet voor de huidige sessie of globaal. `SET GLOBAL max_heap_table_size = 1073741824;` (1 GB). Als de tabel structureel te groot is voor RAM, converteer dan naar InnoDB: `ALTER TABLE staging_table ENGINE=InnoDB;`
- 5Stap 5 — Voor MyISAM-tabellen met een MAX_ROWS-limiet: `ALTER TABLE your_table MAX_ROWS=2000000000 AVG_ROW_LENGTH=200;` Dit herberekent de interne pointer-breedte. Let op: ALTER TABLE vergrendelt de tabel; plan dit buiten piekuren.
- 6Stap 6 — Voor InnoDB met vastgelopen ibdata1: als innodb_file_per_table=OFF was, zet het aan in my.cnf en dump/restore de database. Als dat niet direct mogelijk is, voeg dan een nieuw databestand toe aan de tablespace via `innodb_data_file_path=ibdata1:10G;ibdata2:10G:autoextend` in my.cnf en herstart MySQL.
- 7Stap 7 — Herstart de gefaalde pipeline nadat ruimte is vrijgemaakt: controleer eerst of de tabel consistent is (`CHECK TABLE your_table;`), verwijder eventuele gedeeltelijke data van de onderbroken load, en trigger de ADF-pipeline of dbt-run opnieuw. Stel een schijf-alert in op 80% gebruik om herhaling te voorkomen.
Example log output
ERROR 1114 (HY000): The table 'stg_orders' is full
[ADF] Activity 'Copy_MySQL_to_Staging' failed: ErrorCode=UserErrorOdbcOperationFailed, Message=ERROR [HY000] [MySQL][ODBC 8.0(w) Driver][mysqld-8.0.32]The table 'stg_orders' is full
[dbt] Database Error in model stg_orders (models/staging/stg_orders.sql): (1114, "The table 'stg_orders' is full")