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脚本代码如下:

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开发满足日常运维需求

相关推荐

  1. MySQLshell问题

    2024-04-01 06:30:04       41 阅读
  2. MysqlMysql8日常优化经验分享

    2024-04-01 06:30:04       30 阅读
  3. 我的项目开发经验分享

    2024-04-01 06:30:04       62 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-01 06:30:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-01 06:30:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-01 06:30:04       87 阅读
  4. Python语言-面向对象

    2024-04-01 06:30:04       96 阅读

热门阅读

  1. 182. 查找重复的电子邮箱

    2024-04-01 06:30:04       39 阅读
  2. 设计模式(10):享元模式

    2024-04-01 06:30:04       31 阅读
  3. 关于rabbitmq的prefetch机制

    2024-04-01 06:30:04       40 阅读
  4. Rust 框架(Rocket)

    2024-04-01 06:30:04       40 阅读
  5. rust- 结构体与二进制数组转换

    2024-04-01 06:30:04       44 阅读
  6. rust语言学习入门

    2024-04-01 06:30:04       42 阅读
  7. go、rust去掉了继承

    2024-04-01 06:30:04       37 阅读
  8. OV证书和EV证书的区别

    2024-04-01 06:30:04       37 阅读
  9. os模块篇(五)

    2024-04-01 06:30:04       33 阅读
  10. 算法编程:排列与组合问题

    2024-04-01 06:30:04       38 阅读