MySQL implementerer ALTER TABLE
som en tabelgendannelse, så to kopier af tabellen findes på systemet på et tidspunkt i processen. Du skal bruge over 12 GB ledig plads til denne handling.
Frigør lidt plads. Alternativt kan du indstille din server til at bruge en anden midlertidig mappe , hvor der er plads nok.
Alternativ til alternativet (WHILE
skal muligvis pakkes ind i en lagret procedure):
- opret en ny tabel (
temp_table
) med den nye struktur - overfør data i små batches fra
original_table
ind itemp_table
- slip
original_table
og omdøbtemp_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;
Hvis din tabel bruger InnoDB, er en mere omfattende løsning mulig med SELECT ... FOR UPDATE;
i stedet for bordlåse, men jeg stoler på, at du forstår ideen.