MySQL 运维效率翻倍!手把手教你用 Shell 脚本玩转 MySQL 操作
哈喽,各位后端小伙伴们,我是云扬~
作为一名常年和 Java、MySQL 打交道的开发者,日常工作里总免不了和 MySQL 运维打交道:批量查询多台服务器的参数、统计数据库运行指标、定时导出连接信息……
如果每次都手动敲命令,不仅效率低,还容易因为手误踩坑。其实,用 Shell 脚本把这些重复操作自动化,是提升运维效率的 “神器”!
今天就带大家从零开始,手把手教你用 Shell 操作 MySQL,从基础的增删查改,到借助 AI 编写复杂的运维脚本,一篇搞定!
一、实验环境准备:先搭好 “练兵场”
在写脚本之前,我们需要先创建测试用户、测试库和表,确保后续脚本能正常执行。
1. 创建测试用户与权限
首先创建一个拥有足够操作权限的测试用户 shell_rw,避免直接使用 root 账号带来的安全风险:
-- 创建测试用户
CREATE USER 'shell_rw'@'%' IDENTIFIED BY 'Idyq8_a1';
-- 授予必要权限
GRANT create,alter,insert,delete,select,update,show view ON *.* TO 'shell_rw'@'%';
2. 创建测试库和表
接着创建测试数据库 maria 和商品表 products,后续的增删查改操作都基于这张表:
USE maria;
CREATE TABLE products (
id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
price decimal(10, 2) NOT NULL,
PRIMARY KEY (id)
);
3. 命令行快速连接 MySQL
先熟悉一下 Linux 命令行直接连接 MySQL 的方式,这是编写脚本的基础:
# 查看所有数据库
mysql -ushell_rw -p'Idyq8_a1' -e "show databases"
# 直接指定数据库,查看其中的表
mysql -ushell_rw -p'Idyq8_a1' maria -e "show tables"
二、基础实战:Shell 脚本实现 MySQL 增删查改
掌握了基础连接方式,我们就可以编写脚本,把 MySQL 的增、删、查、改操作串起来了。
1. 编写脚本 mysql_crud.sh
在 /data/script 目录下创建脚本文件,完整代码如下:
#!/bin/bash
# 设置MySQL连接信息(按需修改)
mysql_host='localhost'
mysql_user='shell_rw'
mysql_pass='Idyq8_a1'
mysql_db='maria'
# 1. 执行写入操作
echo "【写入数据】向products表插入apple记录"
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "insert into products (name,price) values ('apple',10.50)"
# 2. 执行查询操作
echo -e "\n【查询数据】查询apple记录"
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "select * from products where name='apple'"
# 3. 执行修改操作
echo -e "\n【修改数据】更新apple的价格为12.5"
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "update products set price=12.5 where name='apple'"
# 4. 执行删除操作
echo -e "\n【删除数据】删除apple记录"
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "delete from products where name='apple'"
2. 执行脚本
给脚本添加执行权限,然后运行即可看到完整的操作流程:
# 添加执行权限
chmod +x mysql_crud.sh
# 运行脚本
sh mysql_crud.sh

