MySQL implementiert ALTER TABLE
als Tabellenneuerstellung, sodass zu einem bestimmten Zeitpunkt während des Prozesses zwei Kopien der Tabelle auf dem System vorhanden sind. Für diesen Vorgang benötigen Sie über 12 GB freien Speicherplatz.
Geben Sie etwas Platz frei. Alternativ können Sie Ihren Server so einstellen, dass er ein anderes temporäres Verzeichnis verwendet , wo genügend Platz ist.
Alternative zur Alternative (der WHILE
muss möglicherweise in eine gespeicherte Prozedur eingeschlossen werden):
- erstellen Sie eine neue Tabelle (
temp_table
) mit der neuen Struktur - Daten in kleinen Batches von
original_table
übertragen intemp_table
- lösche
original_table
undtemp_table
umbenennen
-- useful only if concurrent access is allowed during migration
LOCK TABLES original_table WRITE, temp_table WRITE;
SELECT COUNT(*) INTO @anythingleft FROM original_table;
WHILE @anythingleft DO
-- transfer data
INSERT INTO temp_table
SELECT
original_table.old_stuff,
"new stuff"
FROM original_table
ORDER BY any_sortable_column_with_unique_constraint -- very important!
LIMIT 1000; -- batch size, adjust to your situation
DELETE FROM original_table
ORDER BY any_sortable_column_with_unique_constraint
LIMIT 1000; -- ORDER BY and LIMIT clauses MUST be exactly the same as above
SELECT COUNT(*) INTO @anythingleft FROM original_table;
END WHILE;
-- delete, rename
DROP TABLE original_table;
UNLOCK TABLES;
RENAME TABLE old_table TO original_table;
Wenn Ihre Tabelle InnoDB verwendet, ist eine aufwändigere Lösung mit SELECT ... FOR UPDATE;
möglich anstelle von Tabellensperren, aber ich hoffe, Sie verstehen es.