Aunque generalmente nos comuniquemos con el servidor de base de datos SQL mediante PHP u otro lenguaje para generar una salida HTML, hay veces que es muy útil hacerlo usando un script de bash. Por ejemplo cuando queremos automatizar en nuestro servidor la creación de bases de datos, o ejecutar una búsqueda con reemplazo (search and replace) de un registro completo o de un cadena concreta.
Para ejecutar consultas al servidor SQL en modo no interactivo, cosa que necesitamos para hacerlo desde un script, debemos acompañar la orden mysql
con el modificador -e
, al que daremos como valor la consulta en cuestión.
Por ejemplo, el siguiente script crea una base de datos y un usuario que tenga permisos sobre ella. Para pasar al script los tres parámetros que necesitamos, el nombre de la base de datos, y el nombre y la contraseña de usuario, usamos el comando read
:
#!/bin/bash # Este script crea una base de datos, y un usuario con permisos para operar en ella. # Defaults DB_ROOT="" DB_ROOT_PASS="" DB_NAME="" DB_USER="" DB_PASS="" # Recogemos el input del usuario read -e -p " + Usuario root del servidor mysql: " DB_ROOT read -e -s -p " + Contraseña root para el servidor mysql: " DB_ROOT_PASS; echo read -e -p " + Nombre de la base de datos (sin espacios ni caracteres especiales): " DB_NAME read -e -p " + Nombre del nuevo usuario mysql (o uno ya existente): " DB_USER read -e -s -p " + Contraseña del nuevo usuario: " DB_PASS; echo echo # Creamos el nuevo usuario sql mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} -e "CREATE USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}'; GRANT USAGE ON * . * TO '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}';" # Comprobamos errores if [ $? == 0 ]; then echo " El usuario ${DB_USER} se ha creado con éxito." # Creamos la nueva base de datos mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON ${DB_NAME} . * TO '${DB_USER}'@'localhost';" # Comprobamos errores if [ $? == 0 ]; then echo " La base de datos ${DB_NAME} se ha creado con éxito." echo " El usuario ${DB_USER} tiene permisos sobre la base de datos ${DB_NAME}." else mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} -e "DROP USER '${DB_USER}'@'localhost';" exit fi else echo " Si mysql devuelve ERROR 1396 probablemente signifique que el usuario que intentas crear ya existe." echo " Prueba otro nombre de usuario." exit fi
Alternativamente para usar mysql dentro de un script, también podemos alimentar el comando mysql con órdenes SQL alojadas en un archivo externo. Algo Así:
mysql -u ${DB_ROOT} -p${DB_ROOT_PASS} < query.sql
Esta opción puede ser útil si se quiere cambiar la consulta SQL sin tener que tocar el script de bash.