三、高效进阶:借助 AI 编写复杂运维脚本
日常工作中,我们会遇到更复杂的运维需求,手动编写脚本容易出错。这时借助 AI,只需给出清晰的提示词,就能快速生成高质量脚本,效率直接拉满!
下面给大家分享 4 个高频运维场景的脚本,都是我用 AI 生成并验证过的,直接拿走可用~
场景 1:导出 MySQL 活跃连接到日志文件
需求:编写脚本,查询 MySQL 8.0 活跃连接,并将结果导出到以 “processlist_当前时间” 命名的日志文件中。
脚本 mysql_processlist.sh:
bash
#!/bin/bash
# MySQL连接配置
USER="shell_rw"
PASSWORD="Idyq8_a1"
HOST="localhost"
PORT="3306"
# 获取当前时间并格式化(年-月-日-时-分-秒)
CURRENT_TIME=$(date +"%Y%m%d%H%M%S")
# 定义输出文件名
OUTPUT_FILE="processlist_${CURRENT_TIME}.log"
# 检查mysql客户端是否安装
if ! command -v mysql &> /dev/null; then
echo "❌ 错误: 未找到mysql客户端,请先安装!"
exit 1
fi
# 查询活跃连接并保存到文件
echo "📝 正在查询MySQL活跃连接,结果将保存到: ${OUTPUT_FILE}"
mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -e "SHOW FULL PROCESSLIST;" > "$OUTPUT_FILE" 2>/dev/null
# 检查执行结果
if [ $? -ne 0 ]; then
echo "❌ 错误: 连接MySQL失败或查询出错,请检查配置!"
exit 1
fi
echo "✅ 查询完成,活跃连接已导出至: ${OUTPUT_FILE}"

场景 2:批量查询多台 MySQL 服务器的指定参数
需求:ip.txt 中每行存放 MySQL 的 IP、用户名、密码(格式:IP, 用户名,密码),编写脚本,提示用户输入参数名,批量查询所有服务器的该参数值。
准备 ip.txt:
192.168.184.151,read_only,xxUagc8_6
192.168.184.152,read_only,dagdacag6
192.168.184.153,shell_rw,Idyq8_a1
脚本 query_mysql_variable.sh:
#!/bin/bash
# 检查ip.txt是否存在
if [ ! -f "ip.txt" ]; then
echo "❌ 错误: 当前目录下未找到ip.txt文件!"
exit 1
fi
# 提示用户输入要查询的变量名
read -p "请输入要查询的MySQL全局变量名: " VARIABLE_NAME
# 检查mysql客户端是否安装
if ! command -v mysql &> /dev/null; then
echo "❌ 错误: 未找到mysql客户端,请先安装!"
exit 1
fi
# 批量查询并输出结果
echo -e "\n🔍 正在查询所有MySQL服务器的变量: $VARIABLE_NAME"
echo "=========================================="
while IFS=',' read -r IP USERNAME PASSWORD; do
echo "📌 服务器 IP: $IP"
# 查询变量值,过滤掉表头
RESULT=$(mysql -h "$IP" -u "$USERNAME" -p"$PASSWORD" -e "SHOW GLOBAL VARIABLES LIKE '$VARIABLE_NAME';" 2>/dev/null | grep -v "Variable_name")
# 判读查询结果
if [ -z "$RESULT" ]; then
echo " ❌ 连接失败或变量不存在"
else
echo " ✅ $RESULT"
fi
echo "------------------------------------------"
done < ip.txt
echo "✅ 批量查询完成!"

