bash script-vérifier si la base de données mysql existe effectuer l'action basée sur le résultat

est-il possible à partir d'un script bash de vérifier si une base de données mysql existe. Selon le résultat, puis effectuer une autre action ou résilier le script?

21
demandé sur Cœur 2011-09-09 20:27:51

17 réponses

exemple de script (merci à Bill Karwin pour le --user et --password commentaire!):

#!/bin/bash
## --user=XXXXXX --password=XXXXXX *may* not be necessary if run as root or you have unsecured DBs but
##   using them makes this script a lot more portable.  Thanks @billkarwin
RESULT=`mysqlshow --user=XXXXXX --password=XXXXXX myDatabase| grep -v Wildcard | grep -o myDatabase`
if [ "$RESULT" == "myDatabase" ]; then
    echo YES
fi

voici à quoi ressemblent les commandes lorsqu'elles sont exécutées à une invite:

[root@host ~]# mysqlshow myDatabase
Wildcard: myDatabase
+------------------+
|    Databases     |
+------------------+
| myDatabase       |
+------------------+

Si pas de DB existe, la sortie ressemble à ceci:

[root@host ~]# mysqlshow myDatabase
Wildcard: myDatabase
+-----------+
| Databases |
+-----------+
+-----------+

ensuite, analysez la sortie et faites ce dont vous avez besoin basé sur si elle existe ou non!

25
répondu chown 2011-09-09 17:13:40

je donne +1 à réponse par @chown, Mais voici une autre alternative: si le script bash tourne localement avec L'instance MySQL, et que vous connaissez le chemin vers le datadir, vous pouvez tester:

if [ -d /var/lib/mysql/databasename ] ; then 
    # Do Stuff ...
fi

cela suppose aussi que votre utilisateur shell qui exécute le script a des privilèges au niveau du système de fichiers pour lire le contenu du datadir MySQL. C'est souvent le cas, mais il n'est pas certain.

34
répondu Bill Karwin 2018-08-16 14:11:43
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."

selon l'état de sortie de la commande mysqlshow, elle exécutera l'écho suivant.

19
répondu mattes 2013-07-04 12:30:14

Je n'ai pas pu obtenir la réponse acceptée travailler pour moi (le grep dans les citations ne fonctionne pas), voici donc ma version:

RESULT=`mysql -u $USER -p$PASSWORD --skip-column-names -e "SHOW DATABASES LIKE 'myDatabase'"`
if [ "$RESULT" == "myDatabase" ]; then
    echo "Database exist"
else
    echo "Database does not exist"
fi

j'ai utilisé l'option --skip-column-names pour supprimer les noms de colonnes du résultat.

5
répondu Matthieu Napoli 2011-10-13 08:59:16

Voici une version alternative:

 RESULT=`mysql -u$USER -p$PASSWORD -e "SHOW DATABASES" | grep $DATABASE`
 if [ "$RESULT" == "$DATABASE" ]; then
    echo "Database exist"
 else
    echo "Database does not exist"
 fi

S'il y a un DB nommé abcd et nous utilisons -Fo après grep alors pour le résultat de la recherche de DB a/ab/abc le script affichera le résultat Database exist.

5
répondu gurel_kaynak 2017-11-04 19:12:32

Oui

for db in $(mysql -u -p -N <<<"show databases like '%something%'")
do
  case $db in 
    "something")
      // do something
    ;;
    "something else")
      // do something else
    ;;
  esac
done
4
répondu ajreal 2011-09-09 16:32:58

une autre solution sans grep:

FOUND_DATABASES=`MYSQL_PWD="${DB_PASSWORD}" mysql \
 -u "${DB_PASSWORD}" \
 --skip-column-names \
 --batch \
 -e "SHOW DATABASES LIKE '${DB_NAME}'" | wc -l`

FOUND_DATABASES:

  • 0 - il n'existe pas de base de données
  • 1 - la base de données a été trouvé

Notes:

  • MYSQL_PWD pour désactiver l'avertissement:

    mysql: [avertissement] L'utilisation D'un mot de passe sur l'interface en ligne de commande peut être insécurité.

  • --skip-column-names pour masquer des colonnes

  • --batch pour désactiver les frontières de la forme +-----------+

3
répondu arz.freezy 2017-05-20 07:00:44

-e option mysql la commande. Il vous permettra d'exécuter n'importe quelle requête (en supposant les bonnes références). Je ne sais pas d'une requête de retour juste le nom de la base de données de sorte que vous auriez probablement besoin d'analyser les résultats de show databases ou show tables from dbname

2
répondu Cfreak 2011-09-09 16:33:15

il est assez facile de dire de façon fiable si la base de données existe avec mysqlshow. Le truc est d'être capable de faire la différence de manière fiable entre une base de données existant, ou d'un autre problème. La version de mysqlshow j'ai termine avec un " 1 " dans les deux cas, on ne peut pas dire.

