检查mysql数据库是否存在,根据结果执行操作

时间:2011-09-09 16:27:52

标签: mysql linux bash

是否可以从bash脚本中检查是否存在mysql数据库。根据结果​​,然后执行另一个操作或终止脚本?

19 个答案:

答案 0 :(得分:38)

我给answer by @chown +1,但这是另一种选择:如果bash脚本在本地运行MySQL实例,并且你知道datadir的路径,你可以测试:

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

这也假设运行脚本的shell用户具有文件系统级权限来读取MySQL datadir的内容。情况经常如此,但不确定。

答案 1 :(得分:29)

示例脚本(感谢Bill Karwin对--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 |
+-----------+
+-----------+

然后,解析输出并根据它是否存在执行您需要的操作!

答案 2 :(得分:19)

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

根据mysqlshow命令的退出状态,它将执行以下echo。

答案 3 :(得分:5)

我无法让接受的答案为我工作(引号中的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从结果中删除列名。

答案 4 :(得分:5)

以下是替代版本:

 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 / {{1该脚本将显示结果abc

答案 5 :(得分:4)

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 :(得分:3)

没有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:[警告]在命令行界面上使用密码可能不安全。

  • --skip-column-names隐藏列

  • --batch禁用+-----------+

  • 等边框

答案 7 :(得分:2)

使用-e命令的mysql选项。它将允许您执行任何查询(假设正确的凭据)。我不知道只返回数据库名称的查询,因此您可能需要解析show databasesshow tables from dbname的结果

答案 8 :(得分:2)

很容易通过mysqlshow可靠地判断数据库是否存在。诀窍是能够可靠地区分数据库现有或其他一些故障。 mysqlshow的版本我退出了&#39; 1&#39;在任何一种情况下,它都无法说明。

这就是我想出来处理它的原因。相应地调整您的mysqlshow命令,或将您的凭据存入var x = d3.scale.ordinal() .domain(["A", "B", "C", "D", "E"]) .rangePoints([0, width]); var xAxis = d3.svg.axis() .scale(x) .tickValues(["a", "b", "c", "d", "e"]) .orient("bottom"); &#39; d~ / .my.cnf文件。

这适用于Ubuntu 12 + 14.我还没有在其他环境中测试过它:

chmod 600

答案 9 :(得分:1)

如果有帮助,我在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

简短说明:检查变量mysqlshow中数据库名称$DB_NAME的结果&#34;未知数据库&#34;。如果找到该字符串,则将其放入变量$DB_CHECK。然后最后-z比较检查$DB_CHECK变量是否为空。

如果$DB_CHECK为空,则&#34;未知数据库&#34;没有出现在mysqlshow回复中。可能不是100%可靠,如果连接失败或其他什么。 (我没有测试过。)

答案 10 :(得分:0)

这是我在bash脚本中执行的操作:

#!/bin/sh

DATABASE_USER=*****
DATABASE_PWD=*****
DATABASE_NAME=my_database

if mysql -u$DATABASE_USER -p$DATABASE_PWD -e "use $DATABASE_NAME";
then
echo "Database $DATABASE_NAME already exists. Exiting."
exit
else
echo Create database
mysql -u$DATABASE_USER -p$DATABASE_PWD -e "CREATE DATABASE $DATABASE_NAME"
fi

答案 11 :(得分:0)

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."

答案 12 :(得分:0)

您还可以要求使用数据库,然后处理退出代码。

$ 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'

还是检查$?通话结束后。

答案 13 :(得分:0)

FWIW,auth_socket插件使此操作变得更加容易。这个问题可能已经过时了,但是仍然有像我这样的人来这里寻求灵感。

如果您的脚本以root身份运行,则可以执行以下操作:

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

如果数据库存在,则$DBNAME = $DBEXISTS

如果数据库不存在,则为$DBEXISTS = ""

两者的退出状态都应为0,因此您仍然可以使用非零状态来报告错误,而不是让不存在的数据库显示为错误。

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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以检查所需的数据库是否存在。

答案 16 :(得分:0)

mysqlshow 不会在数据库名称中显示下划线字符“_”。

mysqlshow $DOMAIN %

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

答案 17 :(得分:0)

if [ $(mysqlshow DB 1>/dev/null 2>/dev/null) -eq 0 ]; then
    echo "DB found"
fi

答案 18 :(得分:0)

以下命令应该可以解决这两种情况,

mysqlshow "DB_NAME" &> /dev/null && echo "YES" || echo "NO"