W skrypcie powłoki, jak mogę sprawdzić, czy istnieje baza danych MySQL?

23

mysqladmin -uroot create foozwraca status wyjścia 1, jeśli fooistnieje, a 0 w przeciwnym razie, ale oczywiście utworzy również bazę danych, jeśli jeszcze nie istnieje. Czy jest jakiś prosty sposób, aby po prostu sprawdzić, czy baza danych istnieje?

ithinkihaveacat
źródło

Odpowiedzi:

43

Zdaję sobie sprawę, że już dawno na nie odpowiedziano, ale wydaje mi się to o wiele czystsze:

mysql -u root -e 'use mydbname'

Jeśli baza danych istnieje, nie spowoduje to wyjścia i zakończy się kodem powrotu == 0.

Jeśli baza danych nie istnieje, spowoduje to wygenerowanie komunikatu o błędzie na stderr i wyjście z kodem powrotu == 1. Więc zrobiłbyś coś takiego:

if ! mysql -u root -e 'use mydbname'; then
  ...do stuff to create database...
fi

Działa to dobrze ze skryptami powłoki, nie wymaga przetwarzania danych wyjściowych i nie zależy od dostępu do lokalnego systemu plików.

Larsks
źródło
1
Dla każdego, kto może chcieć ukryć komunikat o błędzie, spróbuj tego (oczywiście rozważ usunięcie swojego hasła ze względów bezpieczeństwa): jeśli! mysql -u <użytkownik> -p <pw> -e 'użyj <nazwa_db>> 2> / dev / null; następnie mysql -u <użytkownik> -p <pw> -e 'CREATE DATABASE <nazwa bazy danych>;'; fi
Peter Mark
10

mysql -e "SHOW DATABASES LIKE 'foo'" powinien ci pomóc.

http://dev.mysql.com/doc/refman/5.1/en/show-databases.html

Dom
źródło
5
Dzięki. Z kilkoma więcej opcji wiersza polecenia to lepiej integruje się w skryptach: mysql --batch --skip-column-names -e "SHOW DATABASES LIKE 'foo'" | grep foo.
ithinkihaveacat
7

Bazy danych w MySQL to foldery w systemie plików. Dzięki temu cholernie łatwo jest ustalić, czy baza danych istnieje:

test -d "/var/lib/mysql/databasename"

W tym przypadku /var/libjest to katalog danych MySQL. Zaletą tego fragmentu jest to, że nie będzie on potrzebował uruchomionego demona MySQL, ani poświadczeń. Oczywiście użytkownik uruchamiający polecenie musi mieć możliwość zejścia do tego katalogu.

Lekensteyn
źródło
6

Od http://www.jbmurphy.com/2011/02/08/quick-check-if-a-mysql-database-exists/ jest to bardziej zbliżone do tego, czego chciałem:

DBNAME="dblookingfor"
DBEXISTS=$(mysql --batch --skip-column-names -e "SHOW DATABASES LIKE '"$DBNAME"';" | grep "$DBNAME" > /dev/null; echo "$?")
if [ $DBEXISTS -eq 0 ];then
    echo "A database with the name $DBNAME already exists."
else
    echo " database $DBNAME does not exist."
fi
Rob Barreca
źródło
idealny sposób, aby to sprawdzić.
Mani
2

Trochę hacky, ale to wypisze 1, jeśli foo nie istnieje, 0 w przeciwnym razie:

mysqlshow -u root foo 2>&1 >/dev/null | awk ' { print /Unknown database/ }'
Donald
źródło
2

Myślę, że możesz sprawdzić, czy potrzebna baza danych działa w prosty sposób w dowolnej powłoce

mysql -uUSERNAME -pPASSWORD DATABASE -e exit

a następnie sprawdź $? kod wyjścia

To polecenie próbuje użyć określonych poświadczeń (NAZWA UŻYTKOWNIKA i HASŁO), aby połączyć się z wybraną bazą danych i exitnatychmiast. Tak więc, jeśli połączenie jest prawidłowe, kodem wyjścia będzie 0, a w przeciwnym razie zero.

Oczywiście możesz przekierować dowolne wyjście w /dev/nullrazie potrzeby

PS. Ta metoda jest bardzo przydatna do sprawdzania stanu efemerycznych magazynów, które są tak szybkie i popularne w naszych czasach. Jeśli nie można połączyć się z bazą danych, należy przywrócić jak najszybciej.

Wile E.
źródło