2011-09-09 14 views

risposta

20

Esempio di script (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 ciò che i comandi assomigliano quando eseguito al prompt:

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

Se non esiste alcun DB, l'uscita sarà simile a questa:

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

Quindi, analizzare l'output e fare ciò di cui si ha bisogno se esiste o meno!

+0

+1 ma FWIW è necessario connettersi come utente con privilegi per quel database, oppure il database mancare dai risultati. –

+1

@billk Testato e tu sei corretto, immagino che per far funzionare tutto questo sia necessario eseguire lo script con 'sudo'. – chown

+0

No, non è necessario sudo, è sufficiente eseguire le opzioni 'mysqlshow --user = XXX --password = YYY' per specificare le credenziali MySQL per un utente con privilegi sufficienti per vedere il database in questione. –

4

SI

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 
2

usare l'opzione -e al comando mysql. Vi permetterà di eseguire qualsiasi query (assumendo le credenziali giuste). Non so di una query che restituiscono solo il nome del database in modo si sarebbe probabilmente bisogno di analizzare i risultati di show databases o show tables from dbname

29

mi danno uno di rispondere da @chown, ma qui è un'altra alternativa: Se lo script bash viene eseguito localmente con l'istanza di MySQL, e si conosce il percorso del datadir, è possibile verificare:

if [ -d /var/lib/mysql/databasename ] ; then ... 

Questo presuppone anche che l'utente della 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.

+1

Questo è in realtà un modo più pulito perché le cartelle sono registrate in information_schema come un database. Inoltre, l'autenticazione dell'utente non è richiesta (in altre parole, nessuna registrazione). +1 !!! – RolandoMySQLDBA

+2

Questa è una soluzione più elegante e affidabile. MI PIACE: D –

+0

dipende da 'file_per_table' se ricordo male. e il percorso dipende dal sistema operativo. – scones

5

non ho potuto ottenere il lavoro risposta accettata per me (il grep nelle citazioni non ha funzionato), 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

16
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists." 

A seconda dello stato di uscita del comando mysqlshow, verrà eseguita la seguente eco.

+3

Penso che questa risposta vinca –

+3

Questo sicuramente non funziona, almeno sulla mia versione di mysqlshow, perché il comando restituisce successo indipendentemente dal fatto che il DB esista o meno, quindi è necessario analizzare l'output. – gtd

+1

'mysqlshow' funziona per me, ma l'uso di' mysql' è un'altra alternativa '' '' 'mysql" test "-e exit>/dev/null 2> & 1 && echo" Esiste il database .''' – jswetzen

0

seguenti comandi dovrebbe fare il trucco per entrambi i casi,

mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO" 
+0

Questo è errato Questo comando restituirà sempre "SÌ" perché mysqlshow mostrerà un elenco vuoto di database, senza errori perché il comando verrà eseguito pr operly. Sarà necessario analizzare l'output per sapere se l'elenco è vuoto o meno. – Fabricio

+0

@Fabricio Le pagine man mostrano una firma di 'mysqlshow [nome_db [nome_tw [nome_colonna]]', esce non zero se manca ciò che si specifica. Restituisce una lista del livello successivo in basso se lo fa. –

+0

@SteveBuzonas, hai provato il tuo codice? L'ho fatto e restituisce sempre SÌ. – Fabricio

4

Qui è 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 c'è un DB di nome abcd e usiamo -Fo dopo grep poi per il risultato della ricerca di DB a/ab/abc lo script mostrerà il risultato Database exist.

0
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then 
    echo "DB found" 
fi 
1

Ho anche usato una versione leggermente diversa da chown di.

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

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

0

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

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. - [Dalla recensione] (/ recensione/post di bassa qualità/11080332) – GAMITG

+1

@ G4M1TG Come non rispondere alla domanda? Sono d'accordo sul fatto che quasi tutte le risposte al solo codice potrebbero essere migliorate spiegando perché funziona, ma ciò non rende questa una non risposta. –

+0

dare più descrizione con ans. – GAMITG

2

È abbastanza semplice stabilire 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 qualche altro errore. La versione di mysqlshow I ha uscite 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.

Questo funziona su Ubuntu 12 + 14. Non ho ancora testato in altri ambienti ancora:

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

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

Tuttavia, se si sa che tutto ciò che è in esecuzione e si dispone di credenziali corrette, ecc, e si vuole dire solo se il DB esiste non si si può fare in una sola riga con un comando vuoto sql:

> mysql -uroot -ppassword good_db -e '' 
> echo $? 
0 
> mysql -uroot -ppassword bad_db -e '' 
ERROR 1049 (42000): Unknown database 'busker_core_locala' 
> echo $? 
1 
3

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:

  • - non c'è nessuna tale banca dati
  • - il database è stato trovato

Note:

  • MYSQL_PWD per disattivare l'avviso:

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

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

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

Problemi correlati