MySQL implementa ALTER TABLE
como una recreación de la tabla, por lo que existen dos copias de la tabla en el sistema en algún momento durante el proceso. Necesitará más de 12 GB de espacio libre para esta operación.
Libera algo de espacio. Alternativamente, configure su servidor para usar un directorio temporal diferente , donde haya suficiente espacio.
Alternativa a la alternativa (el WHILE
podría necesitar estar envuelto en un procedimiento almacenado):
- crear una nueva tabla (
temp_table
) con la nueva estructura - transferir datos en pequeños lotes desde
original_table
entemp_table
- soltar
original_table
y renombrartemp_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;
Si su tabla usa InnoDB, es posible una solución más elaborada con SELECT ... FOR UPDATE;
en lugar de candados de mesa, pero confío en que entiendas la idea.