Voici ce que j'ai trouvé pour le manipuler. Ajustez votre commande mysqlshow en conséquence, ou mettez vos identifiants dans un chmod 600'd ~/.mon.cnf de fichier.

#!/bin/bash -u

# Takes 1 argument. Aborts the script if there's a false negative.
function mysql_db_exists () {
  local DBNAME=""
  # Underscores are treated as wildcards by mysqlshow.
  # Replace them with '\_'. One of the underscores is consumed by the shell to keep the one mysqlshow needs in tact.
  ESCAPED_DB_NAME="${DBNAME//_/\\_}"
  RESULT="$(mysqlshow "$ESCAPED_DB_NAME" 2>&1)"; EXITCODE=$?
  if [ "$EXITCODE" -eq 0 ]; then
    # This is never a false positive.
    true
  else
    if echo "$RESULT" | grep -iq "Unknown database"; then
      # True negative.
      false
    else
      # False negative: Spit out the error and abort the script.
      >&2 echo "ERR (mysql_db_exists): $RESULT"
      exit 1
    fi
  fi
}

if mysql_db_exists ""; then
  echo "It definitely exists."
else
  echo "The only time you see this is when it positively does not."
fi
2
répondu Dale Anderson 2016-06-15 18:00:11

j'ai aussi utilisé une version légèrement différente de chown.

result=$(mysqlshow --user=root --password=12345 dbname | grep -v Wildcard | grep -ow dbname)

exécute la commande donnée et assigne la valeur retournée à result. Et le w correspondance des options dbname exactement.

1
répondu Pubudu 2015-12-21 11:14:45

si ça aide, J'ai fait ça pour MariaDB sur Debian Stretch:

DB_CHECK=$(mysqlshow "${DB_NAME}" | grep "Unknown database") 1> /dev/null
if [ ! -z "${DB_CHECK}" ]; then
    echo "Database found."
else
    echo "Database not found."
fi

Brève Explication: le résultat de mysqlshow pour le nom de la base de données dans la variable $DB_NAME est cochée pour "base de données inconnue". Si cette chaîne est trouvée, elle est placée dans la variable $DB_CHECK. Puis, enfin, le -z comparaison vérifie si le $DB_CHECK la variable est vide.

Si $DB_CHECK est vide alors "Unknown database" n'apparaît pas dans le mysqlshow réponse. Probablement pas fiable à 100%, comme si la connexion a échoué ou que ce soit. (Je n'ai pas testé.)

1
répondu Adambean 2018-03-29 12:26:42
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
    echo "DB found"
fi
0
répondu Fedir RYKHTIK 2015-01-15 10:35:31

mysqlshow n'affichera pas les caractères de soulignement '_' dans le nom de la base de données.

mysqlshow $DOMAIN %

https://dev.mysql.com/doc/refman/5.1/en/mysqlshow.html

0
répondu busy 2015-07-28 11:32:29
mysql_user=<you_db_username>
mysql_pass=<you_db_passwrod>
target_db=<your_db_name>
if [ "`mysql -u${mysql_user} -p${mysql_pass} -e 'show databases;' | grep ${target_db}`" == "${target_db}" ]; then
  echo "Database exist"
else
  echo "Database does not exist"
fi

ceci exécute une requête MySQL pour obtenir tous les noms de bases de données, puis greps pour vérifier que la base de données requise existe.

0
répondu Michael Litvin 2016-01-30 09:58:31

commande Suivante devrait faire l'affaire pour les deux cas, les

mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
0
répondu cavernicola 2016-05-10 17:45:50

mysqlshow le chemin nécessite l'analyse de la sortie (au moins pour la version de mysql que j'ai) parce qu'il retourne toujours le succès. Dale fait un très bon point sur la différenciation entre les échecs.

Toutefois, si vous savez que tout ce qui est en cours d'exécution et que vous avez des informations d'identification correctes, etc, et que vous voulez dire si la base de données n'existe pas, vous pouvez le faire en une seule ligne avec une commande sql vierge:

> mysql -uroot -ppassword good_db -e ''
> echo $?
0
> mysql -uroot -ppassword bad_db -e ''
ERROR 1049 (42000): Unknown database 'busker_core_locala'
> echo $?
1
0
répondu gtd 2016-07-27 19:00:32

FWIW, the auth_socket plugin rend cela beaucoup plus facile. La question est peut-être très ancienne, mais il y a encore des gens comme moi qui viennent ici pour s'inspirer.

si votre script est root, vous pouvez faire ceci:

DBNAME="what_you_are_looking_for"
DBEXISTS="$(mysql -u root -e "show databases like '$DBNAME'" --batch --skip-column-names)"

Si la base de données existe, alors $DBNAME = $DBEXISTS.

Si la base de données n'existe pas, alors $DBEXISTS = "".

les deux devraient avoir un statut de sortie de 0, de sorte que vous pouvez toujours utiliser des statuts non-zéro pour déclarer des erreurs, plutôt que de laisser un inexistante base de données apparaissent comme une erreur.

0
répondu Jared Brandt 2018-08-05 17:28:02