bash script-vérifier si la base de données mysql existe effectuer l'action basée sur le résultat
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!
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.
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."
selon l'état de sortie de la commande mysqlshow, elle exécutera l'écho suivant.
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.
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
.
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
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+-----------+
-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
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
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.
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é.)
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
echo "DB found"
fi
mysqlshow n'affichera pas les caractères de soulignement '_' dans le nom de la base de données.
mysqlshow $DOMAIN %
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.
commande Suivante devrait faire l'affaire pour les deux cas, les
mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
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
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.