Desde un script de shell, ¿cómo puedo verificar si existe una base de datos MySQL?

23

mysqladmin -uroot create foodevuelve un estado de salida de 1 si fooexiste, y 0 en caso contrario, pero por supuesto también creará la base de datos si aún no existe. ¿Hay alguna manera fácil de simplemente verificar si existe una base de datos?

ithinkihaveacat
fuente

Respuestas:

43

Me doy cuenta de que esto fue respondido hace mucho tiempo, pero me parece mucho más limpio hacer esto:

mysql -u root -e 'use mydbname'

Si la base de datos existe, esto no producirá salida y saldrá con returncode == 0.

Si la base de datos no existe, esto generará un mensaje de error en stderr y saldrá con returncode == 1. Entonces haría algo como esto:

if ! mysql -u root -e 'use mydbname'; then
  ...do stuff to create database...
fi

Esto funciona bien con los scripts de shell, no requiere ningún procesamiento de la salida y no depende de tener acceso al sistema de archivos local.

larsks
fuente
1
Para cualquiera que quiera suprimir el mensaje de error, intente esto (por supuesto, considere sacar su contraseña por seguridad): ¡si! mysql -u <usuario> -p <pw> -e 'use <nombre db>' 2> / dev / null; entonces mysql -u <usuario> -p <pw> -e 'CREAR BASE DE DATOS <nombre db>;'; fi
Peter Mark
10

mysql -e "SHOW DATABASES LIKE 'foo'" debería ayudarte

http://dev.mysql.com/doc/refman/5.1/en/show-databases.html

Dom
fuente
55
Gracias. Con unas pocas más opciones de línea de comandos que se integra mejor en los scripts de shell: mysql --batch --skip-column-names -e "SHOW DATABASES LIKE 'foo'" | grep foo.
ithinkihaveacat
7

Las bases de datos en MySQL son carpetas en el sistema de archivos. Eso hace que sea muy fácil encontrar si existe una base de datos:

test -d "/var/lib/mysql/databasename"

En este caso, /var/libes el datadir de MySQL. Lo bueno de este fragmento es que no necesitará un demonio MySQL en ejecución, ni tampoco necesita credenciales. Por supuesto, el usuario que ejecuta el comando debe poder descender a ese directorio.

Lekensteyn
fuente
6

De http://www.jbmurphy.com/2011/02/08/quick-check-if-a-mysql-database-exists/ esto es más parecido a lo que quería:

DBNAME="dblookingfor"
DBEXISTS=$(mysql --batch --skip-column-names -e "SHOW DATABASES LIKE '"$DBNAME"';" | grep "$DBNAME" > /dev/null; echo "$?")
if [ $DBEXISTS -eq 0 ];then
    echo "A database with the name $DBNAME already exists."
else
    echo " database $DBNAME does not exist."
fi
Rob Barreca
fuente
La forma perfecta de comprobarlo.
Mani
2

Un poco hacky, pero esto imprimirá 1 si foo no existe, 0 de lo contrario:

mysqlshow -u root foo 2>&1 >/dev/null | awk ' { print /Unknown database/ }'
Donald
fuente
2

Creo que puede verificar si su base de datos necesaria funciona de manera simple en cualquier shell

mysql -uUSERNAME -pPASSWORD DATABASE -e exit

y luego verifique el $?código de salida

Este comando prueba sus credenciales específicas (NOMBRE DE USUARIO y CONTRASEÑA) para conectarse a la BASE DE DATOS seleccionada e exitinmediatamente. Entonces, si la conexión está bien, el código de salida será 0 y, de lo contrario, no será cero.

Por supuesto, puede redirigir cualquier salida /dev/nullsi es necesario

PD. Este método es muy útil para verificar la salud de los almacenamientos efímeros que son tan rápidos y populares en nuestros días. Si la base de datos no se puede conectar, debe comenzar a restaurar lo antes posible.

Wile E.
fuente