MySQL прилага ALTER TABLE
като повторно създаване на таблица, така че две копия на таблицата съществуват в системата на някакъв етап от процеса. За тази операция ще ви трябват над 12 GB свободно пространство.
Освободете малко място. Като алтернатива, настройте сървъра си да използва различна временна директория , където има достатъчно място.
Алтернатива на алтернативата (WHILE
може да се наложи да бъде обвит в съхранена процедура):
- създайте нова таблица (
temp_table
) с новата структура - прехвърляне на данни на малки партиди от
original_table
вtemp_table
- пуснете
original_table
и преименувайте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;
Ако вашата таблица използва InnoDB, по-сложно решение е възможно с SELECT ... FOR UPDATE;
вместо ключалки за маса, но вярвам, че разбирате идеята.