На жаль, навіть копіювання невеликими партіями по 100 рядків призводить до значного відставання через деякий час.
Ви додаєте будь-яку затримку між кожною партією або просто збираєте оновлення та запускаєте кожну партію безпосередньо після попередньої?
Якщо так, то спробуйте створити сценарій конверсії на вашій улюбленій мові чимось на зразок:
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
Це повинно забезпечити, щоб конверсія не займала більше, ніж половину потужності вашого сервера, навіть допускаючи різницю в навантаженні, що застосовується, оскільки використання системи змінюється з часом.
Або якщо ви хочете використати якомога більше часу, коли сервіс відносно не працює, але відключений (потенційно призупиняючи досить тривалий час), коли базі даних потрібно виконати певну роботу для своїх користувачів, замінити sleep for as long as the update took
на 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>
. Це означає, що він може випереджуватись у тихі часи, але повністю призупиниться, коли сервер зайнятий виконанням нормальної роботи. Визначення навантаження буде залежати від вашої ОС - під Linux та подібним середньозваженим значенням завантаження за 1 хвилину /proc/loadavg
або з результату, який uptime
повинен робити. <lower measure>
і це <upper measure>
може бути однакове значення, хоча зазвичай у таких елементах управління є різниця, тому ваш процес не продовжується, а відразу призупиняється через його власний перезапуск, який впливає на міру навантаження.
Звичайно, це не буде працювати для таблиць, де старі рядки можуть бути змінені, але це буде добре для таблиці журналів, як та, яку ви описуєте.
Ви захочете ігнорувати звичайну мудрість створення індексів після заповнення нової таблиці в цьому випадку. Хоча це дійсно ефективніше, коли ви хочете, щоб справи пройшли якомога швидше (вплив на решту системи буде проклятим), у цьому випадку ви не хочете, щоб в кінці процесу була велика навантаженість, як індекси створені повністю за один раз, оскільки це процес, який ви не можете призупинити, коли справа зайнята.