哈喽,各位后端小伙伴们,我是云扬~

作为一名常年和 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 运维的干货内容,记得持续关注哦!

如果这篇文章对你有帮助,欢迎点赞、在看、转发给身边的小伙伴~ 有任何问题,也可以在评论区留言交流!

我是云扬,我们下期再见 👋

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