mysql - change - ALTER TABLE ADD COLUMN lleva mucho tiempo
change size varchar mysql (3)
Solo intentaba agregar una columna llamada "ubicación" a una tabla (main_table) en una base de datos. El comando que ejecuté fue
ALTER TABLE main_table ADD COLUMN location varchar (256);
La tabla principal contiene> 2,000,000 filas. Sigue funcionando durante más de 2 horas y aún no se completa.
Traté de usar mytop
para monitorear la actividad de esta base de datos para asegurarme de que la consulta no esté bloqueada por otro proceso de consulta, pero parece que no. Se supone que tomará tanto tiempo? En realidad, acabo de reiniciar la máquina antes de ejecutar este comando. Ahora este comando aún se está ejecutando. No estoy seguro de qué hacer.
Alterar la tabla lleva mucho tiempo con un gran dato como en su caso, así que evite usarlo en tales situaciones, y use algún código como este:
select main_table.*,
cast(null as varchar(256)) as null_location, -- any column you want accepts null
cast('''' as varchar(256)) as not_null_location, --any column doesn''t accept null
cast(0 as int) as not_null_int, -- int column doesn''t accept null
into new_table
from main_table;
drop table main_table;
rename table new_table TO main_table;
Creo que la respuesta adecuada para esto es usar una función como pt-online-schema-change o gh-ost .
Hemos hecho una migración de más de 4 mil millones de filas con esto, aunque puede llevar hasta 10 días, con menos de un minuto de inactividad.
Percona funciona de una manera muy similar a la anterior
- Crea una tabla temporal
- Crea activadores en la primera tabla (para inserciones, actualizaciones, eliminaciones) para que se repliquen en la tabla temporal
- En pequeños lotes, migrar datos
- Cuando haya terminado, cambie el nombre de la tabla a la nueva tabla, y suelte la otra tabla
Su instrucción ALTER TABLE
implica que mysql tendrá que volver a escribir cada fila de la tabla, incluida la nueva columna. Dado que tiene más de 2 millones de filas, definitivamente esperaría que tome una cantidad significativa de tiempo, durante el cual su servidor probablemente estará mayormente vinculado a IO. Por lo general, encontrará que es más eficiente hacer lo siguiente:
CREATE TABLE main_table_new LIKE main_table;
ALTER TABLE main_table_new ADD COLUMN location varchar(256);
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table;
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table;
DROP TABLE main_table_old;
De esta forma, agrega la columna en la tabla vacía y básicamente escribe los datos en esa nueva tabla que está seguro que nadie más verá sin bloquear tantos recursos.