Как из сценария оболочки проверить, существует ли база данных MySQL?

23

mysqladmin -uroot create fooвозвращает состояние выхода 1, если fooсуществует, и 0 в противном случае, но, конечно, он также создаст базу данных, если она еще не существует. Есть ли простой способ проверить, существует ли база данных?

ithinkihaveacat
источник

Ответы:

43

Я понимаю, что на это ответили давным-давно, но мне кажется, что сделать это намного чище:

mysql -u root -e 'use mydbname'

Если база данных существует, это не приведет к выводу и завершится с кодом возврата == 0.

Если база данных не существует, это выдаст сообщение об ошибке на stderr и завершится с кодом возврата == 1. Таким образом, вы должны сделать что-то вроде этого:

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

Это прекрасно работает со сценариями оболочки, не требует какой-либо обработки вывода и не требует наличия доступа к локальной файловой системе.

larsks
источник
1
Если вы хотите подавить сообщение об ошибке, попробуйте это (конечно, рассмотрите возможность удаления вашего пароля в целях безопасности): если! mysql -u <пользователь> -p <pw> -e 'use <db name>' 2> / dev / null; затем mysql -u <пользователь> -p <pw> -e 'CREATE DATABASE <имя базы данных>;'; фантастика
Питер Марк
10

mysql -e "SHOW DATABASES LIKE 'foo'" должен помочь вам.

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

Дом
источник
5
Спасибо. С помощью нескольких дополнительных параметров командной строки , она лучше интегрируется в сценарий оболочки: mysql --batch --skip-column-names -e "SHOW DATABASES LIKE 'foo'" | grep foo.
ithinkihaveacat
7

Базы данных в MySQL - это папки в файловой системе. Это облегчает поиск существования базы данных:

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

В данном случае /var/libэто datadir MySQL. Хорошая особенность этого фрагмента в том, что ему не понадобится работающий демон MySQL, и при этом ему не нужны учетные данные. Конечно, пользователь, выполняющий команду, должен иметь возможность спускаться в этот каталог.

Lekensteyn
источник
6

С http://www.jbmurphy.com/2011/02/08/quick-check-if-a-mysql-database-exists/ это больше похоже на то, что я хотел:

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
Роб Баррека
источник
идеальный способ проверить это.
Мани
2

Немного странно, но это выведет 1, если foo не существует, 0 в противном случае:

mysqlshow -u root foo 2>&1 >/dev/null | awk ' { print /Unknown database/ }'
Дональд
источник
2

Я думаю, что вы можете проверить, если ваша необходимая база данных работает простым способом в любой оболочке

mysql -uUSERNAME -pPASSWORD DATABASE -e exit

а затем проверьте $?код выхода

Эта команда пытается ваши конкретные учетные данные (USERNAME и PASSWORD) для подключения к выбранной базе данных и exitнемедленно. Таким образом, если соединение в порядке, код выхода будет 0, и ненулевой в противном случае.

Конечно, вы можете перенаправить любой вывод в /dev/nullслучае необходимости

PS. Этот метод очень полезен для проверки состояния эфемерных хранилищ, которые так быстры и популярны в наши дни. Если база данных не может быть подключена, вы должны начать восстановление как можно скорее.

Wile E.
источник