E 'possibile da uno script bash verificare se esiste un database mysql. A seconda del risultato, eseguire un'altra azione o terminare lo script?bash script - controlla se il database mysql esiste esegui un'azione basata sul risultato
risposta
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!
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
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
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.
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
Questa è una soluzione più elegante e affidabile. MI PIACE: D –
dipende da 'file_per_table' se ricordo male. e il percorso dipende dal sistema operativo. – scones
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
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."
A seconda dello stato di uscita del comando mysqlshow, verrà eseguita la seguente eco.
Penso che questa risposta vinca –
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
'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
seguenti comandi dovrebbe fare il trucco per entrambi i casi,
mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
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
@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. –
@SteveBuzonas, hai provato il tuo codice? L'ho fatto e restituisce sempre SÌ. – Fabricio
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
.
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
echo "DB found"
fi
mysqlshow non mostrerà di sottolineatura caratteri '_' nel nome del database.
mysqlshow $DOMAIN %
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
.
Questo esegue una query MySQL per ottenere tutti i nomi di DB, quindi greps per verificare che il database richiesto esista.
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
@ 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. –
dare più descrizione con ans. – GAMITG
È 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
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
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+-----------+
- 1. BASH, controlla se il file esiste e continua else exit
- 2. MySql php: controlla se esiste Riga
- 3. Controlla se il nome utente esiste nel database con AJAX
- 4. Esegui script bash come demone
- 5. Controlla se la colonna esiste nella tabella Mysql tramite php
- 6. VBA controlla se il file esiste
- 7. php: controlla se il percorso esiste?
- 8. logstash controlla se il campo esiste
- 9. Crea database mysql e utente in bash script
- 10. Java MySQL verifica se il valore esiste nel database
- 11. Script Bash se istruzioni
- 12. controlla se l'immagine esiste php
- 13. BASH controlla se oggi è il 1 ° giorno del mese
- 14. script bash - selezionare dal database alla variabile
- 15. Verificare se esiste una funzione da uno script bash
- 16. Esegui uno script bash da uno script R
- 17. Come si controlla se esiste Record
- 18. Esegui script Python sul file selezionato
- 19. Bash: eliminazione basata sul timbro data del file
- 20. Esegui il comando shell da un client MySQL?
- 21. Flask-SQLAlchemy controlla se esiste una riga nella tabella
- 22. Controlla se git remote esiste prima del primo invio
- 23. Neo4j controlla se il nodo esiste prima della creazione?
- 24. Esegui script bash da un altro script senza attendere che lo script finisca di essere eseguito?
- 25. Controlla se la directory esiste in lua?
- 26. Node.js - Mongoose - Controlla se esiste una collezione
- 27. Express, controlla se esiste un modello
- 28. Script Bash che cattura l'output sul terminale
- 29. Controlla se esiste un thread maneggiato
- 30. C++ controlla se l'elemento esiste nell'array
+1 ma FWIW è necessario connettersi come utente con privilegi per quel database, oppure il database mancare dai risultati. –
@billk Testato e tu sei corretto, immagino che per far funzionare tutto questo sia necessario eseguire lo script con 'sudo'. – chown
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. –