Pregunta

Tengo una tabla myISAM en producción en mySQL, y al hacer algunas pruebas, hemos descubierto que podemos acelerar enormemente una consulta agregando un determinado índice compuesto. Hasta ahora tan bueno. Sin embargo, no estoy realmente sobre la mejor manera de agregar este índice en un entorno de producción sin bloquear la tabla durante mucho tiempo (tiene 27 GB de datos, así que no tanto, pero lleva un tiempo).

¿Tienes algún consejo? Si se tratara de una configuración más sofisticada, por supuesto, tendríamos una réplica en vivo de todos los datos en otra máquina y podríamos cambiar de forma segura. Lamentablemente, aún no hemos llegado y me gustaría acelerar esta consulta lo antes posible (está causando grandes dolores de cabeza al cliente). ¿Hay alguna forma sencilla de replicar los datos y luego hacer un truco de intercambio? ¿Otros trucos que me faltan?

ACTUALIZAR: Leer sobre " Operaciones de índice en línea " en SQL Server me pone muy celoso http://msdn.microsoft.com/en -us / library / ms191261.aspx :)

¡Gracias!

¿Fue útil?

Solución

puede usar la replicación para obtener un tiempo de inactividad del orden de un par de minutos, en lugar de las horas que puede tomar crear un índice en esa tabla.

para configurar el esclavo, consulte http: //dev.mysql.com/doc/refman/5.0/en/replication-howto-existingdata.html

una recomendación que puedo hacer para ayudar a acelerar el proceso es en el paso 2, siga la "Creación de una instantánea de datos utilizando archivos de datos sin procesar". método. pero en lugar de copiar sobre el cable al esclavo, copie en una ubicación diferente en el maestro. y haga que el maestro vuelva a funcionar tan pronto como se realice la copia y haya realizado los cambios necesarios en el archivo de configuración (establezca la identificación del servidor y el registro binario habilitado). Esto minimizará su tiempo de inactividad a solo un minuto o dos. una vez que el servidor está de vuelta, puedes copiar los archivos copiados a la caja de esclavos.

una vez que tenga el esclavo en funcionamiento y tenga verificado que todo se está replicando , puede pausar el esclavo . Crea el índice en la salve. cuando se complete la creación del índice, reanude el esclavo. esto atrapará al esclavo hasta el maestro. en el maestro, use la MESA DE ACABADO CON LECTURA BLOQUEADA. verifique el estado del esclavo para asegurarse de que la posición de registro en el maestro y el esclavo coincidan. si lo hacen, apague el esclavo y copie los archivos de esa tabla al maestro.

Otros consejos

Estoy con Randy. Hemos estado en una situación similar, y hay dos formas en MySQL para lograr algo como esto:

  1. Elimine el servidor mientras se ejecuta. Esto es lo que probablemente harás. Es simple, es fácil, funciona. Tiempo para hacer? Tal vez media hora / 45 minutos, dependiendo del ancho de banda del disco. Ver abajo.

  2. Cree una nueva tabla con el nuevo índice, copie todos los datos, pause el servidor, elimine la primera tabla, modifique la nueva al nombre anterior, inicie el servidor. ¿Falta del tiempo? 10 minutos, tal vez, pero realmente complicado.

La opción dos funciona y le ahorra el tiempo de inactividad de crear el índice (si lleva mucho tiempo). Pero requiere más espacio, es más complicado (ya que tiene que lidiar con los nuevos registros insertados fuera de la tabla principal, y probablemente se bloqueará en MyISAM mientras copia los datos. Eliminar una tabla llevará algún tiempo, alterando la tabla para el nuevo nombre llevará algún tiempo. Es realmente complicado. Si tuvieras una tabla de 2 TB, esto podría ser útil, pero para 27G es probable que sea excesivo.

¿Tiene un segundo servidor que está cerca de las especificaciones de su servidor de producción? Cargue su copia de seguridad más reciente y haga el índice allí, para saber cuánto tiempo llevará agregar. Luego planifique el tiempo de inactividad.

InnoDB es mejor en muchas cosas, pero los nuevos índices siguen bloqueando la tabla. Esas habilidades que MSSQL (y creo que PostgreSQL) tienen para hacer ese tipo de cosas sin bloqueo serían geniales.

Encuentre su ventana de bajo uso y desconecte su aplicación durante la creación del índice. Ya que no tienes replicación o un multimaster o lo que sea, solo tendrás que morder la bala en este caso. Nos vemos a la 1am. :-)

No hay mucho que puedas hacer con un servidor aquí.

Si copia la tabla y realiza un análisis en seco, al menos descubrirá cuánto tiempo tomará sin bloquear la mesa activa, por lo que puede programar un tiempo de mantenimiento si es necesario, o decidir si puede hacerlo. simplemente presione el botón y deje a los usuarios colgados durante un par de minutos :)

O programarlo para un momento tranquilo ...

at 04:00 /usr/bin/mysql -uXXX -pXXX -e 'alter table mytable add key(col1, col2)'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top