8.3. La herramienta intérprete de comandos mysql

MySQL 5.0

8.3. La herramienta intérprete de comandos mysql

mysql es un simple shell SQL (con capacidades GNU ). Soporta uso interactivo y no interactivo. Cuando se usa interactivamente, los resultados de las consultas se muestran en formato de tabla ASCII. Cuando se usa no interactivamente (por ejemplo, como filtro), el resultado se presenta en formato separado por tabuladores. El formato de salida puede cambiarse usando opciones de línea de comandos.

Si tiene problemas relacionados con memoria insuficiente para conjuntos de resultados grandes, utilice la opción . Esto fuerza mysql a devolver los resultados desde el servidor registro a registro en lugar de recibir todo el conjunto de resultados y almacenarlo en memoria antes de mostrarlo. Esto se hace usando en lugar de para recibir el conjunto de resultados.

Usar mysql es muy sencillo. Invóquelo desde el prompt de su intérprete de comandos como se muestra a continuación:

shell> mysql 

O:

shell> mysql --user= --password= 

Cuando introduzca un comando SQL, acábelo con '', , o y pulse Enter.

Puede ejecutar un script simplemente así:

shell> mysql  <  > 

mysql soporta las siguientes opciones:

  • ,

    Muestra el mensaje de ayuda y sale.

  • ,

    Muestra los resultados usando tabuladores como separadores de columnas, con cada registro en una nueva línea. Con esta opción mysql no usa el fichero de historial.

  • Directorio donde los conjuntos de caracteres están instalados. Consulte Sección 5.9.1, “El conjunto de caracteres utilizado para datos y ordenación”.

  • ,

    Comprime toda la información enviada entre el cliente y el servidor si ambos soportan compresión.

  • ,

    La base de datos a usar. Esto es útil sobretodo en un fichero de opciones.

  • ], ]

    Escribe un log de depuración. La cadena de caracteres a menudo es '. Por defecto es .

  • ,

    Muestra alguna información de depuración al salir del programa.

  • Usa como conjunto de caracteres por defecto. Consulte Sección 5.9.1, “El conjunto de caracteres utilizado para datos y ordenación”.

  • ,

    Ejecuta el comando y sale. El formato de salida por defecto es como el producido con . Consulte Sección 4.3.1, “Usar opciones en la raya de comando” para algunos ejemplos.

  • ,

    Continua incluso si ocurre un error SQL.

  • ,

    Conecta al servidor MySQL en el equipo especificado.

  • ,

    Produce la salida en HTML.

  • ,

    Ignora espacios tras los nombres de funciones. El efecto de esta opción se describe en la discusión para en Sección 5.3.2, “El modo SQL del servidor”.

  • Activa o desactiva la función para . Sin valor, la opción activa . Puede darse como o para desactivar explícitamente o activar . Activar no tiene efecto si el servidor no lo soporta.

  • ,

    Los comandos con nombre están activados por defecto. Se permite comandos con formato largo así como comandos abreviados con \*. Por ejemplo, se reconoce tanto como .

  • ,

    No hay un recálculo del hash (rehashing) automático. Esta opción hace que mysql arranque más rápido, pero debe realizar el comando si quiere usar el completado automático de tabla y columna.

  • ,

    No hace ningún sonido cuando ocurre un error.

  • ,

    Desactiva los comandos con nombre. Use la forma únicamente, o use comandos con nombre sólo al comienzo de una línea, acabando con punto y coma (''). Desde MySQL 3.23.22, mysql arranca con esta opción activada por defecto. De todos modos, incluso con esta opción, los comandos con formato largo funcionan desde la primera línea.

  • No usa paginación para mostrar la salida de una consulta. La paginación en la salida se discute más en Sección 8.3.1, “Comandos mysql.

  • No copia la salida en un fichero. Los ficheros tee se discuten más en Sección 8.3.1, “Comandos mysql.

  • ,

    Ignora comandos excepto aquéllos para la base de datos por defecto, nombrada en la línea de comandos. Esto es útil para evitar actualizaciones de otras bases de datos en el log binario.

  • ]

    Este comando se utiliza para paginar la salida de una consulta. Si el comando se omite, el paginador por defecto es el valor de la variable de entorno . Paginadores válidos son less, more, cat [> nombre_de_fichero], etcétera. Esta opción sólo funciona en Unix. No funciona en modo batch. La paginación de la salida de datos (output) se discute también en Sección 8.3.1, “Comandos mysql.

  • ], ]

    La contraseña a usar al conectar al servidor. Si se usa la forma de opción corta (), no se deben poner espacios entre la opción y la contraseña. Si se omite el valor de la contraseña, a continuación de o en la línea de comandos, aparece un prompt pidiéndola. La contraseña debe omitirse en sistemas Unix basados en SysV, ya que debe mostrarse en la salida de .

  • ,

    El puerto TCP/IP a usar en la conexión.

  • Asigna al prompt el formato especificado. Por defecto es . Las secuencias especiales que soporta el prompt se describen en Sección 8.3.1, “Comandos mysql.

  • Protocolo de conexión a usar.

  • ,

    No cachea cada resultado de consulta, muestra cada registro según va llegando. Esto puede ralentizar el servidor si la salida se suspende. Con esta opción, mysql no usa el fichero histórico.

  • ,

    Muestra los valores de las columnas sin conversión de escape. Se usa a menudo con la opción .

  • Si se pierde la conexión con el servidor, intenta reconectar automáticamente. Se intenta un único intento de reconexión cada vez que se pierde la conexión. Para eliminar el comportamiento de la reconexión, use .

  • , ,

    Sólo permite aquellos comandos y que especifica cuáles registros se deben modificar usando valores clave. Si tiene activada esta opción en un fichero de opciones, puede evitarla usando en la línea de comandos. Consulte Sección 8.3.3, “Sugerencias acerca de mysql para más información sobre esta opción.

  • No envía contraseñas al servidor en formato antiguo (pre-4.1.1). Esto evita realizar conexiones con servidores que no usen el formato de contraseña nuevo.

  • Muestra los mensajes de advertencia tras cada comando, si es necesario. Esta opción se aplica en modo interactivo y batch. Esta opción se añadió en MySQL 5.0.6.

  • Ignora señales (típicamente el resultado de pulsar Control-C).

  • ,

    Modo silencioso. Produce menos salida de datos (output). Esta opción puede utilizarse múltiples veces para producir cada vez menos salida de datos.

  • ,

    No escribe nombres de columnas en los resultados.

  • ,

    No escribe el número de línea en los errores. Es útil cuando se quiere comparar ficheros de resultados que incluyan mensajes de error.

  • ,

    Fichero socket a usar para la conexión.

  • ,

    Muestra la salida de datos (output) en formato de tabla. Éste es el modo de funcionamiento por defecto para modo interactivo, pero puede usarse para producir la salida de datos de la tabla en modo batch.

  • Añade una copia de la salida de datos (output) al fichero dado. Esta opción no funciona en modo batch. Más información sobre ficheros tee en Sección 8.3.1, “Comandos mysql.

  • ,

    Vuelca el buffer después de cada consulta.

  • ,

    El nombre de usuario MySQL usado al conectar al servidor.

  • ,

    Modo explícito. Produce más salida de datos (output) acerca de lo que hace el programa. Esta opción puede escribirse múltiples veces para producir más y más salida. (Por ejemplo, produce la salida de datos en formato de tabla incluso en modo batch.)

  • ,

    Muestra información de la versión y sale.

  • ,

    Muestra los registros de salida de la consulta verticalmente (una línea por cada valor). Sin esta opción, se puede solicitar este formato de salida de datos (output) para un comando escribiendo al final del mismo.

  • ,

    Si la conexión no puede establecerse, espera y vuelve a intentarlo en lugar de abortar.

  • ,

    Produce salida XML.

