Возможно ли из bash script проверить наличие базы данных mysql. В зависимости от результата выполните другое действие или завершите script?
Bash script - проверить, существует ли база данных mysql, выполнить действие на основе результата
Ответ 1
Пример script (Спасибо Биллу Карвину за комментарий --user
и --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
Вот как выглядят команды при запуске в командной строке:
[[email protected] ~]# mysqlshow myDatabase
Wildcard: myDatabase
+------------------+
| Databases |
+------------------+
| myDatabase |
+------------------+
Если DB не существует, вывод будет выглядеть следующим образом:
[[email protected] ~]# mysqlshow myDatabase
Wildcard: myDatabase
+-----------+
| Databases |
+-----------+
+-----------+
Затем проанализируйте вывод и сделайте то, что вам нужно, на основе, если оно существует или нет!
Ответ 2
Я даю +1 для ответа @chown, но здесь другая альтернатива: если bash script выполняется локально с экземпляром MySQL, и вы знаете путь к datadir, вы можете проверить:
if [ -d /var/lib/mysql/databasename ] ; then ...
Это также предполагает, что ваш пользователь оболочки, на котором запущен script, имеет права на уровне файловой системы, чтобы прочитать содержимое MySQL-данных. Это часто бывает, но это не очевидно.
Ответ 3
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."
В зависимости от состояния выхода команды mysqlshow он выполнит следующее эхо.
Ответ 4
Я не смог получить принятый ответ для меня (grep
в кавычках не работает), так вот моя версия:
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
Я использовал опцию --skip-column-names
, чтобы удалить имена столбцов из результата.
Ответ 5
Да
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
Ответ 6
Вот альтернативная версия:
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
Если существует БД с именем abcd
, и мы используем -Fo
после grep
, то для результата поиска DB a
/ab
/abc
script покажет результат Database exist
.
Ответ 7
используйте параметр -e
для команды mysql
. Это позволит вам выполнить любой запрос (при условии правильности учетных данных). Я не знаю запроса, который возвращает только имя базы данных, поэтому вам, вероятно, потребуется проанализировать результаты show databases
или show tables from dbname
Ответ 8
Это достаточно просто, чтобы надежно определить, существует ли база данных с mysqlshow. Трюк позволяет надежно определить разницу между существующей базой данных или некоторым другим сбоем. В версии mysqlshow у меня есть выходы с "1" в любом случае, поэтому он не может сказать.
Вот что я придумал, чтобы справиться с этим. Откорректируйте свою команду mysqlshow или введите свои учетные данные в файл chmod 600
'd ~/.my.cnf.
Это работает на Ubuntu 12 + 14. Я еще не тестировал его в других средах:
#!/bin/bash -u
# Takes 1 argument. Aborts the script if there 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
Ответ 9
Другое решение без 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
- 0 - такой базы данных нет
- 1 - база данных была найдена
Примечания:
-
MYSQL_PWD
, чтобы отключить предупреждение:mysql: [Warning] Использование пароля в интерфейсе командной строки может быть небезопасным.
-
--skip-column-names
, чтобы скрыть столбцы -
--batch
, чтобы отключить границы, например+-----------+
Ответ 10
Я также использовал немного другую версию от chown.
result=$(mysqlshow --user=root --password=12345 dbname | grep -v Wildcard | grep -ow dbname)
Вышеупомянутая команда выполняет заданную команду и присваивает возвращаемое значение result
. Опция w
точно соответствует dbname
.
Ответ 11
Следующая команда должна сделать трюк для обоих случаев,
mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
Ответ 12
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
echo "DB found"
fi
Ответ 13
mysqlshow не будет показывать символы подчеркивания '_' в имени базы данных.
mysqlshow $DOMAIN %
Ответ 14
mysql_user=<you_db_username>
mysql_pass=<you_db_passwrod>
target_db=<your_db_name>
if [ "`mysql -u${mysql_user} -p${mysql_pass} -e 'show databases;' | grep ${target_db}`" == "${target_db}" ]; then
echo "Database exist"
else
echo "Database does not exist"
fi
Это выполняет запрос MySQL для получения всех имен БД, а затем greps, чтобы проверить, существует ли требуемая база данных.
Ответ 15
Путь mysqlshow
требует синтаксического анализа вывода (по крайней мере, для версии mysql, который у меня есть), потому что он всегда возвращает успех. Дейл очень хорошо разбирается в различиях между отказами.
Однако, если вы знаете, что все работает, и у вас есть правильные учетные данные и т.д., и вы хотите сказать только, существует ли БД, вы не можете сделать это в одной строке с пустой командой 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