Sfortunatamente anche fare la copia in piccoli lotti di 100 righe genera un ritardo significativo dopo qualche tempo.
Stai aggiungendo qualche ritardo tra ogni batch o stai semplicemente raggruppando gli aggiornamenti ed eseguendo ogni batch direttamente dopo quello precedente?
In tal caso, prova a creare script per la conversione nella tua lingua preferita con qualcosa del tipo:
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
Ciò dovrebbe garantire che la conversione non richieda più o meno della metà della capacità del server, anche tenendo conto delle differenze di carico imposte dal momento che l'utilizzo del sistema varia nel tempo.
O se si desidera utilizzare quanto più tempo possibile quando il servizio è relativamente inattivo ma arretrare (potenzialmente in pausa per un certo periodo di tempo) quando il database deve fare un po 'di lavoro per i propri utenti, sostituirlo sleep for as long as the update took
con 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>
. Ciò significa che può andare avanti a vapore in tempi tranquilli ma si interromperà completamente quando il server è occupato a eseguire il normale carico di lavoro. La determinazione del carico dipenderà dal tuo sistema operativo: in Linux e simili dovrebbe valere il valore medio del carico di 1 minuto /proc/loadavg
o l'output di uptime
. <lower measure>
e <upper measure>
può avere lo stesso valore, anche se è normale che i controlli di questo tipo abbiano una differenza, in modo che il processo non continui a iniziare, quindi a mettere immediatamente in pausa a causa del suo riavvio che ha un'influenza sulla misura del carico.
Ovviamente questo non funzionerebbe per le tabelle in cui le vecchie righe possono essere modificate, ma funzionerà bene per una tabella di registro come quella che descrivi.
In questo caso, vorrai ignorare la solita saggezza della creazione di indici dopo aver popolato la nuova tabella. Mentre questo è davvero più efficiente quando vuoi che le cose siano il più velocemente possibile (l'effetto sul resto del sistema sia dannato), in questo caso non vuoi il grande eccesso di carico alla fine del processo come il gli indici sono completamente creati in una volta sola poiché questo è un processo che non puoi mettere in pausa quando le cose si fanno impegnate.