Puede asignar las siguientes variables usando las opciones =:

  • Número de segundos antes que la conexión dé un timeout. (El valor por defecto es 0).

  • La máxima longitud del paquete para enviar al o recibir del servidor. (El valor por defecto es 16MB).

  • El límite automático de registros en un join al usar . (El valor por defecto es 1.000.000).

  • El tamaño de búfer para comunicaciones TPC/IP y socket. (El valor por defecto es 16KB).

  • Límite automático para comandos al usar . (El valor por defecto es 1.000).

Es posible asignar valores a las variables usando la sintaxis = o =. En MySQL 5.0, esta sintaxis está obsoleta.

En Unix, el cliente mysql escribe un registro de los comandos ejecutados en un fichero histórico. Por defecto, el fichero histórico se llama y se crea en el directorio raíz del usuario. Para especificar un fichero diferente, cámbiese el valor de la variable de entorno .

Si no se quiere mantener el fichero histórico, primero hay que borrar si existe, y luego se utiliza alguna de las siguientes técnicas:

  • Se cambia el valor de la variable a . Para que este cambio tenga efecto cada vez que se entra, se pone la asignación de esta variable de entorno en uno de los ficheros de arranque de la shell del usuario.

  • Se crea como enlace simbólico a :

    shell> ln -s /dev/null $HOME/.mysql_history
    

    Sólo es necesario hacer esto una vez.

