BUG MySQL 5.7, Reutilizacion de IDs autoincrementables

En esta ocasión les quiero compartir acerca de este bug presente actualmente en Mysql 5.7 y al mismo tiempo mi experiencia al encontrarme con dicho bug.

En terminos generales el problema se debe a que Mysql 5.7 (InnoDB) no persiste el ID siguiente a asignar para los campos autoincrementales, sino que cada vez que la BD inicia “mira” cual es el ultimo ID asignado y en base a este empieza a asignar los siguientes, esto puede acarrear problemas serios de consistencia de datos. Veamos un ejemplo:

Tenemos el siguiente escenario:

2 BDs, cada una con una sola tabla, la tabla point_of_sales tiene referencia en sale_id a la tabla sales de la BD1. Si vemos estas 2 tablas de arriba (ignorando las lineas rojas) vemos un escenario “normal”, 2 tablas relacionadas sin llave foránea.

Siguiendo la imagen, ahora eliminamos de la tabla sales los registros 44 y 45, hasta este punto esperariamos que si insertamos otro registro este se haga con el ID 46, PEROOO, vamo a reiniciar la BD, por el motivo que sea: a proposito, el server al detectar que este se cayó, si lo tenemos bajo docker el famoso restart: always, etc.

Se reinicia la BD, insertamos 2 registros nuevos y que nos encontramos? Los nuevos registros se insertaron con los mismos IDs que habiamos eliminado! Ahora la tabla point_of_sales a quedado con registros apuntando a IDs de la tabla sales que no corresponden, generando una inconsistencia critica en los datos.

Que pasó? Cuando la BD reinició vio el ultimo registro con ID asignado, el 43 (ya que eliminamos el 44 y 45) entonces en base a eso el guardó en sus registros para que el siguiente registro a insertar sea el 44 y así sucesivamente.


Espero les guste este contenido, si tienen algun comentario no duden en dejar abajo.


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *