本文目录导读:

是的,实用脚本完全可以自动管理MySQL数据库,通过编写Shell脚本、Python脚本或使用自动化工具,可以实现数据库的日常运维、监控、备份、优化等任务。
常见自动化管理场景
自动备份脚本
#!/bin/bash
# MySQL自动备份脚本
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_$DATE.sql.gz
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup completed: ${DB_NAME}_$DATE.sql.gz"
自动健康检查脚本
#!/usr/bin/env python3
import pymysql
import smtplib
from email.mime.text import MIMEText
def check_mysql_health():
try:
conn = pymysql.connect(
host='localhost',
user='monitor',
password='password',
database='mysql'
)
cursor = conn.cursor()
# 检查连接数
cursor.execute("SHOW STATUS LIKE 'Threads_connected'")
connections = cursor.fetchone()
# 检查慢查询
cursor.execute("SHOW GLOBAL STATUS LIKE 'Slow_queries'")
slow_queries = cursor.fetchone()
# 检查主从复制状态
cursor.execute("SHOW SLAVE STATUS\G")
slave_status = cursor.fetchone()
if connections[1] > 200: # 连接数超过200告警
send_alert(f"High connections: {connections[1]}")
if slave_status and slave_status[10] != 'Yes':
send_alert("Replication broken!")
conn.close()
return True
except Exception as e:
send_alert(f"MySQL connection failed: {str(e)}")
return False
def send_alert(message):
msg = MIMEText(message)
msg['Subject'] = 'MySQL Health Alert'
msg['From'] = 'monitor@example.com'
msg['To'] = 'admin@example.com'
with smtplib.SMTP('smtp.example.com') as server:
server.send_message(msg)
if __name__ == "__main__":
check_mysql_health()
自动优化脚本
#!/bin/bash
# 自动优化数据库表
DB_USER="root"
DB_PASS="password"
EXCLUDE_TABLES="system_logs|audit_trails" # 排除大表
# 获取所有数据库
databases=$(mysql -u$DB_USER -p$DB_PASS -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
for db in $databases; do
echo "Optimizing database: $db"
# 获取需要优化的表
tables=$(mysql -u$DB_USER -p$DB_PASS $db -e "SHOW TABLE STATUS WHERE Data_free > 0;" | grep -v "TABLE_NAME" | awk '{print $1}')
for table in $tables; do
if [[ ! $table =~ $EXCLUDE_TABLES ]]; then
echo " Optimizing table: $table"
mysql -u$DB_USER -p$DB_PASS $db -e "OPTIMIZE TABLE $table;"
fi
done
done
自动化调度(Crontab配置)
# 每天凌晨2点备份 0 2 * * * /path/to/backup_script.sh # 每5分钟健康检查 */5 * * * * /path/to/health_check.sh # 每周日凌晨3点优化表 0 3 * * 0 /path/to/optimize_script.sh # 每天清理临时数据 0 4 * * * /path/to/cleanup_script.sh
高级自动化方案
Ansible自动化部署
# ansible-mysql.yml
---
- name: MySQL自动化管理
hosts: database_servers
tasks:
- name: 安装MySQL
apt:
name: mysql-server
state: present
- name: 配置MySQL
template:
src: my.cnf.j2
dest: /etc/mysql/my.cnf
- name: 创建备份用户
mysql_user:
name: backup_user
password: "{{ backup_password }}"
priv: '*.*:SELECT,RELOAD,LOCK TABLES,SHOW VIEW'
state: present
- name: 设置定时备份
cron:
name: "MySQL备份"
minute: "0"
hour: "2"
job: "/usr/local/bin/mysql_backup.sh"
使用监控工具
- Prometheus + Grafana:实时监控数据库性能
- Zabbix:企业级监控告警系统
- Percona Monitoring and Management:专门针对MySQL的监控工具
最佳实践建议
-
安全性:
- 使用专门的管理账号,限制权限
- 密码存储在配置文件或密钥管理系统中
- 脚本文件设置600权限
-
日志记录:
- 记录所有自动操作的日志
- 设置日志轮转避免磁盘满
-
测试验证:
- 先在测试环境运行
- 备份恢复演练
- 监控告警测试
-
异常处理:
- 添加错误处理机制
- 失败时发送告警
- 设置重试机制
通过合理的脚本编写和调度,可以大大提高MySQL数据库的管理效率,减少人工干预和人为错误。