Capítulo 27. Extender MySQL

MySQL 5.0

Capítulo 27. Extender MySQL

27.1. El interior de MySQL

Este capítulo describe muchas cosas que necesita saber cuando trabaje con el código de MySQL. Si planea contribuir al desarrollo de MySQL, quiere tener acceso al límite de código de versiones, o sólo quiere estar al día del desarrollo, siga las instrucciones en Sección 2.8.3, “Instalar desde el árbol de código fuente de desarrollo”. Si está interesado en conceptos internos de MySQL, debe suscribirse a la lista de correo . Esta lista tiene poco tráfico. Para más detalles sobre cómo suscribirse, consulte Sección 1.6.1.1, “Las listas de correo de MySQL”. Todos los desarrolladores en MySQL AB están en la lista y ayudamos a otra gente trabajando en el código de MySQL. Siéntase libre de usar esta lista para preguntar cosas sobre el código y para enviar parches con los que quiera contribuir al proyecto MySQL!

27.1.1. Los subprocesos (threads) MySQL

MySQL server crea los siguientes flujos:

  • El flujo de conexión TCP/IP trata todas las peticiones de conexión y crea un nuevo flujo dedicado para tratar el proceso de autenticación y de consulta SQL para cada conexión.

  • En Windows NT hay un flujo para tratar los named pipes que hace el mismo trabajo que el flujo de conexiones TCP/IP en peticiones de conexión por named pipe.

  • El flujo de señales trata todas las señales. Este flujo también trata normalmente alarmas y llamadas para forzar tiempos máximos en las conexiones que llevan en espera demasiado tiempo.

  • Si se compila mysqld con ,se crea un flujo dedicado que trata alarmas. Sólo se usa en algunos sistemas donde hay problemas con o si quiere usar el código en su aplicación sin un flujo dedicado a tratar señales.

  • Si usa la opción , se crea un flujo dedicado para volcar todas las tablas en un intervalo dado.

  • Cada conexión tiene su propio flujo.

  • Cada tabla diferente en que se usa tiene su propio flujo.

  • Si usa , se arranca un flujo de replicación esclavo para leer y aplicar actualizaciones del maestro.

mysqladmin processlist sólo muestra la conexión, , y flujos de replicación.

27.1.2. El paquete de pruebas MySQL Test

El sistema de testeo incluído en distribuciones fuente Unix y distribuciones binarias hace que sea posible para los usuarios y desarrolladores realizar tests de regresión en código MySQL. Estos tests pueden ejecutarse en Unix o en Windows (usando el entorno Cygwin) si el servidor se ha compilado bajo Cygwin. No pueden ejecutarse en un entorno Windows nativo.

El conjunto actual de casos de uso no testea todo en MySQL, pero debería atrapar la mayoría de bugs óbvios en el código de proceso SQL, temas de bibliotecas del SO, y es bastante útil para testear replicación. Nuestra meta eventual es que el test cubra el 100% del código. Los contribuidores de nuestra suite de test son bienvenidos. Puede querer contribuir con tests que examinen la funcionalidad crítica del sistema, ya que esto asegura que todas las futuras versiones de MySQL funcionen bien con sus aplicaciones.

27.1.2.1. Ejecutar el paquete de pruebas MySQL Test

El sistema de test consiste en un intérprete de idioma de test (mysqltest), un shell script para ejecutar todos los tests(mysql-test-run), los casos de usos de test actuales escritos en un lenguaje especial de test, y sus resultados esperados. Para ejecutar la test suite en su sistema tras construirlo escriba make test o de la raíz del código fuente. Si ha instalado una distribución binaria, a la raíz de la instalación (ej. ), y ejecute . Todos los test deberían tener éxito. Si no es así, debería intentar encontrar porqué y reportar el problema si es un bug de MySQL. Consulte Sección 27.1.2.3, “Reporting Bugs in the MySQL Test Suite”.

Desde MySQL 4.1 , si tiene una copia de mysqld ejecutándose en la máquina donde quiere ejecutar el test suite no tiene que pararlo, mientras no use los puertos y . Si uno de esos puertos está ocupado, debe editar mysql-test-run y cambiar los valores de los puertos maestro y/o esclavo a uno que esté disponible.

Antes de MySQL 4.1, mysql-test-run no intenta ejecutar su propio servidor por defecto pero intenta usar su servidor que esté en ejecución. Para cambiar este comportamiento y hacer que mysql-test-run arranque su propio servidor, ejecútelo con la opción .

Puede ejecutar un caso de test individual con .

Si falla un test, debe probar ejecutar mysql-test-run con la opción para chequear si algún otro test falla.

27.1.2.2. Extender el paquete de pruebas MySQL Test

