sql >> Databáze >  >> RDS >> Mysql

ERROR 1878 (HY000):Dočasné selhání zápisu do souboru

MySQL implementuje ALTER TABLE jako opětovné vytvoření tabulky, takže v určité fázi procesu existují v systému dvě kopie tabulky. Pro tuto operaci budete potřebovat více než 12 GB volného místa.

Uvolněte nějaké místo. Případně nastavte svůj server tak, aby používal jiný dočasný adresář , kde je dostatek místa.

Alternativa k alternativě (WHILE může být nutné zabalit do uložené procedury):

  • vytvořte novou tabulku (temp_table ) s novou strukturou
  • přenášejte data v malých dávkách z original_table do temp_table
  • přetáhněte original_table a přejmenujte 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;

Pokud vaše tabulka používá InnoDB, je možné propracovanější řešení pomocí SELECT ... FOR UPDATE; místo zámků na stůl, ale věřím, že to pochopíte.



  1. mysql Více cizích klíčů v tabulce na stejný primární klíč

  2. Huawei GaussDB

  3. mySQL převést varchar na datum

  4. Pole MySQL DATE s výchozí CURDATE(). NE DATETIME