在 CentOS 7 中为 MySQL 设置定时任务备份所有数据库 ,可通过mysqldump全量备份 +crond定时任务实现,兼顾安全性和自动化。以下是详细步骤:
一、准备工作
1. 确认 MySQL 客户端工具
确保已安装mysqldump(MySQL 备份工具),若未安装,执行:
# 针对MySQL官方源安装的版本
sudo yum install mysql-community-client -y
# 针对Mariadb(CentOS 7默认可能预装)
sudo yum install mariadb-server -y # 包含mysqldump
2. 创建 MySQL 备份专用账号
为避免使用root账号,创建仅用于备份的账号(需全局权限,因为要备份所有库):
-- 登录MySQL
mysql -u root -p
-- 创建备份账号(仅允许本地访问)
CREATE USER 'backup_all'@'localhost' IDENTIFIED BY 'Strong@Backup123'; # 密码复杂度要高
-- 授予备份所有数据库的权限
GRANT SELECT, LOCK TABLES, SHOW VIEW, RELOAD, REPLICATION CLIENT ON *.* TO 'backup_all'@'localhost';
FLUSH PRIVILEGES;
exit;
3. 准备备份目录
选择磁盘空间充足的路径(如/data/mysql_backups),并设置权限:
# 创建备份目录
sudo mkdir -p /data/mysql_backups
# 授予MySQL或执行脚本的用户写入权限(此处以当前用户为例)
sudo chown $USER:$USER /data/mysql_backups
二、编写备份脚本(备份所有数据库)
创建脚本/usr/local/scripts/backup_all_mysql.sh,实现全量备份、压缩、日志记录、旧文件清理:
#!/bin/bash
# 备份所有MySQL数据库的脚本(CentOS 7)
# ==== 配置参数 ====
BACKUP_USER="backup_all" # 备份账号
BACKUP_PASS="Strong@Backup123" # 备份密码(后续会用配置文件隐藏,此处仅临时用)
BACKUP_DIR="/data/mysql_backups"# 备份目录
LOG_FILE="${BACKUP_DIR}/backup_all.log" # 日志文件
RETENTION_DAYS=15 # 备份保留15天(按需调整)
DATE=$(date +%Y%m%d_%H%M%S) # 时间戳(格式:年月日_时分秒)
MYSQL_CONF="$HOME/.my.cnf" # 用于隐藏密码的配置文件路径
# ==== 1. 初始化:检查目录、创建密码配置文件 ====
# 确保备份目录存在
if [ ! -d "${BACKUP_DIR}" ]; then
mkdir -p "${BACKUP_DIR}"
echo "[$DATE] 备份目录不存在,已创建:${BACKUP_DIR}" >> "${LOG_FILE}"
fi
# 创建.my.cnf隐藏密码(避免脚本明文暴露密码,权限必须600)
if [ ! -f "${MYSQL_CONF}" ]; then
cat > "${MYSQL_CONF}" << EOF
[mysqldump]
user=${BACKUP_USER}
password=${BACKUP_PASS}
EOF
chmod 600 "${MYSQL_CONF}" # 关键:限制权限,仅当前用户可读写
echo "[$DATE] 创建密码配置文件:${MYSQL_CONF}" >> "${LOG_FILE}"
fi
# 检查备份目录所在磁盘的可用空间(低于20%时告警)
DISK_USAGE=$(df -h "${BACKUP_DIR}" | awk 'NR==2 {print $5}' | sed 's/%//')
if [ ${DISK_USAGE} -ge 80 ]; then
echo "[$DATE] 警告:磁盘空间不足!当前使用率${DISK_USAGE}%,停止备份" >> "${LOG_FILE}"
exit 1
fi
# ==== 2. 执行全量备份(所有数据库) ====
BACKUP_FILE="${BACKUP_DIR}/all_dbs_${DATE}.sql.gz" # 备份文件名(含所有库+时间戳)
echo "[$DATE] 开始备份所有数据库..." >> "${LOG_FILE}"
# 使用mysqldump备份所有库,--all-databases表示全量,--defaults-extra-file指定密码配置
mysqldump --defaults-extra-file="${MYSQL_CONF}" --all-databases --single-transaction --quick --events | gzip > "${BACKUP_FILE}"
# 检查备份是否成功($?为0表示成功)
if [ $? -eq 0 ]; then
echo "[$DATE] 全量备份成功!文件:${BACKUP_FILE}(大小:$(du -sh ${BACKUP_FILE} | awk '{print $1}'))" >> "${LOG_FILE}"
else
echo "[$DATE] 备份失败!请检查账号密码、MySQL服务状态" >> "${LOG_FILE}"
exit 1 # 备份失败时退出,便于后续告警
fi
# ==== 3. 清理旧备份(保留最近15天) ====
echo "[$DATE] 开始清理${RETENTION_DAYS}天前的备份文件..." >> "${LOG_FILE}"
# 仅删除以"all_dbs_"开头的备份文件,避免误删其他文件
find "${BACKUP_DIR}" -name "all_dbs_*.sql.gz" -type f -mtime +${RETENTION_DAYS} -delete
if [ $? -eq 0 ]; then
echo "[$DATE] 旧文件清理完成,保留最近${RETENTION_DAYS}天备份" >> "${LOG_FILE}"
else
echo "[$DATE] 旧文件清理失败!" >> "${LOG_FILE}"
fi
三、脚本权限与测试
1. 赋予执行权限
# 给脚本添加可执行权限
chmod +x /usr/local/scripts/backup_all_mysql.sh
2. 手动测试脚本
执行脚本,检查是否生成备份文件和日志:
/usr/local/scripts/backup_all_mysql.sh
# 检查结果
ls -lh /data/mysql_backups # 应有all_dbs_xxx.sql.gz文件
cat /data/mysql_backups/backup_all.log # 日志应显示"备份成功"
四、配置 crontab 定时任务
通过 CentOS 7 的crond服务设置定时执行(如每天凌晨 1 点备份,避开业务高峰)。
1. 编辑定时任务
crontab -e # 打开当前用户的crontab配置(若需用root执行,加sudo)
2. 添加定时规则
在打开的文件中添加:
# 每天凌晨1点执行全量备份,输出日志到系统日志(便于排查)
0 1 * * * /usr/local/scripts/backup_all_mysql.sh >> /var/log/mysql_backup_cron.log 2>&1
- 规则说明:
0 1 * * *表示 "每天 1 点 0 分执行";2>&1表示将错误输出也写入日志。
3. 重启 crond 服务
确保定时任务生效:
sudo systemctl restart crond # 重启服务
sudo systemctl enable crond # 设置开机自启(默认已启用)
五、关键优化与验证
1. 备份验证(避免备份文件损坏)
每周手动验证一次备份文件的有效性:
# 解压备份文件(若文件大,可只看前几行)
gunzip -c /data/mysql_backups/all_dbs_20240520_010000.sql.gz | head -n 100
# 或恢复到测试库(需先创建测试库test_restore)
gunzip -c /data/mysql_backups/all_dbs_20240520_010000.sql.gz | mysql -u root -p test_restore
2. 错误告警(可选)
若备份失败,可通过邮件通知(需安装mailx):
# 安装邮件工具
sudo yum install mailx -y
# 配置邮件服务器(如用163邮箱,需开启SMTP)
echo "set from=your_email@163.com smtp=smtp.163.com smtp-auth-user=your_email@163.com smtp-auth-password=your_auth_code smtp-auth=login" >> /etc/mail.rc
# 在脚本"备份失败"处添加邮件发送
echo "[$DATE] MySQL全量备份失败!详情见日志:${LOG_FILE}" | mail -s "MySQL备份失败告警" admin@example.com
六、常见问题排查
- 备份文件为空 :检查
mysqldump是否正确安装、备份账号权限是否足够(尤其是REPLICATION CLIENT权限)。 - crontab 不执行 :检查脚本路径是否绝对路径、脚本是否有执行权限、
/var/log/mysql_backup_cron.log是否有错误日志。 - 密码包含特殊字符 :通过
.my.cnf配置文件可避免特殊字符导致的脚本解析错误(已在脚本中处理)。
通过以上步骤,即可在 CentOS 7 上实现 MySQL 所有数据库的自动化定时备份,确保数据安全可恢复。