Soy un desarrollador de PHP, así que no seas estricto. Tengo una gran mesa ~ 5.5 gb volcado. Nuestro primer ministro decidió crear una nueva columna para realizar una nueva función. La tabla es InnoDB, así que lo intenté:
Alterar la mesa en la pantalla con bloqueo de mesa. Tomó ~ 30 horas y nada. Entonces lo detuve. Primero cometí un error porque no terminé todas las transacciones, pero la segunda vez no fue multilock. El estado era
copy to tmp table
.Como también necesito aplicar particiones para esta tabla, decidimos hacer un volcado, cambiar el nombre y crear una tabla con el mismo nombre y una nueva estructura. Pero dump está haciendo una copia estricta (al menos no encontré otra cosa). Así que agregué para volcar una nueva columna
sed
y consultarla. Pero comenzaron algunos errores extraños. Creo que fue causado por charset. La tabla en utf-8 y el archivo se convirtieron en us-ascii despuéssed
. Entonces obtuve errores (comando desconocido '\' ') en el 30% de los datos. Entonces esta también es una mala manera.
¿Cuáles son otras opciones para lograr esto y acelerar el rendimiento (puedo hacerlo con el script php, pero tomará años)? ¿Cuál será el rendimiento INSERT SELECT
en este caso?
Gracias por cualquier avance.
SET NAMES utf8
y.COLLATION
Pero meh idk por qué el 30% de los datos se corrompió despuéssed
. Creo que la carga masiva será la más rápida, pero tal vez exista algo más que me estoy perdiendo. Gracias MarkSu idea sed es un método decente, pero sin los errores o el comando que ejecutó, no podemos ayudarlo.
Sin embargo, un método bien conocido para realizar cambios en línea en tablas grandes es pt-online-schema-change . La descripción simplista de lo que hace esta herramienta se copia de la documentación:
Este método también puede tardar un tiempo en completarse, pero durante el proceso la tabla original será completamente utilizable.
fuente
'D\'agostini'
causará errorunknown command '\''
. Pero no siempre, como en el 30% de los casos. Eso es extraño y con errores. Lo mismo ocurre incluso con los volcados de blobs hexadecimales. Gracias Derekalter table add column, algorithm=inplace, lock=none
alterará una tabla MySQL 5.6 sin copiar la tabla y sin impacto de bloqueo.Apenas probé esto ayer, la masa insertó 70K filas en una tabla de partición de 280K fila 7, 10K filas en cada partición, con 5 segundos de descanso en el medio para permitir otro rendimiento.
Comenzó las inserciones masivas, luego, en una sesión separada, comencé la
alter
declaración en línea anterior en MySQL Workbench,alter
terminó antes de las inserciones, se agregaron dos nuevas columnas y no hubo filas como resultado de la modificación, lo que significa que MySQL no copió ninguna fila.fuente
Actualmente, la mejor opción para alterar tablas enormes es probablemente https://github.com/github/gh-ost
gh-ost es una solución de migración de esquemas en línea sin disparadores para MySQL. Es comprobable y proporciona capacidad de pausa, control dinámico / reconfiguración, auditoría y muchas ventajas operativas.
gh-ost produce una carga de trabajo ligera en el maestro durante la migración, desacoplada de la carga de trabajo existente en la tabla migrada.
Ha sido diseñado en base a años de experiencia con soluciones existentes y cambia el paradigma de las migraciones de tablas.
fuente
Creo que Mydumper / Myloader es una buena herramienta para operaciones como esta: está mejorando cada día. Puede utilizar sus CPU y cargar datos en paralelo: http://www.percona.com/blog/2014/03/10/new-mydumper-0-6-1-release-offers-several-performance-and- características de usabilidad /
He logrado cargar cientos de gigabytes de tablas MySQL en horas.
Ahora, cuando se trata de agregar una nueva columna, es complicado ya que MySQL copia toda la tabla en el
TMP
área de memoria conALTER TABLE...
Aunque MySQL 5.6 dice que puede hacer cambios en el esquema en línea, no he logrado hacerlo en línea para tablas masivas sin bloqueo contención hasta ahora.fuente
Acabo de tener el mismo problema. Una pequeña solución:
CREATE TABLE new_table SELECT * FROM oldtable;
BORRAR DE new_table
ALTER TABLE new_table ADD COLUMN new_column int (11);
INSERTAR EN new_table select *, 0 de old_table
soltar tabla old_table; renombrar tabla new_table TO old_table;
fuente