Em um script de shell, como posso verificar se existe um banco de dados MySQL?

22

mysqladmin -uroot create fooretorna um status de saída 1, se fooexistir, e 0, caso contrário, mas é claro que também criará o banco de dados, se ainda não existir. Existe alguma maneira fácil de simplesmente verificar se existe um banco de dados?

ithinkihaveacat
fonte

Respostas:

42

Sei que isso foi respondido há muito tempo, mas me parece muito mais limpo fazer isso:

mysql -u root -e 'use mydbname'

Se o banco de dados existir, isso não produzirá saída e sairá com código de retorno == 0.

Se o banco de dados não existir, isso produzirá uma mensagem de erro no stderr e sairá com returncode == 1. Então, você faria algo assim:

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

Isso funciona bem com scripts de shell, não requer nenhum processamento da saída e não depende de ter acesso local ao sistema de arquivos.

larsks
fonte
1
Para quem quiser suprimir a mensagem de erro, tente o seguinte (é claro, considere remover sua senha por segurança): if! mysql -u <usuário> -p <pw> -e 'use <nome do banco de dados>' 2> / dev / null; então mysql -u <usuário> -p <pw> -e 'CREATE DATABASE <nome do banco de dados>;'; fi #
Peter Mark
10

mysql -e "SHOW DATABASES LIKE 'foo'" deve ajudá-lo.

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

Dom
fonte
5
Obrigado. Com mais algumas opções de linha de comando integra melhor em scripts shell: mysql --batch --skip-column-names -e "SHOW DATABASES LIKE 'foo'" | grep foo.
Ithinkihaveacat
7

Bancos de dados no MySQL são pastas no sistema de arquivos. Isso facilita muito descobrir se existe um banco de dados:

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

Nesse caso, /var/libé o datadir do MySQL. O bom desse trecho é que ele não precisará de um daemon MySQL em execução, nem credenciais. Obviamente, o usuário que está executando o comando deve ter permissão para descer para esse diretório.

Lekensteyn
fonte
6

Em http://www.jbmurphy.com/2011/02/08/quick-check-if-a-mysql-database-exists/, isso é mais parecido com o que eu queria:

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
fonte
maneira perfeita de verificar.
Mani
2

Um pouco hacky, mas isso imprimirá 1 se foo não existir, 0 caso contrário:

mysqlshow -u root foo 2>&1 >/dev/null | awk ' { print /Unknown database/ }'
Donald
fonte
2

Eu acho que você pode verificar se o seu banco de dados necessário funciona de maneira simples em qualquer shell

mysql -uUSERNAME -pPASSWORD DATABASE -e exit

e verifique o $?código de saída

Este comando tenta suas credenciais específicas (USERNAME e PASSWORD) para se conectar ao DATABASE selecionado e exitimediatamente. Portanto, se a conexão estiver correta, exitcode será 0 e diferente de zero.

Obviamente, você pode redirecionar qualquer saída para, /dev/nullse necessário

PS. Este método é muito útil para verificar a saúde dos depósitos efêmeros que são tão rápidos e populares nos dias de hoje. Se o banco de dados não puder ser conectado, você deverá iniciar a restauração o mais rápido possível.

Wile E.
fonte