MySQL经验分享:Shell开发问题

背景

之前整理过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脚本代码如下:

shell 复制代码
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=<明文密码>,改造如下:

shell 复制代码
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执行时,如表不存在这种场景,是没办法直接报错的;但是预期应该是:当报错时,可以获知和处理

复现

原代码如下:

shell 复制代码
mysql -h "${mysql_host}" --port "${mysql_port}" -u "${mysql_user}"  -e 'show database'

执行结果如下:

解决方案

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

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解决

改造如下:

shell 复制代码
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>

shell 复制代码
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开发满足日常运维需求

相关推荐
buyue__3 小时前
Python实现连接MySQL数据库并执行目录下的所有SQL文件,遇到错误时终止执行。
python·mysql
snow@li4 小时前
MySQL:库表设计完整规范与实战方案
数据库·mysql
Shawn Dev7 小时前
MySQL Binlog 数据误删除恢复完全指南
数据库·mysql·elasticsearch
陈卿诺语8 小时前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
sql·mysql·adb
南城以南溫暖如初1478 小时前
社区健身小程序开发流程详解:技术选型与实施经验分享
java·经验分享·spring boot·mysql·vue·apache
️学习的小王9 小时前
MySQL常用函数知识点总结
数据库·mysql·oracle
万亿少女的梦16810 小时前
基于Spring Boot、Java与MySQL的同城宠物服务系统设计与实现
java·spring boot·mysql·系统设计·协同过滤
万亿少女的梦16810 小时前
基于Spring Boot、Vue与MySQL的私人健身教练预约管理系统设计
java·spring boot·mysql·vue·预约管理
灯澜忆梦20 小时前
【MySQL12】进阶篇 | SQL优化
数据库·sql·mysql·性能优化
柒号华仔1 天前
「速通Shell」织线为面,Shell条件测试和判断
shell