MySQL implementerar ALTER TABLE
som en tabellåterskapande, så två kopior av tabellen finns på systemet i något skede under processen. Du behöver över 12 GB ledigt utrymme för denna operation.
Frigör lite utrymme. Alternativt kan du ställa in din server att använda en annan tillfällig katalog a> , där det finns tillräckligt med utrymme.
Alternativ till alternativet (WHILE
kan behöva lindas in i en lagrad procedur):
- skapa en ny tabell (
temp_table
) med den nya strukturen - överför data i små partier från
original_table
tilltemp_table
- släpp
original_table
och byt namn påtemp_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;
Om din tabell använder InnoDB är en mer utarbetad lösning möjlig med SELECT ... FOR UPDATE;
istället för bordslås, men jag litar på att du förstår idén.