Cómo extraer todas las consultas en ejecución de un archivo central en MySQL

Esta publicación se basa en ¿Cómo obtener el «LES» (última declaración ejecutada) de un volcado de núcleo optimizado? Post escrito hace un año.

Un día después de la publicación de la publicación, Shane Bester escribió una versión mejorada, Cómo obtener todas las preguntas activas de un archivo central en su blog. Leer esa publicación es clave para entender lo que sigue.

Me enfrento a algunos errores complejos que funcionarían bien con las pruebas de SQL. Extraer la última declaración ejecutada (y quizás todas las preguntas que se ejecutan en el momento del bloqueo/afirmaciones) es crucial para generar correctamente los casos de prueba. Por ejemplo, puede obtener un seguimiento SQL completo de RQG o en otro lugar, pero ¿qué pasa si la declaración de bloqueo actual nunca se hizo en los registros? Este suele ser el caso, especialmente si está utilizando una versión anterior de RQG o está utilizando -log-output = FILE logging.

La idea aquí es extraer todas las consultas en ejecución (con mysqld fallido/bloqueado o no) de un archivo central y luego agregar estas declaraciones SQL al final de un caso de prueba para asegurarse de que se reproduzca el problema de bloqueo/afirmación/Valgrind.

Ahora, descubrí que no todos los archivos principales de mysqld tienen disponible la variable de subproceso global, lo que impide el uso del script de Shane como una solución automatizada universal. Entonces parece que necesitamos otra solución para obtener todas las preguntas que funcionen en todos los casos.

Usar la idea de macros de Shane parecía el camino a seguir (es decir, pasar por subprocesos y marcos para cada subproceso), pero el siguiente problema era que gdb se detenía tan pronto como encontraba un error. Este es un error conocido en el lenguaje de macros gdb. El resultado es que desde el marco x en el subproceso y gdb detendrá la ejecución porque «no existe tal subproceso/marco». Y no se sabe de antemano qué número de marco tendrá el marco do_command o incluso si hay uno. Ambos darán un error y harán que la macro gdb se cancele inmediatamente. No se usa de esa manera.

Parecía haber solo otra solución mencionada en línea; usar python para gdb ya que tiene un función «prueba:». Sin embargo, esta no es realmente una buena solución general, porque requiere que se compile gdb – con una pitón, por lo que requiere personalización para el servidor gdb.

Mirando más allá, encontré una solución. aquí

Se puede especificar el nombre de la función de la siguiente manera:
print do_command::thd->query_string.string.str

Esta es una excelente manera de evitar tener que pasar por todos los cuadros al verificar declaraciones en un script automatizado. También le permite ejecutar esta consulta para todos los subprocesos enviando la siguiente entrada a gdb (y puede hacerlo usando el redirector


thread 1
print do_command::thd->query_string.string.str
thread 2
print do_command::thd->query_string.string.str
thread 3
etc...

La idea aquí es que el redirector en gdb siga ejecutando declaraciones una tras otra, incluso si encuentra un error. El resultado: una buena lista de todas las preguntas que se ejecutan en el momento de la afirmación/bloqueo.

Para obtener una versión completa del script, ramifique lp: percona-qa (bzr branch lp: percona-qa) y verifique el archivo extract_query.gdb. Para ver un ejemplo de cómo posprocesar los resultados, puede usar algo similar a estas declaraciones de shell:


gdb ${BIN} ${CORE} >/dev/null 2>&1 < extract_query.gdb
grep '^$' /tmp/gdb_PARSE.txt | sed 's/^[$0-9a-fx =]*"//;s/[" t]*$//;s/$/;/' | grep -v '^$' > ./queries.txt

En este ejemplo, $ {BIN} es una variable BIN que apunta al binario mysqld, $ {CORE} apunta al archivo principal y /tmp/gdb_PARSE.txt se genera a partir del script extract_query.gdb gdb. El archivo queries.txt contiene todas las consultas, bien rematadas con el habitual «;» Terminador de SQL utilizado en MySQL.

¡Disfrutar!

Author: Ing. Luis

A lo largo de conocer Windows y otros sistemas operativos me eh encontrado con diversos tipos de error, ahora brindo soluciones según mi experiencia-

Deja un comentario