MySQL implementeert ALTER TABLE
als een hercreatie van een tabel, dus er zijn op een bepaald moment tijdens het proces twee exemplaren van de tabel op het systeem aanwezig. Voor deze bewerking heeft u meer dan 12 GB vrije ruimte nodig.
Maak wat ruimte vrij. U kunt ook uw server instellen om een andere tijdelijke map te gebruiken , waar voldoende ruimte is.
Alternatief voor het alternatief (de WHILE
moet mogelijk worden verpakt in een opgeslagen procedure):
- maak een nieuwe tabel (
temp_table
) met de nieuwe structuur - gegevens in kleine batches overbrengen van
original_table
naartemp_table
- drop
original_table
en hernoemtemp_table
-- 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;
Als uw tabel InnoDB gebruikt, is een uitgebreidere oplossing mogelijk met SELECT ... FOR UPDATE;
in plaats van tafelsloten, maar ik vertrouw erop dat je het idee begrijpt.