Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

ERROR 1878 (HY000):Lỗi ghi tệp tạm thời

MySQL triển khai ALTER TABLE dưới dạng tái tạo bảng, do đó, hai bản sao của bảng tồn tại trên hệ thống ở một số giai đoạn trong quá trình này. Bạn sẽ cần hơn 12 GB dung lượng trống cho thao tác này.

Giải phóng một số không gian. Ngoài ra, hãy đặt máy chủ của bạn để sử dụng một thư mục tạm thời khác , nơi có đủ không gian.

Thay thế cho thay thế (WHILE có thể cần được gói trong một thủ tục được lưu trữ):

  • tạo một bảng mới (temp_table ) với cấu trúc mới
  • chuyển dữ liệu theo từng đợt nhỏ từ original_table vào temp_table
  • thả original_table và đổi tên 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;

Nếu bảng của bạn sử dụng InnoDB, có thể có một giải pháp phức tạp hơn với SELECT ... FOR UPDATE; thay vì khóa bàn, nhưng tôi tin rằng bạn hiểu được ý tưởng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chọn dữ liệu trong đó một trường có giá trị nhỏ nhất trong MySQL?

  2. Chèn MySQL trên bản cập nhật trùng lặp cho khóa không phải CHÍNH

  3. Ngoại lệ liên quan đến mysql thông qua jdbc

  4. Chuỗi được phân tách bằng dấu phẩy trong MySQL thành bảng tạm thời

  5. Tránh đưa vào SQL trong SQL-regex do người dùng tạo