bash脚本 - 检查mysql数据库是否存在根据结果执行操作

Dav*_*vid 27 mysql linux bash

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

Bil*_*win 39

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

if [ -d /var/lib/mysql/databasename ] ; then 
    # Do Stuff ...
fi
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个更优雅,更可靠的解决方案..我喜欢它:D (2认同)

cho*_*own 30

示例脚本(感谢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
Run Code Online (Sandbox Code Playgroud)

这些是在提示符下运行时命令的样子:

[root@host ~]# mysqlshow myDatabase
Wildcard: myDatabase
+------------------+
|    Databases     |
+------------------+
| myDatabase       |
+------------------+
Run Code Online (Sandbox Code Playgroud)

如果不存在DB,则输出将如下所示:

[root@host ~]# mysqlshow myDatabase
Wildcard: myDatabase
+-----------+
| Databases |
+-----------+
+-----------+
Run Code Online (Sandbox Code Playgroud)

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

  • 也许我的mysqlshow版本不同,但它不能这样工作.如果我将数据库名称指定为最后一个参数,则它会在数据库标题下单独列出它,或者提供未知的数据库错误(如果它不存在).如果我没有指定数据库,它会给我数据库列表.我的mysqlshow的版本信息说"mysqlshow Ver 9.10 Distrib 5.1.58,debian-linux-gnu(i686)" (4认同)

mat*_*tes 19

mysqlshow "test" > /dev/null 2>&1 && echo "Database exists."
Run Code Online (Sandbox Code Playgroud)

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

  • 这肯定不起作用,至少在我的mysqlshow版本上,因为无论数据库是否存在,该命令都会返回成功,因此您必须解析输出. (4认同)
  • 我认为这个答案赢了 (3认同)

Cfr*_*eak 5

使用命令-e的选项mysql。它可以让您执行任何查询(假设有正确的凭据)。

这可能是一个例子:

if mysql "DATABASE_NAME" -e exit > /dev/null 2>&1; then
    echo "Exists"
else
    echo "Not exists"
fi
Run Code Online (Sandbox Code Playgroud)


Mat*_*oli 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
Run Code Online (Sandbox Code Playgroud)

我使用该选项--skip-column-names从结果中删除列名称.


gur*_*nak 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
Run Code Online (Sandbox Code Playgroud)

如果有一个名为DB abcd且我们-Fo在此grep之后使用DB a/ ab/ abc的搜索结果,脚本将显示结果Database exist.