场景 3:统计 10 秒内 MySQL 查询量与慢查询数
需求:编写脚本,统计 10 秒内 MySQL 的总查询次数和新增慢查询数量,基于 SHOW GLOBAL STATUS 实现。
脚本 mysql_stats_collector.sh:
#!/bin/bash
# MySQL连接参数(按需修改)
MYSQL_USER="shell_rw"
MYSQL_PASSWORD="Idyq8_a1"
# 检查mysql客户端是否安装
if ! command -v mysql &> /dev/null; then
echo "❌ 错误: 未找到mysql客户端,请先安装!"
exit 1
fi
# 获取起始时间,设置统计时长为10秒
START_TIME=$(date +%s)
DURATION=10
END_TIME=$((START_TIME + DURATION))
echo "⏱️ 正在统计${DURATION}秒内的MySQL运行指标,请稍候..."
# 获取初始指标值
QUERY_COUNT_START=$(mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW GLOBAL STATUS LIKE 'Questions'" | awk '{print $2}' | tail -n 1)
SLOW_QUERY_COUNT_START=$(mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT COUNT(*) FROM mysql.slow_log WHERE start_time >= NOW() - INTERVAL ${DURATION} SECOND" | awk 'NR==2')
# 等待统计时长结束
while [ $(date +%s) -lt $END_TIME ]; do
sleep 1
done
# 获取结束指标值
QUERY_COUNT_END=$(mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW GLOBAL STATUS LIKE 'Questions'" | awk '{print $2}' | tail -n 1)
SLOW_QUERY_COUNT_END=$(mysql -u $MYSQL_USER -p$MYSQL_PASSWORD -e "SELECT COUNT(*) FROM mysql.slow_log WHERE start_time >= NOW() - INTERVAL ${DURATION} SECOND" | awk 'NR==2')
# 计算增量
TOTAL_QUERIES=$((QUERY_COUNT_END - QUERY_COUNT_START))
NEW_SLOW_QUERIES=$((SLOW_QUERY_COUNT_END - SLOW_QUERY_COUNT_START))
# 输出统计结果
echo -e "\n📊 ${DURATION}秒内MySQL运行统计结果:"
echo "------------------------------------------"
echo "总查询次数: $TOTAL_QUERIES"
echo "新增慢查询数: $NEW_SLOW_QUERIES"
echo "------------------------------------------"

场景 4:统计指定数据库的表信息(容量 / 自增值 / 引擎)
需求:编写脚本,查询 information_schema.tables,统计指定数据库中所有表的预估容量、自增值和存储引擎,一键掌握库表概况。
脚本 mysql_tables_stats.sh:
#!/bin/bash
# MySQL连接配置
USER="shell_rw"
PASSWORD="Idyq8_a1"
HOST="localhost"
PORT="3306"
# 检查是否传入数据库名参数
if [ -z "$1" ]; then
echo "📌 用法: $0 <数据库名>"
exit 1
fi
DATABASE="$1"
# 检查mysql客户端是否安装
if ! command -v mysql &> /dev/null; then
echo "❌ 错误: 未找到mysql客户端,请先安装!"
exit 1
fi
# 检查数据库是否存在
DB_EXISTS=$(mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" -sN -e "SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name = '$DATABASE'")
if [ "$DB_EXISTS" -eq 0 ]; then
echo "❌ 错误: 数据库 '$DATABASE' 不存在!"
exit 1
fi
# 查询并格式化输出表信息
echo -e "\n📋 数据库 '$DATABASE' 表信息统计:"
echo "----------------------------------------------------------------"
echo -e "表名\t\t预估容量(MB)\t自增值\t\t存储引擎"
echo "----------------------------------------------------------------"
mysql -h "$HOST" -P "$PORT" -u "$USER" -p"$PASSWORD" --database="$DATABASE" -e "
SELECT
TABLE_NAME,
ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024, 2) AS DATA_SIZE_MB,
AUTO_INCREMENT,
ENGINE
FROM
information_schema.TABLES
WHERE
TABLE_SCHEMA = '$DATABASE'
ORDER BY
DATA_LENGTH DESC;
" 2>/dev/null | awk 'NR>1 {printf "%-16s %-16s %-16s %-10s\n", $1, $2, $3, $4}'
echo "----------------------------------------------------------------"
echo "✅ 表信息统计完成!"
使用方式:直接在脚本后跟上数据库名即可:
sh mysql_tables_stats.sh maria

四、写在最后
以上就是本次分享的全部内容啦!从基础的 Shell 操作 MySQL,到借助 AI 编写复杂的运维脚本,希望能帮大家摆脱重复的手动操作,提升工作效率。
这些脚本我都已经实际验证过,大家可以根据自己的业务场景稍作修改就能使用。后续我还会分享更多 Java 源码解读、MySQL 优化、Linux 运维的干货内容,记得持续关注哦!
如果这篇文章对你有帮助,欢迎点赞、在看、转发给身边的小伙伴~ 有任何问题,也可以在评论区留言交流!
我是云扬,我们下期再见 👋
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)