Low severityschema
MySQL Error:
1051
What does this error mean?
MySQL gooit error 1051 wanneer een DROP TABLE statement wordt uitgevoerd op een tabel die niet (meer) bestaat in de huidige database. De server kan de tabel niet vinden in de catalog en breekt de statement direct af. In een data-pipeline betekent dit concreet dat een migration-script, dbt pre-hook of stored procedure probeert een tabel te verwijderen die al eerder is gedropped — bijvoorbeeld bij een heruitvoering van dezelfde migratie. Het symptoom is een harde SQL-fout die de pipeline-stap markeert als FAILED, waarna downstream transformaties niet starten en de engineer een stacktrace ziet die eindigt op 'Unknown table: your_table'.
Common causes
- 1Niet-idempotente migration-scripts: het script draait opnieuw (retry na fout, CI herstart) en probeert een tabel te droppen die in de eerste run al verwijderd is. Zonder IF EXISTS breekt de tweede run direct.
- 2Verkeerde database-context: de sessie is verbonden met schema A maar de tabel bestaat in schema B. De fout lijkt op een missing-table terwijl de tabel gewoon elders staat — controleer altijd SELECT DATABASE() voor je verder zoekt.
- 3Race condition in parallelle pipeline-runs: twee ADF-activiteiten of dbt-threads starten tegelijk en beide proberen dezelfde tijdelijke tabel te droppen. De tweede thread wint het DROP-gevecht niet en ziet de tabel al verdwenen.
- 4dbt pre-hook of post-hook zonder IF EXISTS: modellen met een custom pre-hook zoals {{ run_query('DROP TABLE ' ~ this) }} falen bij een fresh run of bij het hernamen van het model, omdat de vorige target-tabel dan niet bestaat.
- 5Handmatige cleanup vóór een geplande migration: een engineer heeft de tabel al handmatig verwijderd in productie om ruimte te maken, waarna de geplande migration-job alsnog probeert dezelfde tabel te droppen.
- 6Stored procedure die een tijdelijke werktabel opruimt: de procedure verwacht dat een eerder aangemaakte TEMPORARY TABLE of gewone werktabel altijd bestaat aan het einde van de run, maar een eerdere fout heeft de procedure vroegtijdig afgebroken zodat de tabel er nooit was.
- 7Schema-drift door environment-mismatch: het migration-script is geschreven en getest tegen een dev-omgeving waar de tabel bestaat, maar in de staging- of productie-omgeving is de tabel al via een andere release-tak verwijderd.
How to fix it
- 1Stap 1 — Maak de DROP-statement veilig met IF EXISTS: vervang `DROP TABLE your_table;` door `DROP TABLE IF EXISTS your_table;`. MySQL retourneert dan een waarschuwing in plaats van een fout als de tabel ontbreekt. Controleer achteraf met `SHOW WARNINGS;`.
- 2Stap 2 — Verifieer de actieve database van de sessie: `SELECT DATABASE();` — als het resultaat NULL of een verkeerd schema is, switch met `USE correct_schema;` voor je verdergaat.
- 3Stap 3 — Zoek de tabel op in alle schemas: `SELECT table_schema, table_name FROM information_schema.tables WHERE table_name = 'your_table';` — als de tabel in een ander schema staat, prefix dan de DROP met de schemanaam: `DROP TABLE IF EXISTS other_schema.your_table;`.
- 4Stap 4 — Maak dbt pre/post-hooks idempotent: vervang in dbt-projectbestanden elke hook van de vorm `DROP TABLE {{ this }}` door `DROP TABLE IF EXISTS {{ this }}`. Hervalideer met `dbt compile` en controleer de gegenereerde SQL in `target/compiled/`.
- 5Stap 5 — Controleer stored procedures op onbeveiligde DROP-statements: `SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM information_schema.routines WHERE ROUTINE_SCHEMA = 'your_schema' AND ROUTINE_DEFINITION LIKE '%DROP TABLE%' AND ROUTINE_DEFINITION NOT LIKE '%IF EXISTS%';` — pas elk gevonden resultaat aan.
- 6Stap 6 — Audit migration-historiek op dubbele runs: controleer je migration-tool (Flyway, Liquibase, Alembic) of de versie al gemarkeerd staat als applied. Flyway: `SELECT version, description, success FROM flyway_schema_history ORDER BY installed_on DESC LIMIT 10;`. Als de versie al op success=1 staat, is de migration al eerder geslaagd en mag je hem niet opnieuw draaien.
- 7Stap 7 — Voeg een guard toe aan het begin van migration-scripts die DROP bevatten: gebruik een conditional check zoals `SET @exists = (SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'your_table'); SET @sql = IF(@exists > 0, 'DROP TABLE your_table', 'SELECT 1'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;` voor legacy scripts waar je de SQL zelf niet kunt aanpassen.
Example log output
ERROR 1051 (42S02): Unknown table 'analytics.staging_orders'
[dbt] Encountered an error while running operation: Database Error in model staging_orders (models/staging/staging_orders.sql)
1051 (42S02): Unknown table 'analytics.staging_orders'