一、创建测试用户和测试表
CREATE USER 'shell_rw'@'%' IDENTIFIED BY 'admin';
GRANT create,alter,insert,delete,select,update,show view ON *.* TO 'shell_rw'@'%';
create database test;
use test;
CREATE TABLE products (
id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
price decimal(10, 2) NOT NULL,
PRIMARY KEY (id)
);
插入数据
INSERT INTO products (name, price) VALUES
('Laptop Computer', 4599.00),
('Smartphone', 2999.00),
('Bluetooth Headphones', 399.50),
('Smart Watch', 1299.00),
('Electric Toothbrush', 199.00),
('Coffee Maker', 599.00),
('Air Fryer', 699.00),
('Wireless Charger', 149.00),
('Mechanical Keyboard', 799.00),
('Portable Hard Drive', 899.00);
二、通过linux命令行连接MySQL
1、查询数据库列表
mysql -ushell_rw -p'admin' -e "show databases"
2、查询一个库中所有的表
mysql -ushell_rw -p'admin' test-e "show tables"
3、查询一张表的数据
mysql -ushell_rw -p'admin' test -e "select * from products"
三、在shell脚本里对MySQL数据进行增删改查
#!/bin/bash
# 设置MySQL连接信息
mysql_host='localhost'
mysql_user='shell_rw'
mysql_pass='admin'
mysql_db='test'
# 执行写入操作
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "insert into products (name,price) values ('apple',10.50)"
# 查询数据
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "select * from products where name='apple'"
# 修改数据
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "update products set price=12.5 where name='apple'"
# 删除数据
mysql -h"$mysql_host" -u"$mysql_user" -p"$mysql_pass" $mysql_db -e "delete from products where name='apple'"
四、使用AI工具生成MySQL的脚本
1、shell连接MySQL的脚步
提问词:
编写一个Shel脚本,查询MySQL8.0当前活跃连接,并导入到当前路径下的文件下,文件名是processist 当前时间.log,比如processist_2025_0303_20_08.log
生成的脚步如下:
cd /root/
vim export_processlist.sh
#!/bin/bash
# 设置数据库连接参数(建议通过配置文件或安全方式存储密码)
MYSQL_USER="root"
MYSQL_HOST="localhost"
export MYSQL_PWD="admin" # 通过环境变量传递密码避免安全警告
# 生成带时间戳的文件名(格式:processlist_YYYY_MM_DD_HH_MM.log )
current_time=$(date +%Y_%m_%d_%H_%M)
output_file="processlist_${current_time}.log"
# 执行活跃连接查询(过滤Sleep状态连接)
mysql -h $MYSQL_HOST -u $MYSQL_USER --batch -e \
"SELECT * FROM information_schema.processlist WHERE COMMAND != 'Sleep' AND INFO IS NOT NULL;" > $output_file 2>/dev/null
# 结果处理
if [ $? -eq 0 ]; then
echo "导出成功!文件路径:$(pwd)/${output_file}"
echo "活跃连接数:$(grep -v '^ID' $output_file | wc -l)"
else
echo "导出失败,请检查:"
echo "1. MySQL服务状态 2. 用户权限 3. 连接参数配置"
fi
执行脚本
cat processlist_2025_03_03_20_31.log
2、MySQL参数查询的脚本
提问词:
ip.txt中,每一行存放MySQL的IP地址、用户名和密码,形式如下:
192.168.5.129,root,admin
192.168.5.130,root,admin
请编写一个shel脚本,提示我们输入变量名,就可以把所有MySQL的IP,这个变量和变量在MySQL中对应的值展示出来
生成的脚本如下:
cd /root
vim query_mysql_var.sh
#!/bin/bash
# 功能:批量查询MySQL服务器指定变量的值
# 使用方式:./query_mysql_var.sh
# 检查ip.txt 文件是否存在
if [ ! -f "ip.txt" ]; then
echo -e "\033[31m错误:ip.txt 文件不存在!\033[0m"
exit 1
fi
# 获取用户输入的变量名
read -p "请输入要查询的MySQL变量名称:" variable_name
# 逐行读取ip.txt 文件
while IFS=',' read -r ip username password; do
echo -e "\n\033[34m正在查询服务器:$ip\033[0m"
# 执行MySQL查询命令
result=$(mysql -h "$ip" -u "$username" -p"$password" --silent --skip-column-names -e "SHOW VARIABLES LIKE '$variable_name';" 2>/dev/null)
# 检查查询结果
if [ $? -eq 0 ]; then
if [ -n "$result" ]; then
variable_value=$(echo "$result" | awk '{print $2}')
echo -e "[\033[32m成功\033[0m] $variable_name = \033[33m$variable_value\033[0m"
else
echo -e "[\033[33m警告\033[0m] 未找到变量:$variable_name"
fi
else
echo -e "[\033[31m失败\033[0m] 无法连接MySQL服务器或认证失败"
fi
done < ip.txt
测试脚本
ip.txt内容如下:
192.168.15.129,root,admin
192.168.15.129,root,admin
新增远程连接权限,
use mysql;
update user set host='%' where user='root';
flush privileges;
不然会遇到下面的问题
3、统计MySQL信息的shell脚本
提问词
编辑-个Shell脚本
脚本运行10秒,
统计10秒前后MySQL8.0的查询次数(Queries的变化)
以及这10秒产生的慢查询数量(Slow_queries的变化)
要注意这些值,都是在执行 SHOW GLOBAL STATUS like xxx,之后的第二行,需要过滤出来
用户名和密码在脚本前面定义,后面通过用户名密码的变量来连接MySQL
cd /root/
vim query_mysql_info
#!/bin/bash
# MySQL连接信息
username="shell_rw"
password="admin"
# 获取初始查询次数和慢查询数量
initial_queries=$(mysql -u$username -p$password -e "SHOW GLOBAL STATUS LIKE 'Queries';" | awk 'NR==2 {print $2}')
initial_slow_queries=$(mysql -u$username -p$password -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';" | awk 'NR==2 {print $2}')
#等待10秒
sleep 10
#获取最终查询次数和慢查询数量
final_queries=$(mysql -u$username -p$password -e "SHOW GLOBAL STATUS LIKE 'Queries';" | awk 'NR==2 {print $2}')
final_slow_queries=$(mysql -u$username -p$password -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';" | awk 'NR==2 {print $2}')
#计算查询次数和慢查询数量的变化
queries_diff=$((final_queries - initial_queries))
slow_queries_diff=$((final_slow_queries - initial_slow_queries))
#输出结果
echo "查询次数变化:$queries_diff"
echo "慢查询数量变化:$slow_queries_diff"
执行脚本
sh sh query_mysql_info.sh
同时开一个窗口,制造慢查询语句。
mysql -ushell_rw -padmin
select sleep(2);
select sleep(2);
select sleep(2);
4、业务表统计信息
提示词
编辑一个Shell脚本
查询information_schema.tables 统计某个库所有表的预估数据量
自增值
存储引擎
每一行展示一张表的信息
cd /root/
vim mysql_table_info.sh
#!/bin/bash
# 功能:统计指定库所有表的预估数据量、自增值、存储引擎
# 用法:./table_stats.sh [数据库名]
# 检查参数
if [ $# -ne 1 ]; then
echo "用法:$0 [数据库名]"
exit 1
fi
# MySQL连接配置(按需修改)
host="localhost"
port="3306"
user="root"
password="admin"
dbname="$1"
# 执行SQL查询
mysql -h"$host" -P"$port" -u"$user" -p"$password" --vertical <<EOF | awk 'NR>1'
SELECT
TABLE_NAME AS '表名',
TABLE_ROWS AS '预估数据量',
AUTO_INCREMENT AS '自增值',
ENGINE AS '存储引擎'
FROM information_schema.tables
WHERE TABLE_SCHEMA = '$dbname'
ORDER BY TABLE_NAME;
EOF
测试脚本
sh mysql_table_info.sh test