Se fue la luz - ¿Terminó la consulta?

9

¿Hay alguna forma de verificar y ver si una consulta ha terminado? Ejecuté 3 consultas de actualización de muy larga duración (+/- 25 horas cada una) cuando salí por la puerta de vacaciones la semana pasada. Desafortunadamente, en algún momento durante la semana se fue la luz y la máquina que ejecuta MYSQL se apagó. ¿Hay alguna forma de verificar y ver cuál de las 3 (o las tres) consultas se completaron?

Sé que podría verificar si los datos se han actualizado, pero cabe esperar NULL con una ejecución correcta y completa, y hay 48 millones de filas de datos para examinar detenidamente. ¿Alguna idea?


fuente
66
Los registros ... si registras cosas. Si no lo hace, le recomiendo comenzar.
Ben
1
@Ben: demasiado tarde para recomendar un UPS y un procesamiento transaccional, supongo.
1
Si está utilizando InnoDB, puede hacer su código en las transacciones. dev.mysql.com/doc/refman/5.0/en/commit.html
1
Si tenía activado el registro lento de consultas, entonces las consultas lentas probablemente habrían terminado en el registro lento de consultas.
3
Y, en caso de que no se haya completado correctamente, ¿tiene una copia de seguridad?

Respuestas:

9

Si está ejecutando con registros binarios habilitados, esto puede verificarse con una confiabilidad relativamente alta.

Primero, para ver si los registros binarios están habilitados, ejecute:

SHOW BINARY LOGS;

Si están habilitados, debería obtener una salida como esta:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

De lo contrario, recibirá un mensaje de error.

Ahora, si los registros binarios están habilitados, cualquier confirmación exitosa también se escribe en los registros binarios. Digo "commit", pero la verdad es que cualquier operación exitosa, incluso en tablas no transaccionales como MyISAM, está escrita allí. Pero, para ser honesto, para tener alguna certeza sobre el resultado de sus consultas, espero por su bien que esté utilizando un motor transaccional como InnoDB, o de lo contrario no puede estar seguro de nada.

De acuerdo, suponiendo que ahora tiene los registros binarios activados y que sus tablas son transaccionales (con suerte, InnoDB), se espera que se completen con éxito sus consultas en los registros binarios.

Ahora debe buscar el registro binario relevante y buscar la consulta allí. Si encuentra la consulta, ¡bien! Si no, probablemente no esté allí. Te lo explicaré en breve.

¿Qué registro binario contiene su consulta? Mire los archivos de registro binarios, generalmente en su directorio de datos. Busque sus marcas de tiempo. Cuando surgió el poder, se creó un nuevo registro binario. Encuéntralo. Sus consultas están probablemente en el registro binario uno antes de ese. Esto es una suposición. También podría ser uno antes de eso, etc. Pero es una buena suposición.

Ahora, usando la mysqlbinlogutilidad, ejecute, desde la línea de comandos, algo como esto:

mysqlbinlog mysql-bin.000245

Reemplace el nombre del archivo con el que sospecha que contiene la consulta.

Esto generará todas las consultas en este archivo de registro binario en la salida estándar. En Unix, use greppara encontrar su consulta:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

En Windows, buena suerte. Abra con notepad ++ o algo y busque manualmente.

¿La consulta está ahí? Genial, sabes que se ha comprometido.

¿La consulta no está ahí? Necesito verificar el sync_binlogparam. ¿Es 1 ? Entonces consulta no en registro binario ==> consulta no confirmada. Pero si sync_binlogno es 1 , aún podría existir la posibilidad de que la consulta se haya confirmado pero no en el registro binario, ya que el bloqueo pudo haber ocurrido justo después commity justo antes de que el registro binario se volcara al disco. Entonces necesita volver a otros medios.

Estos son: (y con suerte, nuevamente, está usando InnoDB): busque una sola fila que pueda identificar el resultado de la consulta. Con InnoDB obtienes "todo o nada". Si puede estar seguro de una sola fila afectada por la consulta, puede estar seguro de que la consulta se ha completado.

editar: por supuesto, si el registro lento está habilitado, puede esperar que una consulta tan larga se registre allí después de completarse también ...

¡Buena suerte!

Shlomi Noach
fuente
2
Espero que te quedes.
jcolebrand
2
@jcolebrand Rolando podría hacer algo de competencia aquí :)
Philᵀᴹ