是否可以从bash脚本中检查是否存在mysql数据库。根据结果,然后执行另一个操作或终止脚本?
答案 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 强>:
注意:
MYSQL_PWD
禁用警告:
mysql:[警告]在命令行界面上使用密码可能不安全。
--skip-column-names
隐藏列
--batch
禁用+-----------+
答案 7 :(得分:2)
使用-e
命令的mysql
选项。它将允许您执行任何查询(假设正确的凭据)。我不知道只返回数据库名称的查询,因此您可能需要解析show databases
或show 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 %
答案 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"