Thật không may, ngay cả việc sao chép theo lô nhỏ 100 hàng cũng tạo ra độ trễ đáng kể sau một thời gian.
Bạn có thêm bất kỳ độ trễ nào giữa mỗi đợt hay chỉ là cập nhật các bản cập nhật và chạy từng đợt trực tiếp sau đợt trước?
Nếu vậy, hãy thử kịch bản chuyển đổi bằng ngôn ngữ yêu thích của bạn với nội dung như:
repeat
copy oldest 100 rows that haven't been copied yet to new table
sleep for as long as that update took
until there are <100 rows unprocessed
stop logging service
move the last few rows
rename tables
restart logging
delete the old table when you are sure the conversion has worked
Điều này sẽ đảm bảo rằng việc chuyển đổi không chiếm hơn một nửa công suất máy chủ của bạn, thậm chí cho phép chênh lệch tải được áp đặt khi việc sử dụng hệ thống thay đổi theo thời gian.
Hoặc nếu bạn muốn sử dụng càng nhiều thời gian càng tốt khi dịch vụ tương đối nhàn rỗi nhưng bị tắt (có khả năng tạm dừng khá lâu) khi cơ sở dữ liệu cần thực hiện một số công việc cho người dùng, hãy thay thế sleep for as long as the update took
bằng if the server's load is above <upper measure>, sleep for some seconds then check again, loop around the sleep/check until the load drops below <lower measure>
. Điều này có nghĩa là nó có thể hấp về phía trước trong thời gian yên tĩnh nhưng sẽ tạm dừng hoàn toàn khi máy chủ đang bận thực hiện khối lượng công việc bình thường. Việc xác định tải sẽ phụ thuộc vào HĐH của bạn - trong Linux và tương tự giá trị trung bình tải trong 1 phút từ /proc/loadavg
hoặc đầu ra uptime
nên làm. <lower measure>
và <upper measure>
có thể là cùng một giá trị, mặc dù thông thường trong các điều khiển như thế này có sự khác biệt để quá trình của bạn không bắt đầu sau đó ngay lập tức tạm dừng do việc khởi động lại của chính nó có ảnh hưởng đến biện pháp tải.
Tất nhiên điều này sẽ không hoạt động đối với các bảng nơi các hàng cũ có thể được sửa đổi, nhưng sẽ hoạt động tốt đối với bảng nhật ký như bảng bạn mô tả.
Bạn sẽ muốn bỏ qua sự khôn ngoan thông thường của việc tạo các chỉ mục sau khi điền vào bảng mới trong trường hợp này. Mặc dù điều đó thực sự hiệu quả hơn khi bạn muốn mọi thứ diễn ra nhanh nhất có thể (ảnh hưởng đến phần còn lại của hệ thống bị nguyền rủa), trong trường hợp này bạn không muốn tải trọng lớn vào cuối quá trình như các chỉ mục được tạo hoàn toàn trong một lần vì đây là quá trình bạn không thể tạm dừng khi mọi thứ bận rộn.