À partir d'un script shell, comment puis-je vérifier s'il existe une base de données MySQL?

23

mysqladmin -uroot create foorenvoie un état de sortie de 1 s'il fooexiste et de 0 sinon, mais bien sûr, il créera également la base de données si elle n'existe pas déjà. Existe-t-il un moyen simple de vérifier simplement si une base de données existe?

ithinkihaveacat
la source

Réponses:

43

Je me rends compte que cela a été répondu il y a longtemps, mais il me semble beaucoup plus propre de le faire:

mysql -u root -e 'use mydbname'

Si la base de données existe, cela ne produira aucune sortie et quittera avec returncode == 0.

Si la base de données n'existe pas , cela produira un message d'erreur sur stderr et quittera avec returncode == 1. Vous feriez donc quelque chose comme ceci:

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

Cela fonctionne bien avec les scripts shell, ne nécessite aucun traitement de la sortie et ne dépend pas de l'accès au système de fichiers local.

larsks
la source
1
Pour quiconque souhaite supprimer le message d'erreur, essayez ceci (bien sûr, pensez à retirer votre mot de passe pour des raisons de sécurité): si! mysql -u <utilisateur> -p <pw> -e 'utilise <nom de la base de données>' 2> / dev / null; alors mysql -u <utilisateur> -p <pw> -e 'CREATE DATABASE <nom de la base de données>;'; fi
Peter Mark
10

mysql -e "SHOW DATABASES LIKE 'foo'" devrait vous aider.

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

Dom
la source
5
Merci. Avec quelques options en ligne de commande , il intègre mieux dans les scripts shell: mysql --batch --skip-column-names -e "SHOW DATABASES LIKE 'foo'" | grep foo.
ithinkihaveacat
7

Les bases de données dans MySQL sont des dossiers dans le système de fichiers. Cela facilite grandement la recherche d'une base de données:

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

Dans ce cas, /var/libest le datadir de MySQL. Ce qu'il y a de bien avec cet extrait, c'est qu'il n'aura pas besoin d'un démon MySQL en cours d'exécution, pas plus qu'il n'aura besoin d'informations d'identification. Bien sûr, l'utilisateur exécutant la commande doit être autorisé à descendre dans ce répertoire.

Lekensteyn
la source
6

De http://www.jbmurphy.com/2011/02/08/quick-check-if-a-mysql-database-exists/ c'est plus proche de ce que je voulais:

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
la source
moyen parfait de le vérifier.
Mani
2

Un peu hacky, mais cela affichera 1 si foo n'existe pas, 0 sinon:

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

Je pense que vous pouvez vérifier si votre base de données nécessaire fonctionne de manière simple dans n'importe quel shell

mysql -uUSERNAME -pPASSWORD DATABASE -e exit

puis vérifiez le $?code de sortie

Cette commande essaie vos informations d'identification spécifiques (NOM D'UTILISATEUR et MOT DE PASSE) pour se connecter à la BASE DE DONNÉES sélectionnée et exitimmédiatement. Donc, si la connexion est correcte, le code de sortie sera 0 et différent de zéro sinon.

Bien sûr, vous pouvez rediriger n'importe quelle sortie /dev/nullsi nécessaire

PS. Cette méthode est très utile pour vérifier la santé des stockages éphémères qui sont si rapides et populaires de nos jours. Si la base de données ne peut pas être connectée, vous devez démarrer la restauration dès que possible.

Wile E.
la source