一键自动化MySQL备份核心是安全导出、按时间归档、自动删旧;需配置低权限备份用户、~/.my.cnf认证、编写含压缩/命名/清理逻辑的脚本,并用cron定时执行,辅以磁盘检查、备份校验和flock防并发等健壮性措施。

编写一键自动化备份MySQL数据库并定时清理过期数据,核心是三件事:安全导出、按时间归档、自动删旧。关键不在于写多复杂的脚本,而在于权限、路径、时间逻辑和容错处理要到位。
准备备份环境与权限配置
备份脚本需要能无密码登录MySQL(但不能用root明文密码),推荐用~/.my.cnf配置专用账号:
- 创建低权限备份用户(只读+LOCK TABLES):
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'StrongPass123!';<br>GRANT SELECT, LOCK TABLES, SHOW VIEW ON *.* TO 'backup'@'localhost';<br>FLUSH PRIVILEGES;
- 在
/root/.my.cnf中写入认证信息(600权限):[client]<br>user=backup<br>password=StrongPass123!<br>host=localhost
- 确认mysqldump可用且版本兼容(建议5.7+或8.0,注意8.0默认启用
--set-gtid-purged=OFF需显式关闭)
编写可执行的备份脚本(含压缩与命名规范)
脚本保存为/usr/local/bin/backup_mysql.sh,支持指定库名、保留天数、备份目录:
#!/bin/bash
DB_NAME="${1:-all}" # 默认备份所有库
RETAIN_DAYS="${2:-7}" # 默认保留7天
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mysql_backup.log"
<p>mkdir -p "$BACKUP_DIR"</p><p>if [ "$DB_NAME" = "all" ]; then
DB_LIST=$(mysql -Nse "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME NOT IN ('information_schema','performance_schema','mysql','sys')")
for db in $DB_LIST; do
mysqldump --single-transaction --routines --events "$db" | gzip > "$BACKUP<em>DIR/${db}</em>${DATE}.sql.gz"
done
else
mysqldump --single-transaction --routines --events "$DB_NAME" | gzip > "$BACKUP_DIR/${DB<em>NAME}</em>${DATE}.sql.gz"
fi</p><h1>记录日志</h1><p>echo "[$(date)] Backup finished: $(ls -lh $BACKUP_DIR/*${DATE}.sql.gz 2>/dev/null | wc -l) files" >> "$LOG_FILE"</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill2334" title="MySQL"><img
src="https://img.php.cn/upload/skill/000/000/081/178900927846657.jpg" alt="MySQL" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill2334" title="MySQL">MySQL</a>
<p>编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。</p>
</div>
<a href="/xiazai/skill2334" title="MySQL" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>清理过期备份(保留RETAIN_DAYS天)</h1><p>find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETAIN_DAYS -delete
赋予执行权限:chmod +x /usr/local/bin/backup_mysql.sh
用cron实现定时调度(每天凌晨2点执行)
编辑root crontab:sudo crontab -e,添加一行:
0 2 * * * /usr/local/bin/backup_mysql.sh all 7 >> /var/log/mysql_cron.log 2>&1
说明:
-
all表示备份全部数据库;也可写wordpress只备单库 -
7表示保留最近7天的备份文件(-mtime +7删除8天前的) - 输出重定向确保错误可查,避免邮件轰炸
增强健壮性的几个实用技巧
生产环境建议加这些“保险”:
-
备份前检查磁盘空间:在脚本开头加
df -h "$BACKUP_DIR" | awk 'NR==2 {if ($5 > 90) { print "WARN: Disk usage >90%"; exit 1 }}' -
校验备份完整性:备份后解压头10行验证:
gzip -t "$BACKUP_DIR/${db}_${DATE}.sql.gz" &>/dev/null || { echo "Corrupt backup!"; exit 1; } -
防止并发冲突:用
flock避免多个备份同时跑:flock -n /tmp/mysql_backup.lock -c '/usr/local/bin/backup_mysql.sh all 7' -
异地同步可选:备份完成后用rsync推送到另一台机器:
rsync -a --delete "$BACKUP_DIR/" user@backup-server:/backup/mysql/
不复杂但容易忽略:每次改完脚本先手动运行一次,检查生成文件、日志、磁盘空间和清理行为是否符合预期,再交给cron。

