Puede usar el lenguaje mysqltest para crear sus propios casos de test. Desafortunadamente, todavía no hay una documentación completa para el mismo. Sin embargo, puede ojear nuestros casos de uso y usarlos como ejemplo. Los siguientes puntos pueden ayudarle a empezar:

  • Los tests se encuentran en

  • Un caso de test consiste en comandos terminados por y es similar a la entrada del cliente de línea de comandos mysql . Un comando por defecto es una consulta que se envía a MySQL server, a no ser que se reconozca como comando interno (p.e. sleep).

  • Todas las consultas que producen resultados--por ejemplo, , , , etc., debe precederse con . El fichero debe contener los resultados esperados. Una forma fácil de generar el fichero de resultados es ejecutar mysqltest -r <t/test-case-name.test del directorio , y editar los ficheros resultantes, si es necesario, para ajustarlos a la salida esperada. En ese caso, sea muy cuidadoso de no añadir o borrar carácteres invisibles -- asegúrese de cambiar sólo el texto y/o borrar líneas. Si tiene que insertar una línea, aségurese que los campos estén separados por un tabulador, y que hay un tabulador al final. Si quiere puede usar od -c para asegurarse que su editor de texto no ha desbaratado nada durante la edición. Esperamos que nunca tenga que editar la salida de mysqltest -r ya que sólo tiene que hacerlo al encontrar un bug.

  • Para ser consistente con nuestra inicialización, debe poner sus ficheros resultantes en el directorio y llamarlos . Si el test produce más de un resultado, debe usar , , etc.

  • Si un comando retorna un error, debe especificarlo con en la línea anterior al comando. El número de error puede ser una lista de números de error posibles separados por ''.

  • Si está escribiendo un caso de test de replicación, debe poner en la primera línea del fichero de test, . Para cambiar entre maestro y esclavo, use y . Si necesita hacer algo en una conexión alternativa, puede hacer para el maestro, y para el esclavo.

  • Si necesita hacer algo en un bucle, puede usar algo como esto:

    let $1=1000;
    while ($1)
    {
     # do your queries here
     dec $1;
    }
    

  • Para dormir entre consultas, use el comando sleep. Soporta fracciones de segundo, así que puede usar sleep 1.3;, por ejemplo, para dormir 1.3 segundos.

  • Para ejecutar el esclavo con opciones adicionales para sus casos de test, póngalos en el formato de línea de comandos en . Para el maestro, póngalas en .

  • Si tiene una pregunta sobre la suite de test, o tiene un caso de test al que contribuir, envíe un email a la lista de correo MySQL . Consulte Sección 1.6.1.1, “Las listas de correo de MySQL”. Como esta lista no acepta adjuntos, debe subir por ftp todos los ficheros relevantes a: ftp://ftp.mysql.com/pub/mysql/upload/

27.1.2.3. Reporting Bugs in the MySQL Test Suite

Si su versión de MySQL no pasa el suite de test debe hacer lo siguiente:

  • No envíe un reporte de bug antes que haya encontrado todo lo posible sobre qué ha ido mal! Cuando lo haga, por favor use el script mysqlbug para que podamos obtener información sobre el sistema y la versión MySQL. Consulte Sección 1.6.1.3, “Cómo informar de bugs y problemas”.

  • Asegúrese de incluir la salida de mysql-test-run, así como los contenidos de todos los ficheros en el directorio .

  • Si falla un test en la suite, chequee si el test también falla al ejecutarlo en solitario:

    cd mysql-test
    mysql-test-run --local test-name
    

    Si esto falla, debe configurar MySQL con y ejecutar mysql-test-run con la opción . Si también falla envíe el fichero de traza a ftp://ftp.mysql.com/pub/mysql/upload/ para que podamos examinarlo. Por favor recuerde de incluir una descripción completa de su sistema, la versión del binario mysqld y cómo lo compiló.

  • También intente ejecutar mysql-test-run con la opción para ver si hay algún otro test que falla.

  • Si ha compilado MySQL usted mismo, chequee nuestro manual para ver cómo compilar MySQL en su plataforma, o preferiblemente, usar uno de los binarios que hemos compilado en http://dev.mysql.com/downloads/. Todos nuestros binarios estándard deben pasar la suite de tests!

  • Si obtiene un error como o significa que la salida del test no coincide exactamente con la salida esperada. Este puede ser un bug en MySQL o que su versión de mysqld produce resultados ligeramente distintos bajo algunas circunstancias.

    Los resultados de tests fallidos se ponen en un fichero con el mismo nombre base que el fichero de resultados con la extensión . Si su caso de test falla, debe hacer un diff entre los dos ficheros. Si no puede ver en qué se distinguen, exemine ambos con y compruebe los tamaños.

  • Si un test falla completamente, debe chequear los ficheros de logs en el directorio para ayudas sobre qué ha fallado.

  • Si ha compilado MySQL con depuración puede intentar depurarlo ejecutando mysql-test-run con las opciones y/o . Consulte Sección D.1.2, “Crear ficheros de traza”.

    Si no ha compilado MySQL para depuración debería hacerlo. Especifique la opción en configure. Consulte Sección 2.8, “Instalación de MySQL usando una distribución de código fuente”.