it-swarm.it

script bash - controlla se esiste un database mysql che esegue un'azione basata sul risultato

È possibile all'interno di uno script bash verificare se esiste un database mysql. A seconda del risultato, eseguire un'altra azione o terminare lo script?

22
David

Script di esempio (Grazie a Bill Karwin per il commento --user e --password!):

#!/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

Questi sono i comandi che appaiono quando si esegue un prompt:

[[email protected] ~]# mysqlshow myDatabase
Wildcard: myDatabase
+------------------+
|    Databases     |
+------------------+
| myDatabase       |
+------------------+

Se non esiste alcun DB, l'output sarà simile a questo:

[[email protected] ~]# mysqlshow myDatabase
Wildcard: myDatabase
+-----------+
| Databases |
+-----------+
+-----------+

Quindi analizza l'output e fai ciò di cui hai bisogno se esiste o meno!

27
chown

Dando +1 a answer da @chown , ma ecco un'altra alternativa: se lo script di bash è in esecuzione localmente con l'istanza MySQL e si conosce il percorso del datadir, è possibile testare:

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

Ciò presuppone anche che l'utente Shell che esegue lo script abbia i privilegi a livello di file system per leggere i contenuti del datadir MySQL. Questo è spesso il caso, ma non è sicuro.

34
Bill Karwin
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."

A seconda dello stato di uscita del comando mysqlshow, eseguirà il seguente eco.

19
mattes

Non sono riuscito a far funzionare la risposta accettata (il grep tra virgolette non funzionava), quindi ecco la mia versione:

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

Ho usato l'opzione --skip-column-names per rimuovere i nomi delle colonne dal risultato.

5
Matthieu Napoli

Ecco una versione alternativa: 

 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

Se esiste un DB chiamato abcd e usiamo -Fo dopo grep allora per il risultato della ricerca di DB a/ab/abc lo script mostrerà il risultato Database exist.

5
gurel_kaynak

SÌ

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
ajreal

Un'altra soluzione senza 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 - non esiste un tale database
  • 1 - il database è stato trovato

Gli appunti:

  • MYSQL_PWD per disabilitare l'avviso:

    mysql: [Avvertimento] L'uso di una password sull'interfaccia della riga di comando può essere non sicuro.

  • --skip-column-names per nascondere le colonne

  • --batch per disabilitare i bordi come +-----------+

3
arz.freezy

È abbastanza facile dire in modo affidabile se il database esiste con mysqlshow. Il trucco è essere in grado di distinguere in modo affidabile la differenza tra un database non esistente o un altro errore. La versione di mysqlshow I esce con un '1' in entrambi i casi, quindi non può dirlo.

Ecco cosa mi è venuto in mente per gestirlo. Regola di conseguenza il comando mysqlshow o inserisci le tue credenziali in un file chmod 600 'd ~/.my.cnf.

Funziona su Ubuntu 12 + 14. Non l'ho ancora testato in altri ambienti:

#!/bin/bash -u

# Takes 1 argument. Aborts the script if there's a false negative.
function mysql_db_exists () {
  local DBNAME="$1"
  # 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 "$1"; then
  echo "It definitely exists."
else
  echo "The only time you see this is when it positively does not."
fi
2
Dale Anderson

utilizzare l'opzione -e per il comando mysql. Ti permetterà di eseguire qualsiasi query (assumendo le giuste credenziali). Non conosco una query che restituisca solo il nome del database, quindi probabilmente dovresti analizzare i risultati di show databases o show tables from dbname

2
Cfreak

Ho anche usato una versione leggermente diversa da Chown. 

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

Quanto sopra esegue il comando dato e assegna il valore restituito a result. E l'opzione w corrisponde esattamente a dbname

1
Pubudu

Se aiuta, l'ho fatto per MariaDB su 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

Breve spiegazione: il risultato di mysqlshow per il nome del database nella variabile $DB_NAME è controllato per "Database sconosciuto". Se questa stringa viene trovata, viene inserita nella variabile $DB_CHECK. Quindi, il confronto -z verifica se la variabile $DB_CHECK è vuota.

Se $DB_CHECK è vuoto, allora "Database sconosciuto" non appare nella risposta mysqlshow. Probabilmente non affidabile al 100%, come se la connessione fallisse o quant'altro. (Non l'ho provato.)

1
Adambean

FWIW, il plugin auth_socket rende tutto molto più semplice. La domanda potrebbe essere super vecchia, ma ci sono ancora persone come me che vengono qui per l'ispirazione.

Se lo script è in esecuzione come root, puoi farlo:

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

Se il database esiste, allora $DBNAME = $DBEXISTS.

Se il database non esiste, allora $DBEXISTS = "".

Entrambi devono avere uno stato di uscita pari a 0, quindi è possibile utilizzare ancora stati diversi da zero per segnalare errori, piuttosto che visualizzare un database inesistente come errore.

0
Jared Brandt

Il seguente comando dovrebbe fare il trucco per entrambi i casi,

mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
0
cavernicola
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
    echo "DB found"
fi
0
Fedir RYKHTIK
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

Questo esegue una query MySQL per ottenere tutti i nomi dei DB, quindi greps per verificare che il database richiesto esista.

0
Michael Litvin

mysqlshow non mostrerà i caratteri di sottolineatura '_' nel nome del database.

mysqlshow $DOMAIN %

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

0
busy

Il percorso mysqlshow richiede l'analisi dell'output (almeno per la versione di mysql che ho) perché restituisce sempre successo. Dale è un ottimo punto per distinguere tra i fallimenti.

Comunque , se si sa che tutto è in esecuzione e si hanno credenziali corrette, ecc. E si vuole dire a solo se il DB esiste non lo si può fare in una riga con un comando sql vuoto:

> 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
gtd