Desafortunadamente, incluso copiar en lotes pequeños de 100 filas genera un retraso significativo después de un tiempo.
¿Está agregando algún retraso entre cada lote, o simplemente agrupando las actualizaciones y ejecutando cada lote directamente después del anterior?
Si es así, intente escribir la conversión en su idioma favorito con algo como:
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
Esto debería garantizar que la conversión no tome más de más o menos la mitad de la capacidad de su servidor, incluso permitiendo diferencias en la carga impuesta ya que el uso del sistema varía con el tiempo.
O bien, si desea utilizar la mayor cantidad de tiempo posible cuando el servicio está relativamente inactivo pero retrocediendo (posiblemente haciendo una pausa durante un período de tiempo bastante prolongado) cuando la base de datos necesita hacer algún trabajo para sus usuarios, reemplácela 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>
. Esto significará que puede avanzar en tiempos de silencio, pero se detendrá por completo cuando el servidor esté ocupado realizando su carga de trabajo normal. La determinación de la carga dependerá de su sistema operativo: en Linux y similar, el valor promedio de carga de 1 minuto de /proc/loadavg
o la salida de uptime
debería hacer. <lower measure>
y <upper measure>
puede ser el mismo valor, aunque es habitual en controles como este tener una diferencia para que su proceso no continúe iniciando y luego pausando inmediatamente debido a que su propio reinicio influye en la medida de carga.
Por supuesto, esto no funcionaría para las tablas donde las filas antiguas pueden modificarse, pero funcionará bien para una tabla de registro como la que usted describe.
Deberá ignorar la sabiduría habitual de crear índices después de llenar la nueva tabla en este caso. Si bien eso es más eficiente cuando desea que las cosas sean lo más rápido posible (el efecto sobre el resto del sistema sea condenado), en este caso no desea el gran exceso de carga al final del proceso como el los índices se crean completamente de una vez, ya que este es un proceso que no puede pausar cuando las cosas se llenan.