如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?
Posted
技术标签:
【中文标题】如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?【英文标题】:How to check if a table exists in a MySQL database using shell script?如何使用 shell 脚本检查 MySQL 数据库中是否存在表? 【发布时间】:2017-12-08 10:13:31 【问题描述】:我正在尝试使用 shell 脚本检查表是否为空 我的代码是
#!/bin/bash
if [ "mysql -u user -ppassword -hserver dbname -e 'select count(*) from test_dec;'" != 0 ];
then
echo "table not empty"
else
echo "table empty"
fi
但是当我运行它时,即使查询的输出为 0,它也总是显示“table not empty”。
user@server$ ./table_check.sh
table not empty
这里有什么问题?
【问题讨论】:
【参考方案1】:这是我的脚本版本,它会首先检查表是否存在,如果存在则检查表是否为空。
重击
#!/bin/bash
# Prepare variables
TABLE=$1
SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "$TABLE")
SQL_IS_EMPTY=$(printf 'SELECT 1 FROM %s LIMIT 1' "$TABLE")
# Credentials
USERNAME=YOUR_USERNAME
PASSWORD=YOUR_PASSWORD
DATABASE=YOUR_DATABASE_NAME
echo "Checking if table <$TABLE> exists ..."
# Check if table exists
if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_EXISTS" $DATABASE) ]]
then
echo "Table exists ..."
# Check if table has records
if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_IS_EMPTY" $DATABASE) ]]
then
echo "Table has records ..."
else
echo "Table is empty ..."
fi
else
echo "Table not exists ..."
fi
用法
首先,在使用此脚本之前,您需要将 YOUR_USERNAME、YOUR_PASSWORD 和 YOUR_DATABASE_NAME 替换为相应的值。那么:
# bash SCRIPT_NAME TABLE_TO_CHECK
bash my_script my_table
其中 SCRIPT_NAME( my_script ) 是包含上述脚本内容的文件的名称,TABLE_TO_CHECK( my_table ) 是您要检查的表的名称。
预期输出
Checking if table <my_table> exists ...
Table exists ...
Table is empty ...
关于代码的几句话
将命令行的第一个参数存储在变量TABLE
中
TABLE=$1
准备两个变量来保存用于检查的 SQL 查询。
注意printf
是用来在变量中插入表名的,因为$('SHOW TABLES LIKE "$TABLE"')
是不行的。
SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "$TABLE")
SQL_IS_EMPTY=$(printf 'SELECT COUNT(*) as records FROM %s' "$TABLE")
检查表是否存在。如果表不存在,SHOW TABLES LIKE "table_name"
将返回空字符串,if statement
将失败。像$(echo 1 + 2)
一样使用$
意味着 - 评估括号内的任何内容并将其作为值返回。
if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_EXISTS" $DATABASE) ]]
最后我们检查表是否为空。使用以前的方法。基本上我们检查 MySQL 是否会返回空字符串(对于空表),否则查询将返回一些文本作为结果,我们可以认为该表不是空的。
if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_IS_EMPTY" $DATABASE) ]]
【讨论】:
【参考方案2】:我认为下面会做你的工作,
#!/bin/bash
if [ $(mysql -u user -ppassword -hserver dbname -sse "select count(*) from test_dec;") -gt 0 ];
then
echo "table not empty"
else
echo "table empty"
fi
您的脚本有 3 处更改,
-
将整个mysql语句部分包含在
$(..)
-->
中以使LHS
成为$(...)
中的结果
将mysql连接语句-->
中的-e
更改为-sse
,只得到查询结果输出,不带表头和表结构。
将 !=
更改为 -gt
-->
运算符以在 bash 中进行整数比较
【讨论】:
它运行但给了我一个错误第 3 行:[: -gt: unary operator expected 你确定吗,你用过-sse
,输出是count(*)
。
很高兴听到。 (Y)。【参考方案3】:
这应该可以工作
if [ $(mysql -u root -p -e \
"select count(*) from information_schema.tables where \
table_schema='db_name' and table_name='table_name';") -eq 1 ]; then
echo "table exist"
exit 1
else
echo "table doesn't exist"
exit 1
fi
【讨论】:
【参考方案4】:在测试我们是否需要重新导入数据库时,这对我有用。
databasename="mydatabasename";
tablename="tableweneed";
dbhost="localhost";
username="user";
password="password";
dbtest=$(mysql -h $dbhost -u $username -p$password -s -N -e "select count(*) as tablecount from information_schema.tables WHERE table_schema='$databasename' and table_name='$tablename'")
if [ "$dbtest" == 1 ]; then
echo "Database is ok"
else
echo "Database is being re-imported"
mysql -h $dbhost -u $user -p$password $databasename < /somefolderonmysystem/importdb.sql
fi
【讨论】:
【参考方案5】:在尝试了几种不同的方法后,这是我们使用的:
if [[ $(mysql --execute "SHOW TABLES FROM $DB_NAME LIKE '$DB_PREFIXoptions';") -gt 0 ]]; then
...是的,我们在脚本前面将mysql
定义为函数,并且数据库名称和数据库前缀也在配置文件中定义(这是我们 SlickStack 项目的一部分)。
function mysql
command mysql --user=root --host=localhost --protocol=socket --port=3306 --force "$@"
您可以根据需要在 bash 脚本中更改此函数的名称。
示例:https://github.com/littlebizzy/slickstack/blob/master/bash/ss-install-wordpress-config.txt
【讨论】:
以上是关于如何使用 shell 脚本检查 MySQL 数据库中是不是存在表?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Shell 脚本定期检查 MySQL 服务是否正常运行
使用 Shell 脚本定期检查 MySQL 服务是否正常运行
使用 Shell 脚本定期检查 MySQL 服务是否正常运行