sql >> Database >  >> RDS >> Mysql

ERROR 1878 (HY000):Tijdelijke fout bij het schrijven van bestanden

MySQL implementeert ALTER TABLE als een hercreatie van een tabel, dus er zijn op een bepaald moment tijdens het proces twee exemplaren van de tabel op het systeem aanwezig. Voor deze bewerking heeft u meer dan 12 GB vrije ruimte nodig.

Maak wat ruimte vrij. U kunt ook uw server instellen om een ​​andere tijdelijke map te gebruiken , waar voldoende ruimte is.

Alternatief voor het alternatief (de WHILE moet mogelijk worden verpakt in een opgeslagen procedure):

  • maak een nieuwe tabel (temp_table ) met de nieuwe structuur
  • gegevens in kleine batches overbrengen van original_table naar temp_table
  • drop original_table en hernoem 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;

Als uw tabel InnoDB gebruikt, is een uitgebreidere oplossing mogelijk met SELECT ... FOR UPDATE; in plaats van tafelsloten, maar ik vertrouw erop dat je het idee begrijpt.



  1. ISDATE() Voorbeelden in SQL Server

  2. Webserver installeren in FreeBSD 6.0 met Apache 2.2, MySQL 5.0 en PHP 5 – Deel 3

  3. PHP/MySQL rij invoegen en vervolgens 'id' ophalen

  4. Selecteer query met IN() en zonder enige sortering