sql >> Databasteknik >  >> RDS >> Mysql

FEL 1878 (HY000):Tillfälligt filskrivfel

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 till temp_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.



  1. MySQL, Få användarrankning

  2. Hur man använder Database Documenter i Access

  3. Ställ in PDO för att skapa undantag som standard

  4. PostgreSQL tabellvariabel