web-dev-qa-db-ja.com

mysqlデータベースが存在するかどうかを確認し、結果に基づいてアクションを実行します

Bashスクリプト内からmysqlデータベースが存在するかどうかを確認することは可能ですか?結果に応じて、別のアクションを実行するか、スクリプトを終了しますか?

27
David

サンプルスクリプト(--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

これらは、プロンプトで実行した場合のコマンドの外観です。

[root@Host ~]# mysqlshow myDatabase
Wildcard: myDatabase
+------------------+
|    Databases     |
+------------------+
| myDatabase       |
+------------------+

DBが存在しない場合、出力は次のようになります。

[root@Host ~]# mysqlshow myDatabase
Wildcard: myDatabase
+-----------+
| Databases |
+-----------+
+-----------+

次に、出力を解析し、存在するかどうかに基づいて必要なことを行います!

30
chown

@ chownによる回答 に+1を指定しますが、別の選択肢があります。bashスクリプトがMySQLインスタンスでローカルに実行されており、datadirへのパスがわかっている場合は、テストできます。

if [ -d /var/lib/mysql/databasename ] ; then 
    # Do Stuff ...
fi

これは、スクリプトを実行しているシェルユーザーがMySQL datadirの内容を読み取るためのファイルシステムレベルの権限を持っていることも前提としています。これはよくあるケースですが、確かではありません。

39
Bill Karwin
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."

Mysqlshowコマンドの終了ステータスに応じて、次のエコーが実行されます。

19
mattes

私は受け入れられた回答を得ることができませんでした(引用符の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
Matthieu Napoli

代替バージョンは次のとおりです。

 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という名前のDBがあり、grepの後に-Foを使用し、DBの検索結果にa/ab/abcスクリプトは結果を表示しますDatabase exist

5
gurel_kaynak

[〜#〜]はい[〜#〜]

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
4
ajreal

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

  • -そのようなデータベースはありません
  • 1-データベースが見つかりました

ノート:

  • MYSQL_PWDは警告を無効にします:

    mysql:[警告]コマンドラインインターフェースでパスワードを使用することは安全ではありません。

  • --skip-column-namesは列を非表示にします

  • --batch+-----------+などの境界線を無効にします

3
arz.freezy

Mysqlshowでデータベースが存在するかどうかを確実に判断するのは簡単です。トリックは、データベースnot既存、またはその他の障害の違いを確実に判断できることです。 mysqlshowのバージョンでは、どちらの場合も「1」で終了するため、わかりません。

これが私がそれを処理するために思いついたものです。それに応じてmysqlshowコマンドを調整するか、資格情報をchmod 600 'd〜/ .my.cnfファイル。

これはUbuntu 12 + 14で動作します。他の環境ではまだテストしていません。

#!/bin/bash -u

# Takes 1 argument. Aborts the script if there's 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
2
Dale Anderson

mysqlコマンドに-eオプションを使用します。これにより、任意のクエリを実行できます(正しい資格情報を前提としています)。データベースの名前だけを返すクエリがわからないので、おそらくshow databasesまたはshow tables from dbnameの結果を解析する必要があります。

2
Cfreak

また、chownのバージョンとは少し異なるバージョンを使用しました。

result=$(mysqlshow --user=root --password=12345 dbname | grep -v Wildcard | grep -ow dbname)

上記は指定されたコマンドを実行し、戻り値をresultに割り当てます。そして、wオプションはdbnameと完全に一致します。

1
Pubudu

助けになれば、Debian StretchのMariaDBでこれを行いました:

DB_CHECK=$(mysqlshow "${DB_NAME}" | grep "Unknown database") 1> /dev/null
if [ ! -z "${DB_CHECK}" ]; then
    echo "Database found."
else
    echo "Database not found."
fi

簡単な説明:変数$DB_NAMEのデータベース名のmysqlshowの結果は、「不明なデータベース」についてチェックされます。その文字列が見つかると、変数$DB_CHECKに入れられます。最後に、-z比較は、$DB_CHECK変数が空かどうかをチェックします。

$DB_CHECKが空の場合、mysqlshow応答に「不明なデータベース」は表示されませんでした。おそらく、接続に失敗した場合など、100%の信頼性はありません。 (私はそれをテストしていません。)

1
Adambean

また、データベースを使用して終了コードを処理するように依頼できます。

$ if mysql -uroot -pxxx -e "USE mysql"; then echo "exists"; fi
exists

$ if mysql -uroot -pxxx -e "USE doesnotexist"; then echo "exists"; fi
ERROR 1049 (42000) at line 1: Unknown database 'doesnotexist'

または、$を調べますか?呼び出しの後。

1
user2234372

FWIW、auth_socketプラグインはこれをはるかに簡単にします。質問は非常に古いかもしれませんが、私のような人々がインスピレーションを求めてここに来ています。

スクリプトがルートとして実行されている場合、これを行うことができます:

DBNAME="what_you_are_looking_for"
DBEXISTS="$(mysql -u root -e "show databases like '$DBNAME'" --batch --skip-column-names)"

データベースが存在する場合、$DBNAME = $DBEXISTS

データベースが存在しない場合、$DBEXISTS = ""

両方の終了ステータスは0である必要があるため、存在しないデータベースをエラーとして表示するのではなく、ゼロ以外のステータスを使用してエラーを報告できます。

0
Jared Brandt

次のコマンドは、両方のケースでトリックを実行する必要があります。

mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
0
cavernicola
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
    echo "DB found"
fi
0
Fedir RYKHTIK

mysqlshowはこれに適したツールです。データベースの存在を確認するテストです。database_name

if mysqlshow -p${MYSQL_ROOT} 2>/dev/null| grep -q "database_name"
then
    echo "Database exist."
else
    echo "Database does not exist."
fi

またはシンプルなワンライナー

echo "Database "`mysqlshow -p${MYSQL_ROOT} 2>/dev/null| grep -q "database_name"  || echo "does not "`"exist."
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クエリが実行されてすべてのDB名が取得され、必要なデータベースが存在するかどうかが確認されます。

0
Michael Litvin

mysqlshowは、データベース名にアンダースコア文字「_」を表示しません。

mysqlshow $DOMAIN %

https://dev.mysql.com/doc/refman/5.1/en/mysqlshow.html

0
busy

mysqlshowパスは常に成功を返すため、出力を解析する必要があります(少なくともmysqlのバージョンでは)。デールは、障害を区別することについて非常に良い点を示しています。

ただし、すべてが実行されていることを知っていて、正しい資格情報などがある場合、のみ DBが存在するかどうかを確認したい場合は、1行で実行できます空の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
0
gtd