sql >> データベース >  >> RDS >> Mysql

エラー1878(HY000):一時ファイルの書き込みに失敗しました

    MySQLはALTER TABLEを実装します テーブルの再作成として、プロセス中のある段階でテーブルの2つのコピーがシステムに存在します。この操作には12GBを超える空き容量が必要です。

    スペースを空けてください。または、別の一時ディレクトリを使用するようにサーバーを設定します 、十分なスペースがある場所。

    代替案の代替案(WHILE ストアドプロシージャでラップする必要がある場合があります):

    • 新しいテーブルを作成します(temp_table )新しい構造で
    • original_tableから小さなバッチでデータを転送する temp_table
    • ドロップoriginal_table 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;
    

    テーブルでInnoDBを使用している場合は、SELECT ... FOR UPDATE;を使用してより複雑なソリューションを使用できます。 テーブルロックの代わりに、しかし私はあなたがアイデアを得ると信じています。



    1. Oracleストアドプロシージャを使用したZip

    2. docker-composeを使用してdjangoコンテナとmysqlコンテナをリンクする

    3. PerconaXtraDBクラスターを8.0にアップグレードするためのヒント

    4. 非の最後に挿入されたIDを取得する方法はありますか?MySQLで自動インクリメントされた列ですか?