sql >> Base de Datos >  >> RDS >> Mysql

ERROR 1878 (HY000):error de escritura de archivo temporal

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 en temp_table
  • soltar original_table y renombrar 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;

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.