监控性能
查看当前连接数和慢查询:
#!/bin/bash
# 查看当前连接数
CONNECTIONS=$(mysql -u root -p'your_password' -e "SHOW STATUS LIKE 'Threads_connected';" | grep Threads_connected | awk '{print $2}')
echo "当前连接数:$CONNECTIONS"
# 查看慢查询
SLOW_QUERIES=$(mysql -u root -p'your_password' -e "SHOW VARIABLES LIKE 'slow_query_log';" | grep slow_query_log | awk '{print $2}')
if [ "$SLOW_QUERIES" == "ON" ]; then
echo "慢查询已开启,请检查日志!"
else
echo "慢查询未开启。"
fi
自动化清理
数据库运行久了,难免会产生大量日志和临时数据。定期清理是必不可少的。比如,清理超过7天的二进制日志:
#!/bin/bash
# 清理7天前的二进制日志
mysql -u root -p'your_password' -e "PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);"
echo "已清理7天前的二进制日志。"
用户管理
管理数据库用户权限是运维的常见任务。通过脚本可以批量创建用户或修改权限。比如,创建一个只读用户:
这个脚本可以快速完成用户管理,减少手动操作的繁琐
#!/bin/bash
# 创建只读用户
USER="readonly_user"
PASSWORD="secure_password"
DATABASE="your_database"
mysql -u root -p'your_password' -e "CREATE USER '$USER'@'localhost' IDENTIFIED BY '$PASSWORD';"
mysql -u root -p'your_password' -e "GRANT SELECT ON $DATABASE.* TO '$USER'@'localhost';"
mysql -u root -p'your_password' -e "FLUSH PRIVILEGES;"
echo "只读用户 $USER 创建成功!"
日志分析
MySQL的日志文件包含了大量有价值的信息,但手动分析费时费力。通过脚本可以快速提取关键信息。比如,分析错误日志中的常见问题:
#!/bin/bash
# 分析MySQL错误日志
LOG_FILE="/var/log/mysql/error.log"
ERRORS=$(grep -i "error" $LOG_FILE | wc -l)
echo "错误日志中发现了 $ERRORS 条错误记录。"
表优化
随着数据量的增加,数据库表可能会变得臃肿,影响查询性能。通过脚本可以定期优化表
#!/bin/bash
# 优化所有表
DATABASE="your_database"
TABLES=$(mysql -u root -p'your_password' -e "SHOW TABLES FROM $DATABASE;" | grep -v "Tables_in")
for TABLE in $TABLES; do
mysql -u root -p'your_password' -e "OPTIMIZE TABLE $DATABASE.$TABLE;"
echo "优化表 $TABLE 完成!"
done
主从同步监控
在主从复制环境中,监控同步状态非常重要。以下脚本可以检查主从同步是否正常:
#!/bin/bash
# 检查主从同步状态
SLAVE_STATUS=$(mysql -u root -p'your_password' -e "SHOW SLAVE STATUS\G" | grep "Seconds_Behind_Master")
if [ -z "$SLAVE_STATUS" ]; then
echo "主从同步未启用或配置错误!"
else
echo "主从同步状态:$SLAVE_STATUS"
fi
死锁检测
死锁是数据库运行中的常见问题,可能导致业务中断。通过脚本可以定期检测并解决死锁
#!/bin/bash
# 检测死锁
DEADLOCKS=$(mysql -u root -p'your_password' -e "SHOW ENGINE INNODB STATUS\G" | grep "LATEST DETECTED DEADLOCK")
if [ -n "$DEADLOCKS" ]; then
echo "检测到死锁:$DEADLOCKS"
else
echo "未检测到死锁。"
fi
自动扩容
在高并发场景下,数据库可能需要动态扩容。以下脚本可以根据负载自动调整连接数:
#!/bin/bash
# 动态调整最大连接数
MAX_CONNECTIONS=$(mysql -u root -p'your_password' -e "SHOW VARIABLES LIKE 'max_connections';" | grep max_connections | awk '{print $2}')
CURRENT_CONNECTIONS=$(mysql -u root -p'your_password' -e "SHOW STATUS LIKE 'Threads_connected';" | grep Threads_connected | awk '{print $2}')
if [ $CURRENT_CONNECTIONS -gt $((MAX_CONNECTIONS * 80 / 100)) ]; then
mysql -u root -p'your_password' -e "SET GLOBAL max_connections = $((MAX_CONNECTIONS + 50));"
echo "最大连接数已调整为 $((MAX_CONNECTIONS + 50))。"
fi
数据一致性检查
在分布式环境中,数据一致性是一个重要问题。以下脚本可以检查主从数据库的数据是否一致:
这个脚本可以帮助你确保数据的完整性和一致性。
#!/bin/bash
# 检查主从数据一致性
MASTER_DATA=$(mysql -u root -p'your_password' -e "SELECT COUNT(*) FROM your_table;" -h master_host)
SLAVE_DATA=$(mysql -u root -p'your_password' -e "SELECT COUNT(*) FROM your_table;" -h slave_host)
if [ "$MASTER_DATA" == "$SLAVE_DATA" ]; then
echo "主从数据一致。"
else
echo "主从数据不一致!"
fi