Подтвердить что ты не робот

Bash script - проверить, существует ли база данных mysql, выполнить действие на основе результата

Возможно ли из bash script проверить наличие базы данных mysql. В зависимости от результата выполните другое действие или завершите script?

4b9b3361

Ответ 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

Ответ 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