Bienvenido a nuestra página, en este sitio vas a hallar la resolución de lo que estabas buscando.
Solución:
La única otra opción es hacer manualmente lo que muchos sistemas RDBMS hacen de todos modos…
– Crear una nueva tabla
Luego puede copiar el contenido de la tabla anterior en un fragmento a la vez. Aunque siempre tenga cuidado con cualquier INSERCIÓN/ACTUALIZACIÓN/ELIMINACIÓN en la tabla de origen. (Podría ser manejado por un gatillo. Aunque esto causaría una ralentización, no es un bloqueo…)
Una vez que termine, cambie el nombre de la tabla de origen, luego cambie el nombre de la nueva tabla. Preferiblemente en una transacción.
Una vez que termine, vuelva a compilar cualquier procedimiento almacenado, etc. que use esa tabla. Es probable que los planes de ejecución ya no sean válidos.
EDITAR:
Se han hecho algunos comentarios acerca de que esta limitación es un poco pobre. Así que pensé en ponerle una nueva perspectiva para mostrar por qué es así…
- Agregar un nuevo campo es como cambiar un campo en cada fila.
- Los bloqueos de campo serían mucho más difíciles que los bloqueos de fila, sin importar los bloqueos de mesa.
- De hecho, estás cambiando la estructura física del disco, cada registro se mueve.
- Esto realmente es como una ACTUALIZACIÓN en toda la tabla, pero con más impacto…
Percona crea una herramienta llamada pt-online-schema-change que permite hacer esto.
Esencialmente hace una copia de la tabla y modifica la nueva tabla. Para mantener la nueva tabla sincronizada con la original, utiliza disparadores para actualizar. Esto permite acceder a la tabla original mientras se prepara la nueva tabla en segundo plano.
Esto es similar al método sugerido anteriormente por Dems, pero lo hace de manera automatizada.
Algunas de sus herramientas tienen una curva de aprendizaje, es decir, conectarse a la base de datos, pero una vez que lo domina, son excelentes herramientas para tener.
Ex:
pt-online-schema-change --alter "ADD COLUMN c1 INT" D=db,t=numbers_are_friends
Esta pregunta de 2009. Ahora MySQL ofrece una solución:
DDL en línea (lenguaje de definición de datos)
Una función que mejora el rendimiento, la concurrencia y la disponibilidad de las tablas InnoDB durante las operaciones DDL (principalmente ALTER TABLE). Consulte la Sección 14.11, “InnoDB y DDL en línea” para obtener más detalles.
Los detalles varían según el tipo de operación. En algunos casos, la tabla se puede modificar simultáneamente mientras ALTER TABLE está en curso. Es posible que la operación se pueda realizar sin realizar una copia de la tabla o utilizando un tipo de copia de la tabla especialmente optimizado. El uso del espacio está controlado por la opción de configuración innodb_online_alter_log_max_size.
Le permite ajustar el equilibrio entre el rendimiento y la concurrencia durante la operación DDL, eligiendo si desea bloquear el acceso a la tabla por completo (cláusula LOCK=EXCLUSIVE), permitir consultas pero no DML (cláusula LOCK=SHARED) o permitir consultas completas y DML acceso a la tabla (cláusula LOCK=NONE). Cuando omite la cláusula LOCK o especifica LOCK=DEFAULT, MySQL permite la mayor concurrencia posible según el tipo de operación.
Realizar cambios en el lugar siempre que sea posible, en lugar de crear una nueva copia de la tabla, evita aumentos temporales en el uso del espacio en disco y la sobrecarga de E/S asociada con la copia de la tabla y la reconstrucción de índices secundarios.
consulte el Manual de referencia de MySQL 5.6 -> InnoDB y DDL en línea para obtener más información.
Parece que DDL en línea también está disponible en MariaDB
Alternativamente, puede usar ALTER ONLINE TABLE para asegurarse de que su ALTER TABLE no bloquee operaciones concurrentes (no tome bloqueos). Es equivalente a LOCK=NONE.
MariaDB KB sobre ALTER TABLE
Comentarios y valoraciones
Tienes la opción de sustentar nuestro estudio añadiendo un comentario o dejando una valoración te damos las gracias.