Leider führt selbst das Kopieren in kleinen Stapeln von 100 Zeilen nach einiger Zeit zu einer erheblichen Verzögerung.
Fügen Sie eine Verzögerung zwischen den einzelnen Stapeln hinzu, oder führen Sie die Aktualisierungen nur stapelweise aus und führen Sie jeden Stapel direkt nach dem vorherigen aus?
Wenn ja, dann schreiben Sie die Konvertierung in Ihre Lieblingssprache mit etwas wie:
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
Dies sollte sicherstellen, dass die Konvertierung nicht mehr als die Hälfte der Serverkapazität beansprucht, selbst wenn Unterschiede in der Auslastung berücksichtigt werden, da die Systemnutzung mit der Zeit variiert.
Oder wenn Sie so viel Zeit wie möglich verwenden möchten, während der Dienst relativ inaktiv ist, sich aber zurückzieht (möglicherweise für längere Zeit pausiert), wenn die Datenbank für ihre Benutzer etwas Arbeit erledigen muss, ersetzen Sie sleep for as long as the update took
durch 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>
. Dies bedeutet, dass es in ruhigen Zeiten vorwärtsdampfen kann, aber vollständig pausiert, wenn der Server mit seiner normalen Arbeitsauslastung beschäftigt ist. Die Bestimmung der Last hängt von Ihrem Betriebssystem ab - unter Linux und ähnlichen Bedingungen sollte der 1-Minuten-Durchschnittswert für die Last von /proc/loadavg
oder die Ausgabe von uptime
ausreichen. <lower measure>
und <upper measure>
kann derselbe Wert sein, obwohl es in Steuerelementen wie diesem üblich ist, einen Unterschied zu haben, damit Ihr Prozess nicht weiter startet und dann sofort pausiert, da sein eigener Neustart einen Einfluss auf das Lastmaß hat.
Dies funktioniert natürlich nicht für Tabellen, in denen alte Zeilen möglicherweise geändert werden, aber für eine Protokolltabelle wie die von Ihnen beschriebene.
In diesem Fall sollten Sie die übliche Vorgehensweise beim Erstellen von Indizes ignorieren, nachdem Sie die neue Tabelle ausgefüllt haben. Das ist in der Tat effizienter, wenn Sie möchten, dass die Dinge so schnell wie möglich ablaufen (was sich verdammt auf den Rest des Systems auswirkt), aber in diesem Fall möchten Sie nicht, dass am Ende des Prozesses eine große Lastschwemme entsteht wie bei Indizes werden vollständig auf einmal erstellt, da dies ein Vorgang ist, den Sie nicht unterbrechen können, wenn etwas los ist.