8.3.1. Comandos mysql

mysql envía comandos SQL al servidor para que sean ejecutados. También hay un conjunto de comandos que mysql interpreta por sí mismo. Para obtener una lista de estos comandos, se escribe o en el prompt :

mysql> help

MySQL commands:
?         (\h)    Synonym for `help'.
clear     (\c)    Clear command.
connect   (\r)    Reconnect to the server.
                  Optional arguments are db and host.
delimiter (\d)    Set query delimiter.
edit      (\e)    Edit command with $EDITOR.
ego       (\G)    Send command to mysql server,
                  display result vertically.
exit      (\q)    Exit mysql. Same as quit.
go        (\g)    Send command to mysql server.
help      (\h)    Display this help.
nopager   (\n)    Disable pager, print to stdout.
notee     (\t)    Don't write into outfile.
pager     (\P)    Set PAGER [to_pager].
                  Print the query results via PAGER.
print     (\p)    Print current command.
prompt    (\R)    Change your mysql prompt.
quit      (\q)    Quit mysql.
rehash    (\#)    Rebuild completion hash.
source    (\.)    Execute an SQL script file.
                  Takes a file name as an argument.
status    (\s)    Get status information from the server.
system    (\!)    Execute a system shell command.
tee       (\T)    Set outfile [to_outfile].
                  Append everything into given outfile.
use       (\u)    Use another database.
                  Takes database name as argument.
warnings  (\W)    Show warnings after every statement.
nowarning (\w)    Don't show warnings after every statement.

Cada comando tiene forma corta y larga. La forma larga no es sensible a mayúsculas; la forma corta lo es. La forma larga puede seguirse con un terminador de punto y coma, pero la forma corta no debería.

En el comando , debe evitar el uso del carácter antibarra ('') ya que es un carácter de escape para MySQL.

Los comandos , , , y sólo funcionan en Unix.

El comando proporciona alguna información sobre la conexión y el servidor que está usando. Si está ejecutando el modo , también muestra los valores para las variables mysql que afectan a sus consultas.

Para loguear las consultas y su salida, use el comando . Todos los datos mostrados por pantalla se guardan en un fichero dado. Esto puede ser muy útil para depurar. Puede activar esta característica en la línea de comandos con la opción , o interactivamente con el comando . El fichero puede desactivarse interactivamente con el comando . Ejecutando de nuevo, vuelve a activar el logueo. Sin parámetros, se utiliza el fichero anterior. Tenga en cuenta que vuelca los resultados de las consultas al fichero después de cada comando, justo antes que mysql muestre su siguiente prompt.

Navegar o buscar resultados de consultas en modo interactivo usando programas Unix, tales como less, more, o cualquier otro programa similar es posible con la opción . Si no especifica ningún valor para la opción, mysql comprueba el valor de la variable de entorno y configura el paginador al valor de la misma. La paginación de la salida de datos (output) puede activarse interactivamente con el comando y desactivar con . El comando tiene un argumento opcional; si se especifica, el programa de paginación se configura con el mismo. Sin argumento, el paginador se configura con el paginador que se especificó en la línea de comandos, o si no se especifica paginador.

La paginación de la salida sólo funciona en Unix ya que usa la función , que no existe en Windows. Para Windows, la opción puede usarse para guardar la salida de las consultas, aunque no es tan conveniente como para navegar por la salida en algunas situaciones.

Algunos consejos sobre el comando :

  • Puede usarlo para escribir en un fichero y que los resultados sólo vayan al fichero:

    mysql> pager cat > /tmp/log.txt
    

    Puede pasar cualquier opción al programa que quiera usar como paginador:

    mysql> pager less -n -i -S
    
  • En el ejemplo precedente, tenga en cuenta la opción . Puede encontrarla muy útil para consultar una amplia variedad de resultados. En ocasiones un conjunto de resultados muy amplio es difícil de leer en pantalla. La opción con less puede hacer el resultado mucho más legible ya que puede desplazarlo horizontalmente usando las flechas de izquierda y derecha. También puede usar interactivamente con less para activar y desactivar el modo de navegación horizontal. Para más información, lea la página del manual (man) de less:

    shell> man less
    
  • Puede especificar comandos muy complejos para el paginador, para tratar la salida de las consultas:

    mysql> pager cat | tee /dr1/tmp/res.txt \
              | tee /dr2/tmp/res2.txt | less -n -i -S
    

    En este ejemplo, el comando enviaría los resultados de las consultas a dos ficheros en dos directorios distintos en dos sistemas de ficheros montados en y ,y mostraría los resultados en pantalla vía less.

Puede combinar las funciones y . Puede tener un fichero tee activado y tener el configurado con less, siendo capaz de navegar en los resultados con el programa less y al mismo tiempo tener todo en un fichero. La diferencia entre tee en Unix usado con el comando y el comando que implementa mysql es que el segundo funciona incluso si no tiene el tee de Unix disponible. El comando implementado también loguea todo lo que se muestra por pantalla, mientras que tee en Unix usado con no loguea tanto. Adicionalmente, el logueo en fichero de puede activarse y desactivarse interactivamente desde mysql. Esto es útil cuando quiere loguear algunas consultas en un fichero, pero no otras.

En MySQL 5.0, el prompt por defecto puede reconfigurarse. La cadena de caracteres para definir el prompt puede contener las siguientes secuencias especiales:

Opción Descripción
Versión del servidor
Base de datos actual
Equipo del servidor
Puerto TCP/IP usado o fichero socket
Nombre de usuario
Nombre de cuenta @ completo
Carácter de barra invertida '' literal
Carácter de nueva línea
Carácter de tabulador
Espacio (hay un espacio a continuación de la barra invertida)
Espacio
Hora actual, en formato militar de 24 horas (0-23)
Hora actual, en formato estándar de 12 horas (1-12)
Minutos de la hora actual
Año actual, dos dígitos
Año actual, cuatro dígitos
Fecha actual completa
Segundos de la hora actual
Día actual de la semana en inglés, en formato de tres letras (Mon, Tue, ...)
am/pm
Mes actual en formato numérico
Mes actual en inglés, en formato de tres letras (Jan, Feb, ...)
Contador que incrementa con cada comando ejectuado
Punto y coma
Comilla
Comilla doble

'' seguido por cualquier otra letra es esa letra.

Si especifica el comando sin argumentos, mysql resetea el prompt al valor por defecto de .

Puede cambiar el prompt de diversas formas:

  • Use una variable de entorno

    Puede cambiar la variable de entorno con una cadena de caracteres. Por ejemplo:

    shell> export MYSQL_PS1="(\u@\h) [\d]> "
    
  • Con un fichero de opciones

    Puede cambiar la opción en el grupo de cualquier fichero de opciones MySQL, tal como o el fichero en el directorio raíz. Por ejemplo:

    [mysql]
    prompt=(\\u@\\h) [\\d]>\\_
    

    En este ejemplo, tenga en cuenta que las barras invertidas son dos. Si asigna el valor del prompt usando la opción en un fichero de opciones, se recomienda poner dos barras invertidas al usar las opciones especiales de prompt. Hay algúna redundancia en el conjunto de opciones de prompt disponible y el conjunto de secuencias de caracteres de escape especiales que se reconoce en el fichero de opciones. (Estas secuencias están listadas en Sección 4.3.2, “Usar ficheros de opciones”). La redundancia puede causar problemas si usa sólo una barra invertidas. Por ejemplo, se interpreta como un espacio en lugar de los segundos actuales. El siguiente ejemplo muestra cómo definir un prompt dentro de un fichero de opciones que incluya la hora actual en formato :

    [mysql]
    prompt="\\r:\\m:\\s> "
    
  • Use una opción por línea de comandos

    Puede cambiar la opción en la línea de comandos de mysql. Por ejemplo:

    shell> mysql --prompt="(\u@\h) [\d]> "
    (user@host) [database]>
    
  • Interactivamente

    Puede cambiar el prompt interactivamente usando el comando (o ) . Por ejemplo:

    mysql> prompt (\u@\h) [\d]>\_
    PROMPT set to '(\u@\h) [\d]>\_'
    (@) []>
    (@) []> prompt
    Returning to default PROMPT of mysql>
    mysql>
    

8.3.2. Ejecutar sentencias SQL desde un fichero de texto

El cliente mysql se usa normalmente de forma interactiva, como se muestra a continuación:

shell> mysql 

Sin embargo, es posible poner comandos SQL en un fichero y decirle a mysql que lea las entradas de ese fichero. Para ello, cree un fichero que contenga el comando que quiera ejecutar. Luego invoque mysql como se muestra aquí:

shell> mysql  < 

Puede comenzar su fichero de texto con un comando . En este caso, no es necesario especificar el nombre de la base de datos en la línea de comandos:

shell> mysql < text_file

Si está ejecutando mysql, puede ejecutar un script SQL en un fichero usando el comando o :

mysql> source 
mysql> \. 

Si desea que el script muestre información de progreso al usuario, puede insertar algunas líneas como

SELECT '<información>' AS ' ';

que muestra <información>.

Para más información acerca del modo batch, consulte Sección 3.5, “Usar mysql en modo batch”.

8.3.3. Sugerencias acerca de mysql

Esta sección describe algunas técnicas que pueden ayudarle a usar mysql de forma más efectiva.

8.3.3.1. Mostrar resultados de consultas verticalmente

Algunos resultados de consultas son mucho más legibles cuando se muestran verticalmente, en lugar del formato habitual de tabla horizontal. Las consultas pueden mostrarse verticalmente terminando las mismas con \G en lugar de un punto y coma. Por ejemplo, valores de texto largos que incluyan nuevas líneas, a menundo son más fáciles de leer en formato vertical:

mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
  msg_nro: 3068
     date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
    reply: [email protected]
  mail_to: "Thimble Smith" <[email protected]>
      sbj: UTF-8
      txt: >>>>> "Thimble" == Thimble Smith writes:

Thimble> Hi.  I think this is a good idea.  Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.

Yes, please do that.

Regards,
Monty
     file: inbox-jani-1
     hash: 190402944
1 row in set (0.09 sec)

8.3.3.2. Usar la opción

Una opción de arranque útil para principiantes es (o , que tiene el mismo efecto). Es útil para casos donde pueda haber ejecutado un comando pero olvidó la cláusula . Normalmente, ese comando borra todos los registros de la tabla. Con , puede borrar registros sólo especificando los valores clave que los identifican. Esto ayuda a prevenir accidentes.

Cuando usa la opción , mysql realiza los siguientes comandos al conectarse al servidor MySQL:

SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;

Consulte Sección 13.5.3, “Sintaxis de .

El comando tiene el siguiente efecto:

  • No está permitido ejecutar un comando o a no ser que especifique una condición clave en la cláusula o proporcione una cláusula (o ambas). Por ejemplo:

    UPDATE  SET =# WHERE =#;
    
    UPDATE  SET =# LIMIT 1;
    
  • Todos los resultados grandes de un se limitan automáticamente a 1.000 registros a no ser que el comando incluya una cláusula .

  • Se aborta comandos de múltiples tablas que probablemente necesiten examinar más de 1,000,000 de registros.

Para especificar límites distintos a los anteriores, puede cambiar los valores por defecto con las opciones y :

shell> mysql --safe-updates --select_limit=500 --max_join_size=10000

8.3.3.3. Deshabilitar las reconexiones automáticas de mysql

Si el cliente mysql pierde la conexión al enviar una consulta, inmediatamente y de forma automática trata de reconectar una vez con el servidor y envía la consulta de nuevo. Sin embargo, incluso si mysql tiene éxito al reconectar, la primera conexión ha terminado y todos los objetos de sesión previos y opciones se pierden: tablas temporales, modo "autocommit", y variables de usuario y de sesión. Este comportamiento puede ser problemático, como en el siguiente ejemplo, donde el servidor se apaga y reinicia sin conocimiento del usuario:

mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    1
Current database: test

Query OK, 1 row affected (1.30 sec)

mysql> SELECT * FROM t;
+------+
| a    |
+------+
| NULL |
+------+
1 row in set (0.05 sec)

La variable de usuario se ha perdido con la conexión, y tras la reconexión no está definida. Si es importante que mysql termine con un error cuando se pierda la conexión, puede arrancar el cliente mysql con la opción .