0
点赞
收藏
分享

微信扫一扫

MySQL经验分享:Shell开发问题

小黑Neo 04-05 17:30 阅读 2
mysqlshell

背景

之前整理过Python连接使用MySQL的经验,链接如下:

pymysql封装总结_pymysql封装类-CSDN博客

相比高级语言,Shell与MySQL开发使用相对会更麻烦一些;由于

  • shell是linux命令集的概称,是属于命令行的人机界面。Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁

  • 可以快速开发实现需求,运维用户是通过Shell快速实现需求,并且部署在Linux服务器上

所以分享下MySQL与Shell开发经验

分享

Shell脚本登录时警告不安全

说明

通过Shell脚本连接数据库MySQL进行操作时,在使用正确的用户密码正常登录MySQL后,会提示:[Warning] Using a password on the command line interface can be insecure

意思为:[警告]在命令行界面上使用密码可能不安全

复现

mysql_dev.sh脚本代码如下:

mysql_host=127.0.0.1
mysql_port=3306
mysql_user=root
mysql_passwd="123456"
mysql -h ${mysql_host} --port "${mysql_port}" -u "${mysql_user}" --password=${mysql_passwd} -e 'show databases'

执行脚本返回信息如下:
在这里插入图片描述

解决方案

通过全局设置密码export MYSQL_PWD=<明文密码>,改造如下:

mysql_host=127.0.0.1
mysql_port=3306
mysql_user=root
mysql_passwd="123456"
export MYSQL_PWD="${mysql_passwd}"
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}"  -e 'show databases'

执行脚本返回信息如下,问题被解决
在这里插入图片描述

执行SQL报错可以获知和处理

说明

当使用错误的SQL执行时,如表不存在这种场景,是没办法直接报错的;但是预期应该是:当报错时,可以获知和处理

复现

原代码如下:

mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}"  -e 'show database'

执行结果如下:
在这里插入图片描述

解决方案

通过shell的错误信号$?判断是否成功执行,改造如下:

mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}"  -e 'show database'
if [[ $? -ne 0 ]];then
    echo "执行MySQL报错"
fi

执行结果如下:

在这里插入图片描述

执行SQL报错信息不进行输出

说明

如上一个例子,可以知道执行SQL报错,因为直接打印输出了;但由于在Shell中,代码量多,在正常情况下,预期知道执行错误但不期望打印输出错误

解决方案

在上一个例子的前提下,可以通过Shell的 2>&1解决

改造如下:

mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}"  -e 'show database' 2>&1
if [[ $? -ne 0 ]];then
    echo "执行MySQL报错"
fi

改造后执行结果如下,MySQL客户端返回的错误信息没有被打印

在这里插入图片描述

补充:其中Shell脚本登录时告警不安全也可以通过这一方法解决

返回结果如何处理

说明

一般通过Shell脚本连接使用MySQL,不会有使用MySQL处理返回结果。但是也有这种场景问题。所以,怎么通过Shell处理MySQL执行SQL的返回结果,特别是多条返回结果的场景下。

解决方案

如处理获取MySQL表结构desc <table>

mysql_host=127.0.0.1
mysql_port=3306
mysql_user=root
mysql_passwd="123456"
export MYSQL_PWD="${mysql_passwd}"

sql="desc mysql.slow_log;"
if [[ $? -ne 0 ]];then
    echo "执行MySQL报错"
fi
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}" -e "${sql}" | awk '{
    if(NR>1){  
        print "序号: "NR-1", 字段: "$1", 类型: "$2", 是否允许为空: "$3", 默认值: "$4
    }
}'

执行返回结果
在这里插入图片描述

补充:由于awk默认是通过空格分列的,而MySQL也是,所以通过desc获取表结构信息的返回结果时,第5列预期返回的是描述信息,但实际上,如果描述信息有空格内容,会被截断。

总结

以上是MySQL与Shell开发经验分享,基本可以满足通过Shell开发满足日常运维需求

举报

相关推荐

0 条评论