2009-06-18 76 views
12

Cách nhanh nhất để thêm cột mới vào bảng mysql lớn là gì?Thêm cột mới vào bảng mysql lớn

Thay đổi bảng thêm cột tạo bản sao của bảng đầy đủ và sau đó thay thế bảng cũ bằng bảng tạo mới. Trong khi quá trình này đang chạy, bảng gốc có thể đọc được, nhưng tất cả các chèn và cập nhật đều bị ngừng lại.

Trên các bảng lớn, bản sao có thể mất nhiều thời gian, có cách nào để giảm bớt không?

+0

câu hỏi liên quan: http://stackoverflow.com/questions/1645215/how-do-i-add-a-column-to-large-sql-server-table –

+1

Hãy xem xét điều chỉnh innodb_log_file_size (Nhưng hãy cẩn thận, xem http://www.mysqlperformanceblog.com/2011/07/09/how-to-change-innodb_log_file_size-safely/) và innodb_log_buffer_size. Để biết thêm thông tin, hãy xem câu trả lời của tôi ở đây: http://stackoverflow.com/a/12688184/1148030 –

Trả lời

5

Bạn đang mắc kẹt khi thực hiện ALTER TABLE. Cách tốt nhất để giải quyết vấn đề này là sử dụng thiết lập MASTER-MASTER.

Bạn có thể sửa đổi MASTER1 trước và chỉ sử dụng MASTER2 trong quá trình sản xuất. Sau đó, bạn chuyển đổi và làm ngược lại.

2

Không thực hiện việc này trực tiếp trên hệ thống đang hoạt động. Đối với một hệ thống hoạt động, làm điều này trong khi bạn đưa hệ thống xuống để bảo trì thường xuyên.

+0

Có thể thực hiện cập nhật trong hộp nô lệ, nhưng có cách nào khác để tạo lại các cập nhật trên thực tế ? nhật ký nhị phân hoặc thứ gì đó tương tự. Cách thủ công sẽ ghi nhật ký mọi lần chèn hoặc cập nhật và áp dụng theo cùng thứ tự. – Maraino

1

Giả sử một bảng InnoDB:

  1. Sao chép {Bảng hiện tại} để {New Bảng} không có dữ liệu (schema chỉ)
  2. Sử dụng Alter bảng lệnh để thêm/thay đổi cột trên bảng MỚI (nên làm việc trong nháy mắt)
  3. mysqldump bảng hiện có (sử dụng đơn giao dịch, --no-thả bảng, vv) để nộp tập tin dump
  4. nhập khẩu vào {New bảng} (điều này có thể mất một thời gian, nhưng bảng cũ vẫn có thể sử dụng trong khoảng thời gian này)
  5. d thời gian bảo dưỡng, DROP {Old Table} và đổi tên {New Table} thành {Old Table} trước đó.
Các vấn đề liên quan