Bashスクリプト内からmysqlデータベースが存在するかどうかを確認することは可能ですか?結果に応じて、別のアクションを実行するか、スクリプトを終了しますか?
サンプルスクリプト(--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 |
+-----------+
+-----------+
次に、出力を解析し、存在するかどうかに基づいて必要なことを行います!
@ chownによる回答 に+1を指定しますが、別の選択肢があります。bashスクリプトがMySQLインスタンスでローカルに実行されており、datadirへのパスがわかっている場合は、テストできます。
if [ -d /var/lib/mysql/databasename ] ; then
# Do Stuff ...
fi
これは、スクリプトを実行しているシェルユーザーがMySQL datadirの内容を読み取るためのファイルシステムレベルの権限を持っていることも前提としています。これはよくあるケースですが、確かではありません。
mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."
Mysqlshowコマンドの終了ステータスに応じて、次のエコーが実行されます。
私は受け入れられた回答を得ることができませんでした(引用符の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
を使用して、結果から列名を削除しました。
代替バージョンは次のとおりです。
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
。
[〜#〜]はい[〜#〜]
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
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:
ノート:
MYSQL_PWD
は警告を無効にします:
mysql:[警告]コマンドラインインターフェースでパスワードを使用することは安全ではありません。
--skip-column-names
は列を非表示にします
--batch
は+-----------+
などの境界線を無効にします
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
mysql
コマンドに-e
オプションを使用します。これにより、任意のクエリを実行できます(正しい資格情報を前提としています)。データベースの名前だけを返すクエリがわからないので、おそらくshow databases
またはshow tables from dbname
の結果を解析する必要があります。
また、chownのバージョンとは少し異なるバージョンを使用しました。
result=$(mysqlshow --user=root --password=12345 dbname | grep -v Wildcard | grep -ow dbname)
上記は指定されたコマンドを実行し、戻り値をresult
に割り当てます。そして、w
オプションはdbname
と完全に一致します。
助けになれば、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%の信頼性はありません。 (私はそれをテストしていません。)
また、データベースを使用して終了コードを処理するように依頼できます。
$ 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'
または、$を調べますか?呼び出しの後。
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である必要があるため、存在しないデータベースをエラーとして表示するのではなく、ゼロ以外のステータスを使用してエラーを報告できます。
次のコマンドは、両方のケースでトリックを実行する必要があります。
mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"
if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
echo "DB found"
fi
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名が取得され、必要なデータベースが存在するかどうかが確認されます。
mysqlshowは、データベース名にアンダースコア文字「_」を表示しません。
mysqlshow $DOMAIN %
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