MySQL经验分享:Shell开发问题

04-01 阅读 0评论

背景

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

MySQL经验分享:Shell开发问题,MySQL经验分享:Shell开发问题,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,方法,设置,第1张
(图片来源网络,侵删)

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经验分享:Shell开发问题,MySQL经验分享:Shell开发问题,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,方法,设置,第2张
    (图片来源网络,侵删)

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

    复现

    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'
    

    执行脚本返回信息如下:

    MySQL经验分享:Shell开发问题

    解决方案

    通过全局设置密码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'
    

    执行脚本返回信息如下,问题被解决

    MySQL经验分享:Shell开发问题

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

    说明

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

    复现

    原代码如下:

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

    执行结果如下:

    MySQL经验分享:Shell开发问题

    解决方案

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

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

    执行结果如下:

    MySQL经验分享:Shell开发问题

    执行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客户端返回的错误信息没有被打印

    MySQL经验分享:Shell开发问题

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

    返回结果如何处理

    说明

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

    解决方案

    如处理获取MySQL表结构desc

    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", 字段: "", 类型: "", 是否允许为空: "", 默认值: "
        }
    }'
    

    执行返回结果

    MySQL经验分享:Shell开发问题

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

    总结

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


免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,人围观)

还没有评论,来说两句吧...

目录[+]