Tengo una tabla grande con una columna VARCHAR (20), y necesito modificarla para convertirme en una columna VARCHAR (50). Por lo general, realizar una TABLA DE ALTERACIÓN (agregar un TINYINT) en esta tabla en particular toma aproximadamente 90-120 minutos en completarse, por lo que realmente solo puedo hacerlo un sábado o domingo por la noche para evitar afectar a los usuarios de la base de datos. Si es posible, me gustaría hacer esta modificación antes de eso.
La columna también está indexada, lo que supongo hará que ALTER TABLE sea más lenta, ya que tiene que reconstruir el índice después de modificar la longitud de la columna.
La aplicación web está configurada en un entorno de replicación MySQL (26 esclavos y un maestro). Recuerdo que una vez que leí en alguna parte que un método es primero realizar ALTER TABLE en cada esclavo (minimizando el impacto en los usuarios), luego hacer esto en el Master, pero ¿eso no intentará replicar el comando ALTER TABLE a los esclavos?
Entonces mi pregunta es: ¿cuál es la mejor manera de modificar esta tabla con una interrupción mínima para mis usuarios?
Editar: la tabla es InnoDB.
fuente
Respuestas:
Si eres un poco aventurero, puedes tomar el asunto en tus manos realizando ALTER TABLE en etapas que puedas ver. Supongamos que la tabla que desea cambiar se llama WorkingTable. Puede realizar los cambios en etapas como esta:
Puedes realizar esto en todos los esclavos. ¿Qué hay del maestro? ¿Cómo evitas que esto se replique a los esclavos? Simple: no envíe el SQL a los registros binarios del maestro. Simplemente apague el registro binario en la sesión antes de hacer las cosas ALTER TABLE:
Pero espera !!! ¿Qué pasa con los datos nuevos que ingresan al procesar estos comandos? Cambiar el nombre de la tabla al comienzo de la operación debería ser el truco. Dejemos alterar un poco este código para evitar ingresar datos nuevos a ese respecto:
Darle una oportunidad !!!
fuente
Mi suposición de la documentación sería que el simple aumento de la restricción de longitud en un
varchar
no causaría el mismo problema que agregar una columna:Pero eso parece contradecirse en los comentarios sobre esta pregunta SO .
EDITAR
Al menos en 5.0, creo que puedo confirmar que aumentar la longitud de hecho requiere una tabla temporal (u otra operación igualmente costosa):
banco de pruebas:
resultado:
fuente
Pensé, lo mencionaría desde el
ENGINE=INNODB
Si tiene restricciones de clave externa, no puede alterar y cambiar el nombre sin sus restricciones apuntando a la tabla anterior (ahora renombrada). Tendrás que modificar después o eliminar las restricciones por la duración.
fuente